• Welcome to LusoRobótica - Robótica em Português.
 

Projecto alarme para Casa

Started by dio123, 20 de February de 2012, 13:25

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

tarquinio

#105
Um detalhe a ver é que as variáveis para guardarem os millis() tem de ser unsigned long, e não apenas long. Isto dá problemas em sketches que fiquem a correr muito tempo (quando os valores deixam de caber num long).

Tentei dar uma olhadela no código mas parece-me que complicaste a coisa... Tens uma máquina de estados com um monte de variáveis, acho que a coisa ficava bem mais simples e fácil de entender usando menos variáveis e enumerações ou defines para marcar os estados. Algo do tipo:

#define ALARME_DESARMADO 0
#define ALARME_ARMADO 1
#define ALARME_A_TOCAR 2
#define ...................

byte estado = ALARME_DESARMADO;

void loop()
{
    if (estado == ALARME_DESARMADO)
    {
        // Fazer cenas aqui...
    }
    if (estado == ALARME_ARMADO)
    {
        // Fazer cenas aqui...
    }
    ..................................
}


Tens variaveis tipo sensor, x, r, p, torna-se confuso perceber o que cada uma delas faz e exactamente em que posto está o sistema...

E estas por exemplo:

  unsigned long currentMillis = millis();
  agora  = millis();


que estão claramente em duplicado... :p

dio123

Desde  já agradeço,

Tive a tentar melhorar o codigo torna-lo mais simples, mas mesmo assim nao ficou nao limpo como pensei, mas está mais organizado.
O que está acontecer é que nem sempre o codigo apanha o sinal a ser recebido.  Mas é quando o led está a mudar de estado. 
Torna-se uma questão de sorte de acertar e  o arduino ler o sinal recebido.

Exprimentei tirar a a parte do led a piscar e ai já funciona bem, pelo menos  nao falhou uma unica leitura.

Deixo aqui o novo codigo.

dio123

O problema já mesmo no piscar o led.
O alarme é armado e desarmado na perfeição quando uso Serial.println(" "); para simular que a sirene está a tocar. E recebo os 3 sinais para desarmar o alarme.

O problema está quando tiro Serial.println e coloco o exemplo  blink without delay ai nem sempre o alarme desarma e é raro  receber os 3 sinais para desarmar o alarme.
A pouco encontrei blink com timer e experimentei, e parece funcionar, pelo menos ai não falhou nenhuma vez, mas também nem sempre recebo os 3 sinais para desarmar o sinal. 

Como posso resolver o problema?

Agradeço.



tarquinio

Eu tentaria fazer a coisa ainda com mais estados e menos variáveis. Por exemplo tens estas:

byte recebeu = 0;
byte estado = 0;
byte estado_sensor = 0;
int sensor = 0; // sensor
int p = 0; // variavel para o if


Acho que podias combinar várias destas variáveis apenas numa e acrescentar mais estados. ECom muitas variáveis acabas por te perder um bocado e depois às vezes há variáveis que uma pessoa já nem sabe bem o que faz.

Por exemplo isto:

sensor = 0; // apagar movimentos do sensor

não esta a ser usado para nada.

A variável "recebeu" é o que é lido do input, e depois está a ver usada uma data de vezes em vários testes pelo código... Eu teria visto logo que valor é que ela tem, e passado do estado X para o estado Y, se fosse caso disso. E provávelmente a mesma coisa para o "estado_sensor".

dio123

Estive a melhorar o código , está em anexo para ver.
Descobri que o problema pode estar na sirene.
O circuito é este: http://cl.ly/image/1D0j16281N25/Untitled.png

Testei com um led em vez da sirene e recebo sempre os 4 códigos para desarmar o alarme.
Depois liguei a sirene e nem sempre desarma o alarme, e quando desarma só recebo um código.

Tou alimentar com um transformador 9v 1A.  Apesar de a sirene ser 12v a 9v já faz um barulhão desgraçado.

Será  que o problema está na alimentação?


Agradeço desde já pela ajuda.

tarquinio

Pois se o mesmo programa faz coisas diferentes consoante tens ligado um led ou uma sirene, então o problema pode vir daí. Se a sireme puxar muita corrente e baixar a tensão no arduino, podem acontecer cenas esquisitas... N sabes quanto é que a sierene gasta?

dio123

No auto-colante a sirene é de 20w 12v =  dá +/- 1.6 amperes.
O transformador é dos ajustaveis 1A, e estou alimentar o circuito com 9v.

Tenho de confirmar novamente o consumo da sirene a 9v. Mas tinha ideia que quando medi era - 800ma.
O Transformador nao consegue dar perto de 1A. Provavel, apesar do transformador nao ser do chineses.

A sirene ao tocar, confirmei que há uma queda de  tensão, essa queda pode ser suficiente para o receptor nao apanhar o sinal como deve de ser.

Tenho testar o consumo da sirene ou limitar o consumo , ou comprar um transformador com maior amperagem.

senso

E mediste esses 800mA com quê?
Devia ser com um osciloscópio..
Avr fanboy