
Bevor wir
den CAN-Bus besiegen konnten, mussten wir die nächste Hardware, nämlich das GPRS-Modul, besiegen. Dies ist ihr Leben als Entwicklerin - die ganze Zeit muss sie jemanden gewinnen (es sollte ein verbotenes Lächeln geben).
Für eines der benutzerdefinierten Projekte musste ich die Möglichkeit hinzufügen, Telemetrie über GSM per SMS zu steuern und zu empfangen. Ich habe mir die Liste der verfügbaren Optionen angesehen und mich für das GPRS Shield von Amperka entschieden. Warum nicht? Es sieht anständig aus, wird von einem bekannten Unternehmen hergestellt, hat technischen Support, der Preis unterscheidet sich nicht sehr von den Mitbewerbern und macht im Allgemeinen einen sehr guten Eindruck.
Aber da war es. Sie können mehr über diese Suche und die unglaublichen Weiterbildungskurse erfahren, die ich durchlaufen musste, indem Sie dieses GPRS-Modul in den
Arduino Mega Server integrieren, indem Sie auf die Schaltfläche unten klicken.
Modul selbst
Wie gesagt,
das Modul selbst macht mit seiner Genauigkeit der Ausführung und der Beziehung zu einem bekannten Unternehmen einen sehr guten Eindruck. Auch hier enthält die Website des Herstellers Verwendungsbeispiele und eine native Bibliothek. Da das Modul mit einem Branding versehen ist, besteht die Hoffnung auf eine angemessene Unterstützung bei Problemen damit.
Mit Blick auf die Zukunft werde ich sagen, dass der technische Support meine Fragen zwei Wochen lang richtig beantwortet, nach Fehlern in meiner Bibliothek gesucht und sogar eine neue Version veröffentlicht hat, die auf dem Grund für die Kommunikation mit mir basiert. Aber ... ich musste das Modul immer noch alleine arbeiten lassen.
Projekt
Ein paar Worte zum
GSM Coop-Projekt, für das ein GPRS-Modul erforderlich war. Es war notwendig, eine Automatisierung für die Verwaltung des Hühnerstalles zu entwickeln. In einer erstaunlichen Zeit, in der wir leben, muss der Hühnerstall jetzt über einen Webbrowser, drahtlose Smart-Sensoren und GSM-Telemetrie gesteuert werden. Es ist ein strategisches Objekt, kein Hühnerstall.
Aber wenn es notwendig ist, dann ist es notwendig. Wir kaufen Komponenten, darunter das GPRS-Modul, und fahren fort.
Achillesferse
Nun zu den Funktionen des Moduls. Grundsätzlich funktioniert es. Er arbeitet mit Beispielen, die auf der Website des Herstellers vorgestellt werden, und auf deren Grundlage Sie sogar eine einfache Skizze erstellen können. Aber es gibt drei "Aber".
Hinweis In dem Projekt wurden zwei Motherboards verwendet: Arduino Mega 2560 und Arduino Due, und alle folgenden Punkte gelten speziell für sie und nur für sie.Das erste "aber", Hardware. Das Modul funktioniert nicht mit Arduino Due. Auf keinen Fall. Selbst mehrtägige Korrespondenz mit dem technischen Support von Amperka half nichts. Weder ich noch die Spezialisten des Unternehmens haben es geschafft, GPRS Shield dazu zu bringen, mit Arduino Due zusammenzuarbeiten. Und das ist sehr enttäuschend, da Due ein ausgezeichneter Controller mit großartigen Funktionen ist und ihn gerne mit GPRS Shield verwenden würde.
Das zweite "aber" ist systemisch. Für das Modul muss die SoftwareSerial-Bibliothek funktionieren. Als ich mein Gespräch mit GPRS Shield und dem technischen Support von Amperka begann, war dies keine alternative Lösung. Nach unserem Verfahren wurde eine überarbeitete Version der Bibliothek mit Unterstützung für die Arbeit an der Eisen-Serie veröffentlicht, aber ... sie hat weder Due noch Mega verdient. Was ist im Allgemeinen schwer zu erklären - wenn ein Modul mit SoftSerial funktioniert, was hindert es dann daran, mit Iron Serial zu arbeiten?
Das dritte "aber", konzeptionell. Das ist noch nicht alles. Der Hauptüberfall liegt im Prinzip der Modulbibliothek. Es arbeitet im geschlossenen Modus, dh es blockiert den Betrieb des Controllers, während es auf das Eintreffen von SMS wartet (was 99% der Zeit ist) und während aller anderen Vorgänge des Moduls. Was bedeutet das? Dies bedeutet, dass Sie in der Standardbibliothek des Herstellers nur eine Testskizze erstellen können. Der strategische Hühnerstall glänzt nicht für Sie, da Tausende cooler Anwendungen wie Sicherheitssysteme, Gewächshausmanagement, Smart-Home-Steuerung über GSM usw. usw. nicht glänzen.
Weitere Informationen zu SoftwareSerial
Das Modul funktioniert nicht mit Arduino Due, daher werden wir über Arduino Mega sprechen. Das Pikante an der Situation ist, dass Mega mit drei freien Hardware-Ports Serial1, Serial2 und Seria3 gezwungen ist, eine Verbindung herzustellen und die SoftwareSerial-Bibliothek zu verwenden. Auf keine vorstellbare und unvorstellbare Weise, einschließlich der Neuanordnung von Jumpern auf dem Modul und der Befragung mit der Sucht nach technischem Support von Amperka, war es nicht möglich, GPRS Shield dazu zu bringen, mit Hardware-Ports auf Arduino Mega zu arbeiten.
Okay ... Wir verwenden SoftwareSerial, aber hier warten wir auf einen Hinterhalt. SoftwareSerial kann mit vielen Arduino Mega-Pins arbeiten, aber aus irgendeinem Grund funktioniert es nur mit den 62. und 63. Pins. Warum nur auf ihnen? Dieses Rätsel ist großartig. Anscheinend werden wir die Antwort auf diese Frage nie erfahren.
Mehl der Wahl
Und jetzt stellen wir wie üblich fest, dass die Standardbibliothek für den praktischen Gebrauch ungeeignet ist. Durch Blockieren des Controllers, während er auf eine Antwort vom GPRS-Modul wartet, blockiert die Bibliothek auch alle anderen Prozesse. Der Controller fällt 99% der Zeit einfach aus der Realität heraus und wartet, bis eine Anfrage oder Antwort eintrifft oder das Timeout endet.
Dies beendet jede Anwendung von GPRS Shield, mit Ausnahme der Testanwendung: Es wurde eine Anforderung zum Einschalten des Sockets gesendet - es wurde aktiviert, eine Anforderung zum Ausschalten gesendet - es wurde deaktiviert. Es kann keine Rede von irgendeiner Arbeit des Webservers sein, von der Arbeit mit Sensoren, der Steuerung von Aktuatoren und anderen Dingen, nichts davon wird einfach funktionieren.
Es stellte sich die Frage: Entweder verlassen wir die Bibliothek des Herstellers und schreiben unseren GPRS Shield-Steuercode (leicht zu sagen), oder wir verlassen das Modul selbst und suchen nach einer alternativen Lösung. Da das Modul jedoch bereits vorhanden ist, wurde beschlossen, die Bibliothek zu verlassen und Ihren Modulsteuercode zu schreiben.
Die Eroberung des Everest
Ich überspringe den gesamten Prozess der Erstellung des Codes, der die Standardbibliothek von Amperka ersetzt. Ich stelle nur fest, dass dies sehr, sehr schwierig war und erhebliche Forschungsarbeiten, die Kompilierung eines ausgeklügelten Algorithmus und erhebliche Anstrengungen zum Testen der resultierenden Lösung erforderte.
Alles wird für Sie einfach sein - ein wenig Magie und der vorgefertigte Arbeitscode des AMS-Moduls zur Unterstützung von GPRS Shield ist fertig.
Vollständiger AMS-Modulcode, der die Standardbibliothek ersetzt #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 "-"
Das Modul wurde auf AMS Version 0.16 für Arduino Mega entwickelt und getestet. Tests zeigten einen absolut stabilen und zuverlässigen Betrieb von GPRS Shield unter der Kontrolle dieses Moduls.
Stellen Sie eine Verbindung zum AMS GPRS Shield Support Module her
Um das GPRS Shield-Modul mit dem Arduino Mega Server zu verbinden, müssen Sie einige einfache Schritte ausführen. Fügen Sie zunächst die folgenden Zeilen zur AMS-Hauptdatei hinzu
#define GPRS_FEATURE
und
byte modulGprs = MODUL_NOT_COMPILLED;
in den entsprechenden Abschnitten. Dort müssen Sie Testvariablen hinzufügen, die in Ihrem realen Projekt für die gesteuerten Parameter (Temperatur, Kontaktstatus usw.) verantwortlich sind.
float lpTempTemp; byte lpContCont1; byte lpLeakLeak1; byte smokeSmoke; byte relayRelay; byte servoState;
Erläuterung der unterstützten Funktionen
Das Modul enthält einen grundlegenden Satz von Abfragen und Befehlen. Sie können diese Befehle jedoch durch andere ersetzen und / oder den grundlegenden Satz von Befehlen und Abfragen erweitern, die Sie benötigen.
Anfragen
Anfragen werden per SMS gesendet, das System sendet Antworten (auch per SMS) mit Informationen zum angeforderten Parameter. Ganz einfach: Wir senden die Anfrage „temp1“ vom Telefon, das System sendet daraufhin den aktuellen Temperaturwert
temp1=20.50
.
temp1 - Temperaturanforderung
cont1 - Kontaktstatus anfordern
Leck1 - Fordern Sie den Status des Lecksensors an
Rauch1 - Rauchmelderstatus abfragen
Relais1 - Status des Relais anfordern (Schlüssel)
servo1 - fordert den Status des Servo-Feeders an
Zeitraum - Anfrage für den Zeitraum der automatischen Telemetriepakete
all - fordert alle Systemparameter an
Als Antwort auf die Anforderung "Alle" sendet das System eine Liste aller Parameter. Wenn ein nicht registrierter Befehl gesendet wird, sendet das System eine Fehlerantwort. Wenn die überwachten Parameter außerhalb des normalen Bereichs liegen, kann das System selbst Alarmmeldungen an das Smartphone des Bedieners senden.
Um das System nur von einem registrierten Bediener verwalten zu können, ist das System vor unbefugtem Zugriff geschützt. Es reagiert nur auf Befehle einer bestimmten Telefonnummer.
Teams
Befehle werden per SMS gesendet, nachdem der Befehl akzeptiert wurde, ändert das System seinen Status und sendet Antworten mit Informationen über den neuen Status seiner Aktuatoren oder Einstellungen.
Relais1 = - Relaissteuerbefehl (Taste)
servo1 = - Feeder-Steuerbefehl
period = - Befehl zum Ändern der automatischen Sendeperiode für die Telemetrie
Ein Beispiel.
relay1=1
, Antwortrelais1
relay1=ON
.
relay1=0
, Antwortrelais1
relay1=OFF
.
Code-Erklärungen
Initialisierung des GPRS-Moduls. Standardinitialisierung des AMS-Moduls, Start von SoftwareSerial und ein wenig Magie von GSM AT-Befehlen. Der Zweck dieses Blocks besteht darin, das GPRS-Modul zum Leben zu erwecken und es aus dem Nirvana zurückzugeben, wenn es zu diesem Zeitpunkt aus irgendeinem Grund außerhalb unserer Kontrolle liegt.
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); }
Die Hauptarbeitsfunktion des Moduls. Alle 20 Sekunden sucht der Arduino Mega Server nach eingehenden SMS und führt diese bei Anfragen oder Befehlen aus. Infolgedessen beträgt die durchschnittliche Verzögerung bei der Ausführung des Befehls 10 Sekunden (mit Ausnahme der Verzögerung beim Senden von SMS-Nachrichten durch den Telekommunikationsbetreiber). Dieses Intervall kann konfiguriert werden. 20 Sekunden werden als Kompromiss zwischen der Reaktionsgeschwindigkeit auf SMS-Befehle und dem Systemstart ausgewählt.
In diesen 20 Sekunden kann AMS alles tun, was es benötigt, und die in diesem Zeitraum eintreffende SMS geht nicht verloren. Bei Verwendung der Standardbibliothek kann das System nur auf das Eintreffen der SMS warten, andernfalls verliert es sie nur (und der Controller kann derzeit auch nichts tun).
Es gibt auch einen Telemetrie-Sendecode mit einem festgelegten Intervall von 1 Stunde, 6 Stunden, 12 Stunden oder 24 Stunden. Dieses Intervall kann durch Senden des entsprechenden Befehls per SMS geändert werden.
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; } }
Die Interaktion des GPRS-Moduls und der Steuerung erfolgt mit speziellen AT-Befehlen, und die folgenden Funktionen bilden die GPRS-Modulbefehle in für sie verständlichen Codes.
SMS-Sendefunktion. In den Parametern der Funktion werden die Zieltelefonnummer und der Befehl oder die Anforderung in Textform übertragen.
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; }
SMS-Lesefunktion. Die akzeptierten Werte werden in die Variablen message, phone und datetime eingefügt, die jeweils den empfangenen Befehl, die Telefonnummer und die Sendezeit enthalten.
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")); } }
Die Funktion zum Bilden einer Antwort auf SMS-Anfragen und -Befehle. Diese Funktion ist für jedes Projekt spezifisch und kann in Ihren Projekten entsprechend der Logik Ihres Systems geändert werden.
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!")); }
Funktionen zur Bildung von Antworten. Hierbei handelt es sich um Funktionen, die die Antworten bilden, die das System gemäß dem festgelegten Programm als Antwort auf eine Anfrage oder nach eigenem Ermessen per SMS an das Smartphone des Benutzers sendet.
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()
Und die Funktionen der Befehlsausführung. Dies sind Funktionen, die von SMS-Befehlen ausgeführt werden und den Zustand des Systems ändern, d. H. Seine Einstellungen ändern oder Aktuatoren aktivieren oder deaktivieren.
void gprsSetRelay(byte v) void gprsSetServo(byte v)
Die übrigen Funktionen sind rein technischer Natur und erledigen die grobe Arbeit der Wartung der Interaktion zwischen dem GPRS Shield und dem Mikrocontroller.
Ein bisschen mehr über SoftwareSerial
All dies reicht nicht aus, damit GPRS Shield in einem transparenten Modus arbeitet und andere auf dem Mikrocontroller ausgeführte Prozesse nicht mehr blockiert. Es ist auch erforderlich, den Code der SoftwareSerial-Bibliothek zu ändern. Tatsache ist, dass sein Standard-64-Byte-Puffer nicht ausreicht, um die meisten AT-GSM-Befehle zu verarbeiten und eine dynamische Interaktion zwischen dem Modul und der Steuerung aufrechtzuerhalten.
Sie müssen diesen Puffer auf mindestens 128 Byte erhöhen. Erst danach funktioniert die Magie und das GPRS-Schild arbeitet im transparenten Modus normal. Dies erfolgt in der Datei
SoftwareSerial.h
. Linie
#define _SS_MAX_RX_BUFF 64
müssen zu ändern
#define _SS_MAX_RX_BUFF 128
Fazit
Sie sehen den Austausch von Bedienerbefehlen und Systemantworten auf dem Smartphone-Bildschirm. Und während das System Dutzende von Prozessen im Pseudo-Multitasking-Modus ausführt. Und GPRS Shield beanspruchte weniger als 1% der Prozessorzeit anstatt 99% wie zuvor, wodurch der Rest der Zeit für den Webserver und andere Aufgaben für die Verwaltung des Hühnerstalles frei wurde.
Das ist alles, wir haben GPRS Shield in
AMS integriert , alle Hindernisse überwunden, es in einem transparenten Modus arbeiten lassen, ohne andere Prozesse wie einen Webserver, den Betrieb von drahtlosen Sensoren und Aktoren zu blockieren, und dies eröffnet attraktive Perspektiven für den Aufbau einer großen Anzahl von Systemen mit GSM-SMS-Steuerung und Steuerung basierend auf AMS - Gewächshäuser, Sicherheits- und Heizungssysteme, verschiedene Optionen für ein intelligentes Zuhause usw. usw. nahezu unendlich.