Fortsetzung folgt. Der vorherige Teil .
Inhaltsverzeichnis:
Zentraleinheit. Software
Schließlich kamen wir zu dem schwierigsten Teil für jeden Programmierer - in menschlichen Begriffen zu beschreiben, was er dort getan hatte.
Der Quellcode für den Server umfasst ungefähr 1300 Zeilen, einschließlich Einrückungen, aber dies sollte Sie nicht erschrecken. Der Quelltext enthält detaillierte Kommentare. In dieser Hinsicht werde ich mich nicht irren, wenn ich sage, dass meine Quellen besser beschrieben werden als alle anderen, die Sie nur finden können. In den Kommentaren direkt im Quellcode finden Sie alle Pinbelegungen zum Anschließen von Modulen und alle notwendigen Links zu externer Dokumentation. Das Geheimnis ist einfach: Ich habe ständig „im Laufe des Stücks“ Kommentare für mich geschrieben, sodass ich keine Schwierigkeiten mit der Dokumentation hatte.
Wie ich bereits geschrieben habe, können Sie beginnen, ohne alle Module zur Hand zu haben. Sie können beispielsweise ohne Funkmodul oder ESP8266 starten. Möglicherweise fehlt auch der Luftdrucksensor BMP180. Später hinzufügen. In diesem Fall müssen Sie (möglicherweise) in der Skizze unabhängig voneinander die Abschnitte des Codes kommentieren, die für die Interaktion mit fehlenden Blöcken verantwortlich sind. Dies ist jedoch höchstwahrscheinlich nicht erforderlich. Die Hauptsache ist, dass sich zumindest etwas angesammelt und verdient hat, dann macht es mehr Spaß, weiterzumachen.
Insbesondere haben wir zu diesem Zeitpunkt in der Geschichte noch kein fensterloses (externes) Modul zusammengestellt und haben keinen eigenen Webserver mit einer Datenbank. Wir benötigen ihn noch nicht (aber wenn ja, schließen Sie ihn sofort an, damit Sie nicht graben müssen):
- Funkmodul nRF24L01 +
- WiFi-Modul ESP8266.
Und dennoch werde ich wahrscheinlich mit dem ESP8266 beginnen, der bei der Programmierung und Bedienung des Moduls am problematischsten ist. Der Grund liegt in der unterschiedlichen Leistung der Module selbst und ihrer Firmware.
Da ich Standard-AT-Firmware dafür geschrieben habe, gibt es eine Reihe von Nachteilen:
- sie sind noch feucht (Stand 2016)
- Ich konnte keine normale Bibliothek für Arduino finden, um das ESP8266-Modul mit AT-Befehlen zu steuern. Ich musste selbst eine "Kollektivfarm" einrichten.
Ich habe den Code für ESP8266 nicht in einer separaten Bibliothek formatiert, sondern einfach die erforderlichen Funktionen geschrieben, sodass die Skizze so lange herauskam. Außerdem habe ich nur die Funktionalität implementiert, die ich brauche. Die gesamte Programmierung für ESP mit AT-Befehlen besteht darin, Zeichenfolgen zu analysieren und Verzögerungen zwischen Befehlen festzulegen.
Den Quellcode für den Server (Zentralmodul) server.ino finden Sie hier .
Als nächstes habe ich die Firmware für den ESP8266 in die firmware/AT23-SDK101-nocloud.bin
und die Dokumentation für Neugierige befindet sich im selben Verzeichnis. Durch Flashen der angegebenen Firmware können Sie sicher sein, dass meine Skizze mit WiFi wie beabsichtigt funktioniert. Ich habe nicht mit anderer AT-Firmware experimentiert. Tatsache ist, dass ich es geschafft habe, die „erweiterte“ Nicht- AT-Firmware zu finden und sogar ein wenig an ihrer Erstellung teilzunehmen, die perfekt für unsere Zwecke geeignet ist ( hier ist es esp-link ). Wie so oft geschah jedoch alles, nachdem die Arbeiten an der aktuellen Version der Wetterstation abgeschlossen waren, und es wurde beschlossen, sie unverändert zu lassen.
Zu Beginn müssen Sie also die angegebene AT-Firmware flashen. Es gibt nichts Kompliziertes, aber auch Einfaches. Wie dies zu tun ist, wird häufig beschrieben, wenn im Netzwerk - ESP8266 - die Firmware verbunden und aktualisiert wird .
Da mein USB-TTL-Konverter nicht über genügend Strom verfügte und der USB-Anschluss ständig abfiel (dies ist eine Wende!), Habe ich das Modul für seine Firmware mithilfe der Methode „Arduino als einfacher USB-zu-Seriell-TTL-Konverter“ elektrisch angeschlossen.
Da ich unter Linux arbeite, habe ich esptool.py
mit esptool.py
. Zur Vereinfachung der Firmware habe ich eine kleine Zusatzplatine mit Schaltern (hier nicht beschrieben) „nakolhozil“.
Nach dem Flashen müssen Sie die Portgeschwindigkeit mit dem Befehl auf 57600 einstellen (da bei SoftSerial die Portgeschwindigkeit bei 115200 groß ist und keinen stabilen Betrieb garantiert)
AT+UART_DEF=57600,8,1,0,0
Als Nächstes müssen Sie die Standard-Arduino-IDE-Bibliotheken geringfügig ändern. Ändern Sie in der arduino/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h
die entsprechende Zeile in
#define _SS_MAX_RX_BUFF 128
arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h
in der Datei arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h
die entsprechenden Zeilen in
#define SERIAL_TX_BUFFER_SIZE 128 #define SERIAL_RX_BUFFER_SIZE 128
und in der Datei arduino/hardware/arduino/avr/cores/arduino/USBAPI.h
ändern Sie die entsprechende Zeile in
#define SERIAL_BUFFER_SIZE 128
Genau genommen ist das falsch, weil Wenn Sie das Arduino SDK aktualisieren, werden diese Dateien höchstwahrscheinlich überschrieben und Sie müssen alle Korrekturen erneut wiederholen. In der Wissenschaft müssen wir unsere eigene Bibliothek erfinden, die die angegebenen Werte manipuliert (wenn möglich), aber dies ist nicht jedermanns Sache.
Auf die eine oder andere Weise sind die vorläufigen Manipulationen vorbei.
Jetzt übergeben wir direkt den Code der Zentraleinheit (Server) server.ino
In den ersten Zeilen sollten Sie die Zugriffseinstellungen für Ihren WLAN-Punkt ändern
const String SSID = "..."; const String PASSWORD = "...";
Die Arbeit mit dem Webserver wird später ausführlich besprochen.
Die folgenden (auskommentierten) Debugging-Definitionen sind:
//#define DEBUG //#define DEBUG_RF //#define DEBUG_ESP //#define DEBUG_LOG_SD
Wenn etwas schief geht, können Sie es jederzeit auskommentieren, die Skizze neu kompilieren und neu laden und weitere Debugging-Informationen in der Konsole abrufen oder in eine Datei auf der SD-Karte schreiben. Und Sie können nur das auskommentieren, was Sie brauchen. Zum Beispiel das Modul nRF24L01 +? Dann kommentieren Sie nur DEBUG_RF usw. aus.
Als nächstes folgen ausführliche Kommentare mit Pinbelegung, Initialisierung und einer detaillierten Beschreibung der gesamten Peripherie.
Hier können Sie die Funkkanalnummer für nRF24L01 + ändern
#define RF_CHANNEL 73
Als nächstes kommt void setup()
, was aus den detaillierten Kommentaren dort hervorgeht. Nun und dann void loop()
, der Code für die Arbeit mit dem Webserver wird noch nicht berücksichtigt.
Nach dem Ausfüllen der Skizze wird Ihre Zentraleinheit zum Leben erweckt und zeigt Ihnen etwas, aber nicht sofort, sondern nach 10 Minuten - den Wert DELAY_LOCAL_SENSOR
. Sie können es natürlich ändern.
Das Display sollte Folgendes anzeigen: Raumtemperatur und Luftfeuchtigkeit (Daten vom DHT11-Sensor) und Luftdruck (vom BMP180).
Die folgenden Funktionen sind für die Anzeige auf dem LCD 16 × 4 verantwortlich:
void lcdClearRow(int row) // , void lcdPrintOutdoor(int temperature, int humidity, float voltage) // , void lcdPrintHome(int temperature, int humidity, int pressure) void lcdPrintInfo(char info[LCD_MAX_COLS]) void lcdPrintStatus() void lcdPrintLastSensorTime()
Das Display-Design des LCD1604 ist wie folgt.

