terça-feira, 12 de novembro de 2013

Arduino SIM900/WS Bridge SMS Servo Control

English version

Fala pessoal,

Aprofundado nos estudos sobre SIM900 e módulos GSM para Arduino. Nesse post estou usando um WS Bridge, mas o código funciona perfeitamente em qualquer modulo GSM, basta verificar a taxa de comunicação que seu modulo esta comunicando(baud rate) e verificar também os pinos TX/RX que estão comunicando com Arduino, feito isso tudo vai ocorrer perfeitamente. Qualquer duvida sobre esse assunto verifique nos postes anteriores de introdução ao assunto.

Hoje nos vamos controlar um servo motor por SMS, a ideia é a seguinte, mandar uma SMS para o mudulo GSM com a variação em graus do servo(pode ir de 0º a 180º), logo depois disso vamos fazer a leitura desses dados e tratar as informações. Com tudo pronto modificamos a posição do servo motor. Bem simples, mas utiliza vários conceitos legais de se aprender.

Código utilizado no Arduíno:

O código esta completamente comentado. Abaixo mostro funcionamento.

  1. #include <Servo.h>  // inicia biblioteca servo
  2. Servo myservo; // especifica nome do servo
  3. #include <SoftwareSerial.h> // inicia biblioteca softwareserial
  4. SoftwareSerial mySerial(3,2); // define pinos TX/RX pode variar de acordo com seu modulo
  5. String  linhaAtual  = ""; // para fazer leitura SMS              
  6. String  sms         = ""; // para fazer leitura SMS        
  7. int     sms_aux     =  0; // recebe valor inteiro da SMS
  8. String  smsAnterior = ""; // controle de SMS nova e antiga
  9. boolean lendoSMS    = false; // se esta lendo ou nao
  10. void setup()
  11. {
  12.   delay(2500); // delay inicial para configuracao
  13.   myservo.attach(A0); // conecta o servo no pino analogico A0
  14.   mySerial.begin(19200); // inicia porta softwareserial com 19200, pode varia de modulo para modulo
  15.   Serial.begin(19200); // inicia porta serial por hardware em 19200
  16.   Serial.println("Configurando SMS modo texto");
  17.   mySerial.println("AT+CMGF=1"); // coloca SIM900 em modo texto
  18.   delay(500); // delay para executar comando
  19.   Serial.println("Apagando todas SMSs");
  20.   mySerial.println("AT+CMGD=1,4"); // apaga todas SMSs posteriores
  21. }
  22. void loop()
  23. {
  24.   mySerial.println("AT+CMGR=1"); // envia comando que mostra ultima SMS
  25.   delay(1000); // espera os dados chegarem na porta serial, buffer
  26.   while (mySerial.available()!=0) // se existem dados, fazer leitura e "parsear"
  27.   {
  28.     char inChar = mySerial.read(); // variavel inChar recebe todos caracteres da porta soft serial
  29.     linhaAtual += inChar; // string linhaatual recebe todos caracteres da linha
  30.     if (inChar == '\n') // se tiver um enter na linha(newline)
  31.     {
  32.       linhaAtual = "";// apaga toda leitura que ja foi feita na linha
  33.     }
  34.     if (linhaAtual.endsWith("=")) // se a linha terminar com caracter =
  35.     {
  36.       lendoSMS = true; // inicio dos dados da SMS
  37.       sms = ""; // apaga variavel que vai receber os dados da SMS para garantir funcionamento
  38.     }
  39.     if (lendoSMS) // estamos lendo a SMS
  40.     {
  41.       if (inChar != '<') // faz leitura ate que encontre caracter <
  42.       {
  43.         sms += inChar; // adiciona dados a variavel sms
  44.       }
  45.       else
  46.       {
  47.         lendoSMS = false; // leitura terminou
  48.         sms.replace("=",""); // retira sinal de inicio na SMS = e troca por espaco em branco
  49.         Serial.print("Leitura Servo SMS: ");
  50.         Serial.println(sms); // mostra dados lidos no serial monitor
  51.         sms_aux = sms.toInt(); // converte dados String para int
  52.        
  53.         if(sms!=smsAnterior)
  54.         {
  55.           myservo.write(sms_aux); // coloca os valores inteiros da sms nos graus do servo
  56.           smsAnterior=sms; // igual smsanterior ao atual
  57.         }
  58.         if(sms==smsAnterior) // se sms igual a smsanterior, nao recebemos nova sms
  59.         {
  60.           mySerial.println("AT+CMGD=1,4"); // apaga todas SMSs
  61.           mySerial.flush(); // limpa pilha
  62.           Serial.flush(); // limpa pilha
  63.         }    
  64.       }
  65.     }
  66.   }
  67.   mySerial.println("");
  68. }


Leitura do Serial monitor:

Configurando SMS modo texto
Apagando todas SMSs
Leitura Servo SMS: 50
Leitura Servo SMS: 150

Tela do Celular:


Imagem das placas:



Vídeo demonstrativo:



É isso ai pessoal, espero que tenha gostado. Em breve novos posts com mais novidades. E fiquem de olho, loja Micro Embarcado com todas placas do blog disponíveis para venda a um preço justo vem ai!! Além de suporte no seus projetos TCC etc.

Nenhum comentário:

Postar um comentário