Componentes:
1 - Motor de Passo
2 - Leds;
3 - Push Button
4 - Arduino Uno
5 - Icomsat 1.1 SIM900
As funções do programas:
1 - Envio um sms e o motor de passo e acionado com o led amarelo, recebo o sms de confirmação;
2 - Envio um sms e o motor de passo e acionado com o led verde, recebo um sms de confirmação;
3 - Aperto o push button e recebo um SMS informando o seu acionamento.
Comecei a escreve o código somente para acender e apagar um led, procurei ajuda na net incrementei meu código mais ainda nada.
Coloquei os jumpers do shield em rx 4 e tx 5
Alguém pode me ajudar a descobrir meu erro? Será que estou seguindo o caminho certo?
Código:
Tentei colocar o código mais sempre utrapassa o limite, por isso vai em anexo.
Desde de já agradeço muito a ajuda
Se invocas o comando para ler a sms com o AT+CMGR=1 logo apos ele, o modem devolve te para a porta Serie o corpo da SMS que ira ser carregada no Buffer a espera de ser descarregado.O teu problema penso que seja logo a seguir quando corres o gsm.flush !! Sabes o que o flush faz?
Limpa o buffer
Logo nada depois sera lido
Flush
The new library supports the flush() method, which works the same way that HardwareSerial’s flush() does.
void flush(); // discard the contents of the RX buffer.
Posso estar errado mas ...
Depois podes explicar o que pretendes fazer neste ciclo if?
Ele recebe uma SMS, armazena essa SMS em uma String, retira o código da string e ativa um led basicamente e isso. Agora eu queria fazer o caminho inverso. Exemplo: Ativar um sensor através de uma SMS e se esse sensor fosse ativado eu receberia uma SMS.
A parte de mandar a SMS e ligar ou desligar um led ja funciona com o código acima.
Compreendo a parte do sensor, mas eu posso colocar um pino em HIGH ou em LOW para fornecer ou não voltagem para um sensor?
O problema em si seria esse, como inserir um interrupção para depois que um determinado pino fosse ativado(assim ligando o sensor( Um sensor pir ou mesmo um PUSH BUTTON) em recebesse um SMS avisando que isso aconceu?
Depende de quanto o sensor consome. Diria que para a maior parte dos sensores que se usam com breadboard isso pode ser feito na boa, senão é adicionar um transistor. Mas porque quererias fazer isso? O projecto funciona a pilhas? Estás ciente que os sensores podem ter tempos de arranque até darem dados fiáveis?
Assim de repente...
const int pino_SMS = XXXX; //mete tu o pino...
....
loop() {
if (HIGH == digitalWrite(pino_SMS)) { //escolhe a polaridade do botão aqui...
//se botão ou sensor activado...
gsm.println("AT+CMGS=939393933\nACTIVADO");
gsm.print(0x1a); // isto é equivalente ao Ctrl + Z
}
}
Não me parece que colocar uma interrupção seja bom neste caso. Apenas tens de garantir que o programa passa pela parte de testar o pino de x em x milisegundos e isso por si só garante que não vais ter o sistema a mandar SMSs a torto e a direito. A propósito, seria benéfico colocares um tipo de lógica desses aqui para evitar que mandes SMSs devido a bouncing dos contactos.
Na verdade eu queria simular um alarme que ligasse e desligasse através da SMS, por isso teria que "desativar ou ativar" o sensor. Pois caso a alarme estivesse ligado eu faria a leitura do sensor caso o alarme estivesse desligado eu não faria a leitura do sensor. Não consegui fazer utilizando o código acima. Pensei que na verdade podeira utilizar um led e caso o pino do led estive HIGH ai faria a leitura se estivesse low não faria a leitura, mas também não funcionou.