Die erste (oberste) Zeile druckt ein stilisiertes Symbol (Walking Man), das das Wetter auf der Straße anzeigt (ging auf die Straße, ging die Straße hinunter). Ich habe mir das Symbol selbst ausgedacht. Wenn Sie also eine bessere Idee haben (die in 5 x 8 Pixel passt), können Sie sie in den Kommentaren angeben (als Byte-Array). Hier können Sie Pixelkunst üben. Benutzerdefinierter Zeichengenerator für HD44780-LCD-Module . In derselben Zeile wird die Spannung des Fenstermoduls gedruckt.
Die zweite Zeile druckt "Wetter im Haus" und atmosphärischen Druck. Das Haussymbol ist Standard und für jeden verständlich.
In der dritten Zeile gibt lcdPrintLastSensorTime()
, wie viel Zeit (in Sekunden) seit dem Zeitpunkt vergangen ist, an dem die letzten Messwerte der Sensoren auf der Straße bzw. durch ein Komma getrennt nach Hause gemessen wurden. Es ist nützlich zu wissen, dass die Wetterstation das Wetter von gestern nicht anzeigt. Tatsächlich handelt es sich hierbei um Debugging-Informationen, die in der endgültigen Version entfernt werden können.
In der letzten vierten Zeile des Bildschirms werden mit der Funktion lcdPrintStatus()
Statusinformationen gedruckt, wobei
- s ist ein lokaler Drucksensor
- e ist ein ESP8266-Modul
- Ich bin eine WiFi-Verbindung
- w ist die Verfügbarkeit des Webservers
- l - Protokolldatei auf der SD-Karte
Nach jeder dieser herkömmlichen Beschriftungen gibt es ein Plus- oder Minuszeichen, was bedeutet, dass keine oder fehlerhafte Probleme beim Betrieb der entsprechenden Module auftreten.
Zurück zur Frage der Wahl des Bügeleisens werde ich die Vorteile der Wahl eines LCD1604-Textdisplays gegenüber einem grafischen Display erläutern. Tatsache ist, dass LCD1604-Module, die in den meisten Fällen von verschiedenen Anbietern gekauft wurden, gleich und vorhersehbar sind und einfach zu programmieren sind. Was kann man nicht über Grafikdisplays sagen, obwohl man viel mehr darauf zeichnen und zeigen kann. Die Lesbarkeit eines Bildes aus einer Entfernung von mehreren Metern ist mit einer Textanzeige wieder besser. Ja, ja, Sie können eine größere Schrift auf einer grafischen Anzeige erstellen, aber wie viel können Sie darauf passen?
Weiter. Sobald Sie die Skizze ausfüllen und sicherstellen, dass alles ordnungsgemäß funktioniert, können Sie das Arduino Mega "Motherboard" wieder an eine externe Stromquelle anschließen. Oder lassen Sie es so wie es ist, verbunden mit dem USB des Computers, um all diese Schönheit in der Debug-Konsole zu sehen.
Wenn Sie nicht alle Blöcke zusammengesetzt haben, können Sie den unnötigen Code auskommentieren. Obwohl, ich wiederhole, es so funktionieren sollte, erhalten Sie einfach Fehlermeldungen in der Konsole. Wie kann man das umgehen?
Sie haben beispielsweise keinen Atmosphärendrucksensor BMP180 gekauft. In der server.ino- Skizze suchen wir nach den Linien, die für die Verbindung der entsprechenden Bibliotheken verantwortlich sind, in unserem Fall
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h>
Kommentar zu diesem Block.
Als nächstes beginnen wir in der Arduino IDE mit dem Kompilieren des Codes (nicht der Firmware) und schauen uns an, welche Zeilen der Compiler schwört. Wir kommentieren diese Zeilen. Wir wiederholen den Vorgang, bis der Code normal und fehlerfrei erfasst wird. Vor dem Bearbeiten empfiehlt es sich, eine Kopie der Skizze zu erstellen, damit nicht alle Vorgänge wiederholt werden, wenn der gewünschte Sensor aus dem sonnigen China ankommt.
Links zu den verwendeten Bibliotheken finden Sie im Quellcode. Wenn es keinen solchen Link gibt, wurde die Standard-Arduino-IDE-Bibliothek verwendet.
Nur für den Fall, dass alle Bibliotheken (außer den Standardbibliotheken), die ich verwendet habe , im Bibliotheksverzeichnis gespeichert sind. Genau genommen ist das falsch. Sie sollten die neuesten Versionen von Bibliotheken aus ihren offiziellen Repositories herunterladen (mit behobenen Fehlern, neuen Funktionen). Falls sie jedoch schwer zu finden sind, werden sie entweder bereits gelöscht oder alte Versionen werden nicht unterstützt. Nur für diesen Fall habe ich alle verwendeten Bibliotheken gespeichert.
Als nächstes wird der Wandler zusammengebaut, sodass dieser Teil kurz herauskam, um sich nicht zu vermischen.