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.
- #include <Servo.h> // inicia biblioteca servo
- Servo myservo; // especifica nome do servo
- #include <SoftwareSerial.h> // inicia biblioteca softwareserial
- SoftwareSerial mySerial(3,2); // define pinos TX/RX pode variar de acordo com seu modulo
- String linhaAtual = ""; // para fazer leitura SMS
- String sms = ""; // para fazer leitura SMS
- int sms_aux = 0; // recebe valor inteiro da SMS
- String smsAnterior = ""; // controle de SMS nova e antiga
- boolean lendoSMS = false; // se esta lendo ou nao
- void setup()
- {
- delay(2500); // delay inicial para configuracao
- myservo.attach(A0); // conecta o servo no pino analogico A0
- mySerial.begin(19200); // inicia porta softwareserial com 19200, pode varia de modulo para modulo
- Serial.begin(19200); // inicia porta serial por hardware em 19200
- Serial.println("Configurando SMS modo texto");
- mySerial.println("AT+CMGF=1"); // coloca SIM900 em modo texto
- delay(500); // delay para executar comando
- Serial.println("Apagando todas SMSs");
- mySerial.println("AT+CMGD=1,4"); // apaga todas SMSs posteriores
- }
- void loop()
- {
- mySerial.println("AT+CMGR=1"); // envia comando que mostra ultima SMS
- delay(1000); // espera os dados chegarem na porta serial, buffer
- while (mySerial.available()!=0) // se existem dados, fazer leitura e "parsear"
- {
- char inChar = mySerial.read(); // variavel inChar recebe todos caracteres da porta soft serial
- linhaAtual += inChar; // string linhaatual recebe todos caracteres da linha
- if (inChar == '\n') // se tiver um enter na linha(newline)
- {
- linhaAtual = "";// apaga toda leitura que ja foi feita na linha
- }
- if (linhaAtual.endsWith("=")) // se a linha terminar com caracter =
- {
- lendoSMS = true; // inicio dos dados da SMS
- sms = ""; // apaga variavel que vai receber os dados da SMS para garantir funcionamento
- }
- if (lendoSMS) // estamos lendo a SMS
- {
- if (inChar != '<') // faz leitura ate que encontre caracter <
- {
- sms += inChar; // adiciona dados a variavel sms
- }
- else
- {
- lendoSMS = false; // leitura terminou
- sms.replace("=",""); // retira sinal de inicio na SMS = e troca por espaco em branco
- Serial.print("Leitura Servo SMS: ");
- Serial.println(sms); // mostra dados lidos no serial monitor
- sms_aux = sms.toInt(); // converte dados String para int
- if(sms!=smsAnterior)
- {
- myservo.write(sms_aux); // coloca os valores inteiros da sms nos graus do servo
- smsAnterior=sms; // igual smsanterior ao atual
- }
- if(sms==smsAnterior) // se sms igual a smsanterior, nao recebemos nova sms
- {
- mySerial.println("AT+CMGD=1,4"); // apaga todas SMSs
- mySerial.flush(); // limpa pilha
- Serial.flush(); // limpa pilha
- }
- }
- }
- }
- mySerial.println("");
- }
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:
Nenhum comentário:
Postar um comentário