Control remoto por mensaje de texto con el módulo A6 y Arduino Mega
Materiales Utilizados:
- Modulo A6
- Tarjeta Arduino Mega 2560
- Sim card de Claro "para Colombia". Si esta en un país distinto, puedes probar con distintas sim card y ver con cual funciona bien.
- Tres resistencia de 220 ohmio.
- Tres led del color rojo, verde y azul.
- Adaptador de 5V 3A.
Circuito
El módulo A6 se alimenta con 5V, trae un circuito de regulación acompañado de un integrado de 5V.
Descripción del código
En esta práctica se muestra como controlar el encendido y apagado de tres led de diferentes colores, el control se realiza mediante mensaje de texto, utilizando el módulo A6 básico. Para encender y apagar cada led, se envía un mensaje con una estructura especifica, que luego es decodificada con la librería Separador, esta librería nos permite obtener una frase especifica del mensaje recibido.
Los mensajes respectivos que se envían para realizar el control, son los siguientes:
Mensaje
enviado |
Mensaje
decodificado |
Acción |
#AzulOn# |
AzulOn |
Encender led Azul |
#azulOff# |
azulOff |
Apagar led Azul |
#verdeOn# |
verdeOn |
Encender led Verde |
#verdeOff# |
verdeOff |
Apagar led Verde |
#RojoON# |
RojoON |
Encender led Rojo |
#RojoOff# |
RojoOff |
Apagar led Rojo |
Para la recepción del mensaje, se debe tener en cuenta la configuración del modulo A6, debe estar configurado para que el mensaje se pueda leer en modo texto "AT+CMGF=1", y además de eso es muy importante que el mensaje no se guarde en la memoria del dispositivo, sino que pase directo al puerto serial para poder ser leído y decodificado, esto se puede configurar con el siguiente comando: AT+CNMI=2,2,0,0,0.
En cuanto al código utilizado para todo el control de encendido/apagado, se tiene la función readDataA6(), donde se está atento a que entre datos por el puerto serial1, que será almacenado en la variable texto, esta variable se pasa por parámetro a la función separateMsm(texto), que es la encargada de decodificar el mensaje para luego ser evaluado en cada condición, como se aprecia en el siguiente código:
void readDataA6() {
String texto;
while (!Serial1.available()) {}
texto = Serial1.readString();
delay(500);
Serial.println(texto);
clearSerial("all");
if (texto.length() > 0) {
separateMsm(texto);
if (commands.equalsIgnoreCase("AzulOn")) {
Serial.println("Se ha encendido led Azul");
digitalWrite(ledAzul, HIGH);
}
if (commands.equalsIgnoreCase("azulOff")) {
Serial.println("Se ha apagado led Azul");
digitalWrite(ledAzul, LOW);
}
if (commands.equalsIgnoreCase("verdeOn")) {
Serial.println("Se ha encendido led Verde");
digitalWrite(ledVerde, HIGH);
}
if (commands.equalsIgnoreCase("verdeOff")) {
Serial.println("Se ha apagado led Verde");
digitalWrite(ledVerde, LOW);
}
if (commands.equalsIgnoreCase("RojoOn")) {
Serial.println("Se ha encendido led Rojo");
digitalWrite(ledRojo, HIGH);
}
if (commands.equalsIgnoreCase("RojoOff")) {
Serial.println("Se ha apagado led Rojo");
digitalWrite(ledRojo, LOW);
}
clearSerial("all");
}
}
void separateMsm(String bodyMsm) {
firstNumeral = s.separa(bodyMsm, '#', 0);
commands = s.separa(bodyMsm, '#', 1);
Serial.print("Comando:");
Serial.println(commands);
delay(500);
}
La función clearSerial("all") permite limpiar el puerto serial según el parámetro que se le pase: si es all, limpia el puerto Serial y Serial1, si es 0 se limpia solo el puerto Serial y si es 1 se limpia el puerto Serial1.
void clearSerial(String s) {
if (s.equalsIgnoreCase("all")) {
while (Serial.available() > 0)
Serial.read();
delay(1000);
while (Serial1.available() > 0)
Serial1.read();
delay(500);
} else if (s.equalsIgnoreCase("0")) {
while (Serial.available() > 0)
Serial.read();
delay(500);
} else if (s.equalsIgnoreCase("1")) {
while (Serial1.available() > 0)
Serial1.read();
delay(500);
}
}
Conceptos:
Serial.readString(): Función propia de Arduino, que permite leer todo lo ingresado por el puerto serial o buffer y, convertirlo a dato de tipo String o una cadena, es decir nos devuelve un dato de tipo String.
equalsIgnoreCase(): compara dos String o cadena, para determinar si son iguales o no, ignorando si el String esta en mayúscula o minúscula.
Tips para realizar las pruebas
- El módulo A6 es bastante estables, no se suele tener tanto inconveniente al momento de trabajar con el, pero si se recomienda tener en cuenta las siguiente pautas para su correcto funcionamiento.
- No se recomienda hacer las conexiones sobre protoboard, porque se crean falsos contactos que impide la circulación fluida de la corriente, en lo posible realice las conexiones con cables de un calibre grueso, especialmente los de la alimentación (Vcc y GND), si es posible, soldar los cables.
- Fijar la frecuencia del módulo en 115200 bps "Serial.begin(115200)" y "Serial1.begin(115200)", por lo que la mayoría de los módulos son muy estables a esa frecuencia.
- Cuando se disponga a subir el código a la tarjeta de Arduino Mega, tener presente que la conexión con los pines de trasmisión TX1 y RX1, deben estar desconectado para que no se tenga error por conexión, luego conectar nuevamente para las pruebas.
Códigos Fuentes Utilizados
En el siguiente enlace, puedes encontrar el repositorio con los códigos fuentes que se utilizaron en las pruebas.
0 Comentarios