
Avant de pouvoir vaincre
le bus CAN , nous avons dû vaincre le prochain élément matériel, à savoir le module GPRS. C'est sa vie de développeur - tout le temps elle doit gagner quelqu'un (il devrait y avoir un sourire interdit).
Pour l'un des projets personnalisés, j'avais besoin d'ajouter la possibilité de contrôler et de recevoir la télémétrie via GSM à l'aide de SMS. J'ai regardé la liste des options disponibles et j'ai opté pour le bouclier GPRS d'Amperka. Pourquoi pas? Il a l'air décent, est produit par une société bien connue, dispose d'un support technique, le prix n'est pas très différent de ses concurrents et fait généralement une très bonne impression.
Mais ça y était. Vous pouvez en apprendre davantage sur cette quête et les incroyables cours de formation continue que j'ai dû suivre, en intégrant ce module GPRS au
Arduino Mega Server en cliquant sur le bouton ci-dessous.
Module lui-même
Comme je l'ai dit,
le module lui-même fait une très bonne impression avec sa précision d'exécution et sa relation avec une entreprise bien connue. Encore une fois, le site Web du fabricant contient des exemples d'utilisation et une bibliothèque native. Étant donné que le module est de marque, il existe un espoir de soutien adéquat en cas de problème avec celui-ci.
À l'avenir, je dirai que le support technique a répondu correctement à mes questions pendant deux semaines, a recherché des bogues dans ma bibliothèque et a même publié une nouvelle version basée sur la raison de la communication avec moi. Mais ... je devais encore faire fonctionner le module par moi-même.
Projet
Quelques mots sur le
projet GSM Coop, qui nécessitait un module GPRS. Il a fallu développer l'automatisation de la gestion du poulailler. En effet, à une époque incroyable, nous vivons, maintenant le poulailler doit être contrôlé via un navigateur Web, des capteurs intelligents sans fil et la télémétrie GSM. C’est un objet stratégique quelconque, pas un poulailler.
Mais si c'est nécessaire, alors c'est nécessaire. Nous achetons des composants, dont le module GPRS, et procédons.
Talon d'Achille
Maintenant sur les fonctionnalités du module. Fondamentalement, cela fonctionne. Il travaille avec des exemples présentés sur le site Web du fabricant et sur sa base, vous pouvez même créer des croquis simples. Mais il y a trois «mais».
Remarque Deux cartes mères ont été utilisées dans le projet: Arduino Mega 2560 et Arduino Due, et tout ce qui suit s'applique spécifiquement à elles et uniquement à elles.Le premier "mais", le matériel. Le module ne fonctionne pas avec Arduino Due. Pas question. Même une correspondance de plusieurs jours avec le support technique d'Amperka n'a pas aidé. Ni moi ni les spécialistes de l'entreprise n'avons réussi à faire fonctionner le bouclier GPRS avec Arduino Due. Et c'est très décevant car Due est un excellent contrôleur avec de grandes capacités et aimerait pouvoir l'utiliser avec GPRS Shield.
Le deuxième «mais» est systémique. Le module nécessite la bibliothèque SoftwareSerial pour fonctionner. Lorsque j'ai commencé ma conversation avec GPRS Shield et le support technique d'Amperka, il s'agissait d'une solution non alternative. Après nos travaux, une version révisée de la bibliothèque avec prise en charge du travail sur le fer Serial a été publiée, mais ... elle n'a jamais gagné ni Due ni Mega. Qu'est-ce qui est généralement difficile à expliquer - si un module fonctionne sur SoftSerial, qu'est-ce qui l'empêche de fonctionner sur Iron Serial?
Le troisième «mais», conceptuel. Ce n'est pas tout. L'embuscade principale réside dans le principe de la bibliothèque de modules. Il fonctionne en mode fermé, c'est-à-dire qu'il bloque le fonctionnement du contrôleur pendant qu'il attend l'arrivée de SMS (qui est 99% du temps) et pendant toutes les autres opérations du module. Qu'est-ce que cela signifie? Cela signifie que sur la bibliothèque standard du fabricant, vous ne pouvez pas construire autre chose qu'une esquisse de test. Le poulailler stratégique ne brille pas pour vous, car des milliers d'autres applications intéressantes comme les systèmes de sécurité, la gestion des serres, le contrôle de la maison intelligente via GSM, etc., etc. ne brillent pas.
En savoir plus sur SoftwareSerial
Le module ne fonctionne pas sur Arduino Due, nous allons donc parler d'Arduino Mega. Le piquant de la situation est qu'ayant Mega a trois ports matériels libres Serial1, Serial2 et Seria3, nous sommes obligés de nous connecter et d'utiliser la bibliothèque SoftwareSerial. En aucune manière imaginable et inconcevable, y compris le réarrangement des cavaliers sur le module et l'interrogation avec l'addiction du support technique d'Amperka, n'a pas réussi à faire fonctionner le bouclier GPRS avec les ports matériels d'Arduino Mega.
D'accord ... Nous utilisons SoftwareSerial, mais ici, nous attendons une embuscade. SoftwareSerial peut fonctionner sur de nombreuses broches Arduino Mega, mais pour une raison quelconque, il ne fonctionne que sur les broches 62 et 63. Pourquoi seulement sur eux? Cette énigme est géniale. À toutes les apparences, nous ne connaîtrons jamais la réponse à cette question.
Farine de choix
Et maintenant, comme d'habitude, nous comprenons que la bibliothèque standard n'est pas adaptée à une utilisation pratique. En bloquant le contrôleur pendant qu'il attend de recevoir une réponse du module GPRS, la bibliothèque bloque également tous les autres processus. Le contrôleur tombe simplement hors de la réalité 99% du temps, attendant qu'une demande ou une réponse arrive ou que le délai expire.
Cela met fin à toute application de GPRS Shield, à l'exception de celle de test: envoyé une demande pour activer le socket - il s'est allumé, a envoyé une demande pour l'éteindre - il s'est éteint. Il ne peut être question d'aucun travail sur le serveur Web, de travail avec des capteurs, de contrôle des actionneurs et d'autres choses; rien de tout cela ne fonctionnera simplement.
La question s'est posée - soit nous abandonnons la bibliothèque du fabricant et écrivons notre code de contrôle GPRS Shield (facile à dire), soit nous abandonnons le module lui-même et cherchons une solution alternative. Mais le module est déjà là, il a donc été décidé d'abandonner la bibliothèque et d'écrire le code de contrôle de votre module.
La conquête de l'Everest
Je saute tout le processus de création du code qui remplace la bibliothèque standard d'Amperka, je note seulement que c'était très, très difficile et exigeait un travail de recherche considérable, la compilation d'un algorithme sophistiqué et des efforts considérables pour tester la solution résultante.
Tout sera simple pour vous - un peu de magie et le code de travail prêt à l'emploi du module AMS pour la prise en charge de GPRS Shield est prêt.
Code de module AMS complet remplaçant la bibliothèque standard #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 "-"
Le module a été développé et testé sur AMS version 0.16 pour Arduino Mega. Les tests ont montré un fonctionnement absolument stable et fiable du bouclier GPRS sous le contrôle de ce module.
Connectez-vous au module de support AMS GPRS Shield
Afin de connecter le module GPRS Shield au Arduino Mega Server, vous devez effectuer quelques étapes simples. Tout d'abord, ajoutez les lignes suivantes au fichier principal AMS
#define GPRS_FEATURE
et
byte modulGprs = MODUL_NOT_COMPILLED;
dans les sections appropriées. Là, vous devez ajouter des variables de test qui, dans votre projet réel, seront responsables des paramètres contrôlés (température, état des contacts, etc.).
float lpTempTemp; byte lpContCont1; byte lpLeakLeak1; byte smokeSmoke; byte relayRelay; byte servoState;
Explication des fonctionnalités prises en charge
Le module contient un ensemble de base de requêtes et de commandes, mais vous pouvez remplacer ces commandes par d'autres et / ou développer l'ensemble de base de commandes et de requêtes dont vous avez besoin.
Demandes
Les demandes sont envoyées par SMS, le système envoie des réponses (également par SMS) contenant des informations sur le paramètre demandé. Très simple: nous envoyons la demande «temp1» depuis le téléphone, le système en réponse envoie la valeur de température actuelle
temp1=20.50
.
temp1 - demande de température
cont1 - demande le statut du contact
fuite1 - demande l'état du capteur de fuite
smoke1 - interroge l'état du détecteur de fumée
relay1 - demande d'état du relais (clé)
servo1 - demande le statut du servo-chargeur
période - demande pour la période de forfaits de télémétrie automatique
all - demande tous les paramètres du système
En réponse à la demande «tous», le système envoie une liste de tous les paramètres. Dans le cas de l'envoi d'une commande non enregistrée, le système enverra une réponse «Erreur». Si les paramètres surveillés sont en dehors de la plage normale, le système lui-même peut envoyer des messages d'alarme au smartphone de l'opérateur.
Afin de gérer le système, seul un opérateur enregistré pourrait le faire, le système est protégé contre les accès non autorisés - il ne répond qu'aux commandes d'un ou de plusieurs numéros de téléphone spécifiques.
Équipes
Les commandes sont envoyées par SMS, après avoir accepté la commande, le système change son état et envoie des réponses avec des informations sur le nouvel état de ses actionneurs ou paramètres.
relay1 = - commande de commande de relais (touche)
servo1 = - commande de contrôle du chargeur
period = - commande pour modifier la période d'envoi automatique de la télémétrie
Un exemple. Commande
relay1=1
, réponse
relay1=ON
. Commande
relay1=0
, réponse
relay1=OFF
.
Explications du code
Initialisation du module GPRS. Initialisation standard du module AMS, lancement de SoftwareSerial, et un peu de magie des commandes GSM AT. Le but de ce bloc est de donner vie au module GPRS et de le renvoyer du nirvana si à ce moment il l'avait laissé pour une raison indépendante de notre volonté.
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 principale fonction de travail du module. Toutes les 20 secondes, l'Arduino Mega Server vérifie les SMS entrants et, en cas de demande ou de commande, les exécute. Il en résulte que le délai moyen d'exécution de la commande est de 10 secondes (hors délai d'envoi de SMS par l'opérateur télécom). Cet intervalle peut être configuré, 20 secondes sont sélectionnées comme compromis entre la vitesse de réaction aux commandes SMS et le démarrage du système.
Dans ces 20 secondes, AMS peut faire tout ce dont il a besoin et le SMS qui arrive pendant cette période n'est pas perdu. Lorsque vous utilisez la bibliothèque standard, le système ne peut rien faire mais attendre que le SMS arrive, sinon il les perd (et le contrôleur ne peut rien faire pour le moment non plus).
Il existe également un code d'envoi de télémétrie avec un intervalle spécifié de 1 heure, 6 heures, 12 heures ou 24 heures. Cet intervalle peut être modifié en envoyant la commande appropriée par 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; } }
L'interaction du module GPRS et du contrôleur est effectuée à l'aide de commandes AT spéciales et les fonctions suivantes forment les commandes du module GPRS dans des codes qui lui sont compréhensibles.
Fonction d'envoi de SMS. Dans les paramètres de la fonction, le numéro de téléphone de destination et la commande ou la requête sont transmis sous forme de texte.
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; }
Fonction de lecture SMS. Les valeurs acceptées sont placées dans les variables message, phone et datetime, qui contiennent respectivement la commande reçue, le numéro de téléphone et l'heure d'envoi.
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 fonction de former une réponse aux requêtes et commandes SMS. Cette fonction est spécifique à chaque projet et vous pouvez la modifier dans vos projets selon la logique de votre système.
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!")); }
Fonctions de formation de réponses. Ce sont des fonctions qui forment les réponses que le système envoie par SMS au smartphone de l'utilisateur en réponse à une demande ou à sa discrétion, conformément au programme défini.
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()
Et les fonctions d'exécution des commandes. Ce sont des fonctions qui sont exécutées par des commandes SMS et changent l'état du système, c'est-à-dire modifient ses paramètres ou activent ou désactivent des actionneurs.
void gprsSetRelay(byte v) void gprsSetServo(byte v)
Les fonctions restantes sont purement techniques, faisant tout le travail de maintenance de l'interaction entre le bouclier GPRS et le microcontrôleur.
Un peu plus sur SoftwareSerial
Tout ce qui précède n'est pas suffisant pour que GPRS Shield fonctionne en mode transparent et arrête de bloquer les autres processus en cours d'exécution sur le microcontrôleur. Il est également nécessaire de modifier le code de la bibliothèque SoftwareSerial. Le fait est que sa mémoire tampon standard de 64 octets n'est pas suffisante pour digérer la plupart des commandes AT GSM et maintenir une interaction dynamique entre le module et le contrôleur.
Vous devez augmenter ce tampon à au moins 128 octets, et seulement après cela, la magie fonctionnera et le bouclier GPRS commencera à fonctionner normalement en mode transparent. Cela se fait dans le fichier
SoftwareSerial.h
. Ligne
#define _SS_MAX_RX_BUFF 64
besoin de changer pour
#define _SS_MAX_RX_BUFF 128
Conclusion
Vous voyez l'échange des commandes de l'opérateur et des réponses du système sur l'écran du smartphone. Et tandis que le système effectue des dizaines de processus en mode pseudo-multitâche. Et GPRS Shield a commencé à occuper moins de 1% du temps processeur, au lieu de 99% comme auparavant, libérant ainsi le reste du temps pour le serveur Web et d'autres tâches de gestion du poulailler.
C'est tout, nous avons intégré GPRS Shield dans
AMS , surmonté tous les obstacles, l'avons fait fonctionner en mode transparent, sans bloquer d'autres processus comme un serveur Web, le fonctionnement de capteurs et actionneurs sans fil, et cela ouvre des perspectives intéressantes pour la construction d'un grand nombre de systèmes avec contrôle SMS GSM et contrôle basé sur AMS - serres, systèmes de sécurité et de chauffage, diverses options pour une maison intelligente, etc., etc. presque à l'infini.