
Antes de que pudiéramos derrotar
al bus CAN , tuvimos que derrotar a la siguiente pieza de hardware, a saber, el módulo GPRS. Esta es su vida como desarrolladora: todo el tiempo tiene que ganar a alguien (debería haber una sonrisa prohibida).
Para uno de los proyectos personalizados, necesitaba agregar la capacidad de controlar y recibir telemetría a través de GSM usando SMS. Miré la lista de opciones disponibles y me decidí por el Escudo GPRS de Amperka. Por que no Parece decente, es producido por una empresa conocida, tiene soporte técnico, el precio no es muy diferente de los competidores y, en general, causa una muy buena impresión.
Pero ahí estaba. Puede aprender sobre esa búsqueda y los increíbles cursos de educación continua que tuve que seguir, integrando este módulo GPRS con el
Mega Servidor Arduino haciendo clic en el botón a continuación.
Módulo en sí
Como dije,
el módulo en sí mismo causa una muy buena impresión con su precisión de ejecución y su relación con una empresa conocida. Nuevamente, el sitio web del fabricante tiene ejemplos de uso y una biblioteca nativa. Dado que el módulo tiene la marca, existe la esperanza de un soporte adecuado en caso de cualquier problema con él.
Mirando hacia el futuro, diré que el soporte técnico respondió mis preguntas correctamente durante dos semanas, buscó errores en mi biblioteca e incluso lanzó una nueva versión basada en el motivo por el cual se comunicó conmigo. Pero ... todavía tenía que hacer que el módulo funcionara solo.
Proyecto
Algunas palabras sobre el
proyecto GSM Coop, que requería un módulo GPRS. Era necesario desarrollar la automatización para gestionar el gallinero. De hecho, en una época increíble en la que vivimos, ahora el gallinero debe controlarse mediante un navegador web, sensores inteligentes inalámbricos y telemetría GSM. Es un objeto estratégico de algún tipo, no un gallinero.
Pero si es necesario, entonces es necesario. Compramos componentes, entre los cuales se encuentra el módulo GPRS, y procedemos.
Talón de Aquiles
Ahora sobre las características del módulo. Básicamente funciona. Trabaja con ejemplos presentados en el sitio web del fabricante y sobre la base de que incluso puede crear un boceto simple. Pero hay tres "peros".
Nota Se utilizaron dos placas base en el proyecto: Arduino Mega 2560 y Arduino Due, y todo lo siguiente se aplica específicamente a ellos y solo a ellos.El primer "pero", hardware. El módulo no funciona con Arduino Due. De ninguna manera Incluso la correspondencia de varios días con el soporte técnico de Amperka no ayudó. Ni yo ni los especialistas de la compañía logramos que GPRS Shield trabaje con Arduino Due. Y esto es muy decepcionante porque Due es un excelente controlador con grandes capacidades y me encantaría poder usarlo con GPRS Shield.
El segundo "pero" es sistémico. El módulo requiere la biblioteca SoftwareSerial para funcionar. Cuando comencé mi conversación con GPRS Shield y el soporte técnico de Amperka, esta era una solución no alternativa. Después de nuestros procedimientos, se lanzó una versión revisada de la biblioteca con soporte para trabajar en la serie de hierro, pero ... nunca ganó Due o Mega. ¿Qué es generalmente difícil de explicar? Si un módulo funciona en SoftSerial, ¿qué impide que funcione en iron Serial?
El tercer "pero", conceptual. Eso no es todo. La emboscada principal reside en el principio de la biblioteca de módulos. Funciona en modo cerrado, es decir, bloquea el funcionamiento del controlador mientras espera la llegada de SMS (que es el 99% del tiempo) y durante todas las demás operaciones del módulo. ¿Qué significa esto? Esto significa que en la biblioteca estándar del fabricante, no puede crear nada más que un boceto de prueba. El gallinero estratégico no brilla para usted, ya que miles de aplicaciones geniales más como sistemas de seguridad, gestión de invernaderos, control inteligente del hogar a través de GSM, etc., etc. no brillan.
Más acerca de SoftwareSerial
El módulo no funciona en Arduino Due, por lo tanto hablaremos de Arduino Mega. Lo picante de la situación es que al tener Mega tiene tres puertos de hardware libres, Serial1, Serial2 y Seria3, nos vemos obligados a conectarnos y usar la biblioteca SoftwareSerial. De ninguna manera imaginable e inconcebible, incluida la reorganización de los puentes en el módulo y el interrogatorio con la adicción al soporte técnico de Amperka, no fue posible hacer que GPRS Shield funcionara con puertos de hardware en Arduino Mega.
Bien ... Usamos SoftwareSerial, pero aquí estamos esperando una emboscada. SoftwareSerial puede funcionar en muchos pines Arduino Mega, pero por alguna razón solo funciona en los pines 62 y 63. ¿Por qué solo en ellos? Este acertijo es genial. A todas luces, nunca sabremos la respuesta a esta pregunta.
Harina de elección
Y ahora, como siempre, llegamos a comprender que la biblioteca estándar no es apta para el uso práctico. Al bloquear el controlador mientras espera recibir una respuesta del módulo GPRS, la biblioteca también bloquea todos los demás procesos. El controlador simplemente se cae de la realidad el 99% del tiempo, esperando hasta que llegue una solicitud o respuesta o finalice el tiempo de espera.
Esto pone fin a cualquier aplicación de GPRS Shield, a excepción de la prueba: envió una solicitud para encender el zócalo - se activó, envió una solicitud para apagar - se apagó. No se puede hablar de ningún trabajo del servidor web, trabajar con sensores, control de actuadores y otras cosas; nada de esto simplemente funcionará.
Surgió la pregunta: o abandonamos la biblioteca del fabricante y escribimos nuestro código de control GPRS Shield (fácil de decir), o abandonamos el módulo en sí y buscamos una solución alternativa. Pero el módulo ya está allí, por lo que se decidió abandonar la biblioteca y escribir el código de control del módulo.
La conquista del Everest
Me salteo todo el proceso de creación del código que reemplaza la biblioteca estándar de Amperka, solo noto que fue muy, muy difícil y requirió un trabajo de investigación considerable, la compilación de un algoritmo sofisticado y esfuerzos considerables para probar la solución resultante.
Todo será simple para usted: un poco de magia y el código de trabajo listo para usar del módulo AMS para admitir GPRS Shield está listo.
Código completo del módulo AMS que reemplaza la biblioteca estándar #ifdef GPRS_FEATURE #include <SoftwareSerial.h> #define ALWAYS 1 #define GPRS_ON_PIN 2 #define GPRS_STATE_PIN 3 #define GPRS_RX_PIN 62 #define GPRS_TX_PIN 63 #define MASTER "+7yyyxxxxxxx" #define MESSAGE "Hello" #define CHECK_ERROR 0 #define CHECK_MARKER 1 #define CHECK_OK 2 #define NO_CHECK 3 #define MARKER_OK "OK" #define MARKER_NO_CHECK "-"
El módulo fue desarrollado y probado en AMS versión 0.16 para Arduino Mega. Las pruebas mostraron un funcionamiento absolutamente estable y confiable de GPRS Shield bajo el control de este módulo.
Conéctese al módulo de soporte AMS GPRS Shield
Para conectar el módulo GPRS Shield al Arduino Mega Server, debe realizar algunos pasos simples. Primero, agregue las siguientes líneas al archivo principal de AMS
#define GPRS_FEATURE
y
byte modulGprs = MODUL_NOT_COMPILLED;
en las secciones apropiadas Allí debe agregar variables de prueba que en su proyecto real serán responsables de los parámetros controlados (temperatura, estado de contacto, etc.).
float lpTempTemp; byte lpContCont1; byte lpLeakLeak1; byte smokeSmoke; byte relayRelay; byte servoState;
Explicación de las características admitidas
El módulo contiene un conjunto básico de consultas y comandos, pero puede reemplazar estos comandos con cualquier otro y / o expandir el conjunto básico de comandos y consultas que necesita.
Consultas
Las solicitudes se envían por SMS, el sistema envía respuestas (también por SMS) que contienen información sobre el parámetro solicitado. Muy simple: enviamos la solicitud "temp1" desde el teléfono, el sistema en respuesta envía el valor de temperatura actual
temp1=20.50
.
temp1 - solicitud de temperatura
cont1 - solicitar estado de contacto
fuga1 : solicita el estado del sensor de fuga
smoke1 - consulta el estado del detector de humo
relé1 : solicita el estado del relé (clave)
servo1 : solicita el estado del servoalimentador
period - solicitud del periodo de paquetes de telemetría automática
all : solicita todos los parámetros del sistema
En respuesta a la solicitud de "todos", el sistema envía una lista de todos los parámetros. En el caso de enviar un comando no registrado, el sistema enviará una respuesta de "Error". Si los parámetros monitoreados están fuera del rango normal, el sistema mismo puede enviar mensajes de alarma al teléfono inteligente del operador.
Para administrar el sistema que solo un operador registrado podría, el sistema tiene protección contra el acceso no autorizado: solo responde a comandos de un número de teléfono específico.
Equipos
Los comandos se envían por SMS, una vez aceptado el comando, el sistema cambia su estado y envía respuestas con información sobre el nuevo estado de sus actuadores o configuraciones.
relé1 = - comando de control del relé (tecla)
servo1 = - comando de control del alimentador
period = - comando para cambiar el período de envío automático de telemetría
Un ejemplo Comando
relay1=1
, respuesta
relay1=ON
. Comando
relay1=0
, respuesta
relay1=OFF
.
Explicaciones de código
Inicialización del módulo GPRS. La inicialización estándar del módulo AMS, el lanzamiento de SoftwareSerial y un poco de magia de los comandos GSM AT. El propósito de este bloque es dar vida al módulo GPRS y devolverlo del nirvana si en este momento lo había dejado por alguna razón fuera de nuestro control.
void gprsInit() { initStart("GPRS", true); GPRS.begin(9600); gprsOnOff(); gprsStart(); sendGprs("AT+CFUN=1", "OK"); sendGprs("AT+CNMI=2,1", "OK"); sendGprs("AT+CMGF=1", "OK"); sendGprs("AT+CLIP=1", "OK"); modulGprs = MODUL_ENABLE; initDone(true); }
La principal función de trabajo del módulo. Cada 20 segundos, el Arduino Mega Server comprueba si hay SMS entrantes y, en caso de solicitudes o comandos, los ejecuta. Como resultado, el retraso promedio en la ejecución del comando es de 10 segundos (excluyendo el retraso en el envío de mensajes SMS por parte del operador de telecomunicaciones). Este intervalo se puede configurar, se seleccionan 20 segundos como un compromiso entre la velocidad de reacción a los comandos SMS y el arranque del sistema.
En estos 20 segundos, AMS puede hacer lo que sea necesario, y el SMS que llega en este período de tiempo no se pierde. Cuando se usa la biblioteca estándar, el sistema no puede hacer nada más que esperar a que llegue el SMS; de lo contrario, simplemente los pierde (y el controlador tampoco puede hacer nada en este momento).
También hay un código de envío de telemetría con un intervalo especificado de 1 hora, 6 horas, 12 horas o 24 horas. Este intervalo se puede cambiar enviando el comando apropiado por SMS.
void gprsWorks() { if (cycle20s) { readSms(); } switch (gprsPeriod) { case 1: if (cycle1h) {sendPeriod();} break; case 6: if (cycle6h) {sendPeriod();} break; case 12: if (cycle12h) {sendPeriod();} break; default: if (cycle24h) {sendPeriod();} break; } }
La interacción del módulo GPRS y el controlador se realiza utilizando comandos AT especiales y las siguientes funciones forman los comandos del módulo GPRS en códigos que le son comprensibles.
Función de envío de SMS. En los parámetros de la función, el número de teléfono de destino y el comando o solicitud se transmiten en forma de texto.
bool sendSms(char *number, String data) { String numstr = "AT+CMGS=\"" + String(number) + "\""; String messtr = data + String((char)26); if (sendGprs(numstr, ">")) { if (sendGprs(messtr, MARKER_NO_CHECK)) { return true; } } return false; }
Función de lectura de SMS. Los valores aceptados se colocan en las variables mensaje, teléfono y fecha y hora, que contienen, respectivamente, el comando recibido, el número de teléfono y la hora de envío.
void readSms() { byte result = sendGprs("AT+CMGR=1,1", "+CMGR:"); if (result == CHECK_MARKER) { parseSms(message, phone, datetime); Serial.print(F("Number: ")); Serial.println(phone); Serial.print(F("Datetime: ")); Serial.println(datetime); Serial.print(F("Message: ")); Serial.println(message); deleteSms(); if (String(phone) == String(MASTER)) { Serial.println(F("Message from MASTER!")); gprsAnswer(); } } else if (result == CHECK_OK) { Serial.println(F("No SMS")); } else { Serial.println(F("Error read SMS")); } }
La función de formar una respuesta a las solicitudes y comandos de SMS. Esta función es específica para cada proyecto y puede cambiarla en sus proyectos de acuerdo con la lógica de su sistema.
void gprsAnswer() { String s = ""; String mess = String(message); String data = ""; if (mess == DATA_TEMP1) {s += mkTemp1();} else if (mess == DATA_CONT1) {s += mkCont1();} else if (mess == DATA_LEAK1) {s += mkLeak1();} else if (mess == DATA_SMOKE1) {s += mkSmoke1();} else if (mess == DATA_RELAY1) {s += mkRelay1();} else if (mess == DATA_SERVO1) {s += mkServo1();} else if (mess == DATA_PERIOD) {s += mkPeriod();} else if (mess == DATA_ALL) {s += mkAll();} else if (mess.indexOf(F("=")) >= 0) { byte p = mess.indexOf(F("=")); if (mess.indexOf(CMD_RELAY1) >= 0) {data = mess.substring(p + 1); gprsSetRelay(data.toInt()); s += DATA_RELAY1; s += '='; s += stringSens(relayRelay);} else if (mess.indexOf(CMD_SERVO1) >= 0) {data = mess.substring(p + 1); gprsSetServo(data.toInt()); s += DATA_SERVO1; s += '='; s += stringSens(servoState);} else if (mess.indexOf(CMD_PERIOD) >= 0) {data = mess.substring(p + 1); gprsPeriod = data.toInt(); s += DATA_PERIOD; s += '='; s += String(gprsPeriod);} } else { Serial.println(F("Not command!")); }
Funciones de formar respuestas. Estas son funciones que forman las respuestas que el sistema envía por SMS al teléfono inteligente del usuario en respuesta a una solicitud o según su criterio, de acuerdo con el programa establecido.
String stringSens(byte v) String stringLeak(byte v) String stringSmoke(byte v) String mkTemp1() String mkCont1() String mkLeak1() String mkSmoke1() String mkRelay1() String mkServo1() String mkPeriod() String mkAll()
Y las funciones de ejecución de comandos. Estas son funciones que realizan los comandos de SMS y cambian el estado del sistema, es decir, cambian su configuración o habilitan o deshabilitan los actuadores.
void gprsSetRelay(byte v) void gprsSetServo(byte v)
Las funciones restantes son puramente técnicas, y realizan todo el trabajo de mantenimiento de la interacción entre GPRS Shield y el microcontrolador.
Un poco más sobre SoftwareSerial
Todo lo anterior no es suficiente para que GPRS Shield funcione en modo transparente y deje de bloquear otros procesos que se ejecutan en el microcontrolador. También es necesario modificar el código de la biblioteca SoftwareSerial. El hecho es que su búfer estándar de 64 bytes no es suficiente para digerir la mayoría de los comandos AT GSM y mantener una interacción dinámica entre el módulo y el controlador.
Debe aumentar este búfer al menos a 128 bytes, y solo después de eso la magia funcionará y el Escudo GPRS comenzará a funcionar normalmente en modo transparente. Esto se hace en el archivo
SoftwareSerial.h
. Línea
#define _SS_MAX_RX_BUFF 64
necesita cambiar a
#define _SS_MAX_RX_BUFF 128
Conclusión
Verá el intercambio de comandos del operador y respuestas del sistema en la pantalla del teléfono inteligente. Y mientras el sistema realiza docenas de procesos en modo pseudo-multitarea. Y GPRS Shield comenzó a ocupar menos del 1% del tiempo del procesador, en lugar del 99% como antes, liberando el resto del tiempo para el servidor web y otras tareas para administrar el gallinero.
Eso es todo, integramos GPRS Shield en
AMS , superamos todos los obstáculos, lo hicimos funcionar en modo transparente, sin bloquear otros procesos como un servidor web, la operación de sensores y actuadores inalámbricos, y esto abre perspectivas atractivas para construir una gran cantidad de sistemas con control GSM SMS y control basado en AMS: invernaderos, sistemas de seguridad y calefacción, varias opciones para un hogar inteligente, etc., etc., casi hasta el infinito.