Arduino Uno + Icomsat 1.1 SIM900

Boa tarde,

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

Liga_e_Desliga_LEDS.ino (8.49 KB)

Bom olhando ao teu codigo encontrei algo que penso estar errado:

void checksms(){
  if(gsm.available() > 0){
    Serial.println("--------Nova SMS----------");
 gsm.flush();
    delay(1000);
    lesms();
    vadidacodigo();
  }
};

//--------------------------------------------------------------------------------------------------------------------------------------------------------------

void lesms(){
  Serial.println("-----------------------Lendo SMS---------------------");
  delay(2000);
  gsm.println("AT+CMGR=1\r");
 gsm.flush();
  for( x=0; x<255; x++){
    data[x]='\0';
  }
  x=0;

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 :stuck_out_tongue:
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?

for( x=0; x<255; x++){
    data[x]='\0';
  }

Hugo PT

No trecho de if abaixo armazeno a SMS recebida em uma String e despois trato ela abaixo.

E o que é que o teu programa não faz?

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.

Acho que temos de primeiro definir os termos.

Um sensor não pode ser activado. Pode ser lido. Um actuador, pode ser activado mas não pode (normalmente) ser lido.

Dito isto, queres mandar um SMS e activar um LED. Isto já funciona?

Para receberes uma mensagem quando o sensor ser activado, como é o sensor? É digital ou analógico? Já fizeste um programa só para enviar SMSs?

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. :slight_smile:

Era isto que tinhas dúvidas?

Entendi,
A noite vou testar e aviso progresso

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.