Wir bauen eine Smart Home Zentrale mit ArduiTouch

Jetzt wirds ernst. Wir beginnen mit einem umfangreichen Projekt, wir wollen mit dem ArduiTouch eine SmartHome Zentrale realisieren, die bis zu 32 Remote-Devices auf Basis ESP8266 verwalten kann. Jedes dieser Geräte kann bis zu 8 Kanäle zur Kommunikation benutzen. Damit ihr schon mal seht wo die Reise hingeht, habe ich mich diesmal entschlossen zuerst einen zwar noch rudimentären aber voll funktionsfähigen Prototyp zu erstellen und zum Download zur Verfügung zu stellen.

Danach folgen Blog Beiträge mit detailierten Erklärungen zu den verwendeten Protokollen und Programmen. Da das gesamte Projekt aus einer Vielzahl von Dateien besteht, werde ich den Code nicht in diesem Beitrag veröffentlichen sondern auf GitHub zum Download bereitstellen. Das Repository TouchEvent enthält eine von mir entwickelte Bibliothek zum bequemen Verwalten von TouchScreen Ereignissen, das Repository ATMessageBuffer enthält Bibliotheken für einen Nachrichten Buffer zur Datenübertragung und schließlich das Repository ATSmartHome  es enthält eine Datenbank als Basis für dieses Projekt sowie Beispielprogramme  für die Smart Home Zentrale und für einen einfachen Client zur Temperaturmessung.

Um den Prototypen zu bauen braucht Ihr für die Zentrale einen ArduiTouch mit ESP32-Prozessor sowie für den Remote Temperatur Sensor einen D1Mini oder ein anderes ESP8266 Modul sowie einen oder zwei DS18B20 Temperatur-Fühler. Für den Temperatur Sensor wird folgende Schaltung verwendet:

 

 Zum ArduiTouch solltet ihr auch Hinweise in diesem Blog Beitrag beachten.

Als nächstes sollten die drei oben erwähnten Downloads von GitHub geholt werden. Die entpackten Ordner kopiert ihr einfach in das Arduino libraries Verzeichnis.

In den Beispielen für ATSmartHome-master findet sich ein Sketch ATSmartHome für die Zentrale und einer ESP8266Device für den Sensor.

 Der Sketch für die Zentrale sollte mit dem Board "ESP32 Dev Module" der für den Sensor mit dem Board "NodeMCU 1.0 (ESP-12E Module)" kompiliert werden. Nachdem beide Sketches kompiliert und auf das jeweilige Module hochgeladen wurden sollten wir am ArduiTouch das folgende Bild sehen.

Eventuell ist der untere blaue Balken zuerst ohne Text, dies sollte sich aber ändern sobald der Temperatursensor zum seine Werte gesendet hat. Wenn die Smart Home Zentrale Daten von einem unbekannten Gerät empfängt, wird die Id des unbekannten Gerätes im unteren blauen Balken angezeigt.

Wenn man zweimal schnell hintereinander auf den unteren blauen Balken tippt (Doppelklick) sollte die Registrierungsseite angezeigt werden. Achtung, falls die Brücke für den Programm-Download noch geschlossen ist funktioniert der Touch-Screen nicht!!

 Wenn man einen Doppelklick auf den Button "Registrieren" ausführt, wird das neue Gerät registriert und seine Messwerte können angezeigt werden. Führt man den Doppelklick auf dem "Zurück" Button aus, wird wieder die Hauptseite angezeigt ohne das Gerät zu registrieren.

Wurde das Gerät registriert, wird diese Information auch dauerhaft im SPI Filesystem des ESP32 gespeichert. Sobald die Zentrale wieder Daten vom Temperatursensor erhalten hat sollte folgendes Bild zu sehen sein.

Immer wenn neue Messwerte vom Temperatursensor empfangen werden, wird die Anzeige aktualisiert. Da die Registrierung dauerhaft gespeichert wurde, kann der ArduiTouch auch von der Stromversorgung getrennt werden ohne die registrierten Geräte zu vergessen.

Auf die gleiche Weise wie beschrieben können auch weitere Geräte registriert werden. In dieser Prototyp Version können die Registrierungsdaten im SPI-Filesystem nur durch Formatieren gelöscht werden. Dazu führt man einen Doppelklick auf den oberen blauen Balken aus. Es sollte die System Setup Seite angezeigt werden.

Ein Doppelklick auf "Format FS" formatiert das Filesystem und löscht alle Files. Nach Beendigung des Formatierens wird wieder die Hauptseite angezeigt. Falls der Temperatursensor weiterhin Daten sendet, wird er als unbkanntes Gerät erkannt und seine Id im unteren blauen Balken angezeigt.

Der Sketch für den Temperatursensor ist so eingestellt, dass er alle 10 Sekunden Messwerte sendet. Das ist zum Testen sehr praktisch. Für eine reale Anwendung sollte diese Zeit auf fünf Minuten oder mehr erhöht werden um den Stromverbrauch zu minimieren.

Wie ihr seht haben wir hier eine sehr einfache Smart Home Zentrale, bei der externe Sensoren registriert werden können deren Messwerte dann angezeigt werden.

Zum Abschluss noch ein paar Features die in zukünftigen Versionen realisiert werden sollen.

  • Anpassbare Darstellung der Messergebnisse
  • Mehrere Seiten zur Darstellung der Messergebnisse
  • Daten von der Zentrale auf entfernte Geräte senden (schalten, dimmen)
  • Verbindung der Smart Home Zentrale mit dem Internet und Uhrzeit Anzeige
  • Bedienung über Web-Seiten
  • Verbindung zu externen Diensten wie z.B. Cayenne
  • Erweiterung der Hardware. Verwendung des SD-Kartenlesers am Touch-Screen zum Loggen von Daten
  • Definition von Triggerwerten um abhängig von Messwerten Aktionen auszulösen

und noch viele andere schöne Dinge. Der Phantasie sind fast keine Grenzen gesetzt.

Wenn ihr mehr erfahren wollt wie dieser Prototyp arbeitet, sollte ihr meine kommenden Blog Beiträge lesen. Wenn Fragen oder Probleme auftreten, einfach einen Kommentar anfügen. Ich werde regelmäßig reinschauen und versuchen Fragen möglichst zeitnah zu beantworten.

Letzter Artikel Digispark als Eingabegerät
Neuer Artikel Kapazitives 16-Tasten Eingabefeld

Kommentar

Prechtl - April 5, 2019

Hallo brauche mal Hilfe :

Hardware : ArduiTouch mit AMICA V2.
Arduino IDE 1.8.5
TouchEventDemo läuft (nach dem ich die PINs richtig zugeordnet habe)

Das Sketch des ATSmartHome gibt nur Fehlermeldungen beim Kompillieren.

Und das für 70 € Hardware
Bin nicht ganz neu in diesem Bereich aber das geht mir nicht ein.

Also nach dem ich ALLE Repositorys geladen und und alle Lybraris überprüft habe
Fehlermeldungen. beim Kommpilieren.
z.B

In file included from C:\Users\Dev2\AppData\Local\Temp\arduino_modified_sketch_565310\ATSmartHome.ino:21:0:

ATWiFi.h:20: error: ‘esp_now_peer_info_t’ does not name a type

esp_now_peer_info_t info; ^

sketch\ATWiFi.h: In function ‘void initWiFi()’:

ATWiFi.h:26: error: ‘class WiFiClass’ has no member named ‘mode’

WiFi.mode(WIFI_AP_STA); ^

ATWiFi.h:26: error: ‘WIFI_AP_STA’ was not declared in this scope

WiFi.mode(WIFI_AP_STA); ^

ATWiFi.h:27: error: ‘class WiFiClass’ has no member named ‘softAP’

WiFi.softAP(“ATSmartHome”,APPWD,APCHANNEL,0); ^

sketch\ATWiFi.h: At global scope:

ATWiFi.h:54: error: ‘esp_err_t’ has not been declared

void printESP_Now_Err (String prefix, esp_err_t err) { ^

sketch\ATWiFi.h: In function ‘void printESP_Now_Err(String, int)’:

ATWiFi.h:56: error: ‘ESP_ERR_ESPNOW_BASE’ was not declared in this scope

case ESP_ERR_ESPNOW_BASE: Serial.println(prefix+" ESPNOW error number base"); break; ^

ATWiFi.h:57: error: ‘ESP_ERR_ESPNOW_NOT_INIT’ was not declared in this scope

case ESP_ERR_ESPNOW_NOT_INIT: Serial.println(prefix+"ESPNOW is not initialized"); break; ^

ATWiFi.h:58: error: ‘ESP_ERR_ESPNOW_ARG’ was not declared in this scope

case ESP_ERR_ESPNOW_ARG: Serial.println(prefix+"Invalid argument"); break; ^

ATWiFi.h:59: error: ‘ESP_ERR_ESPNOW_NO_MEM’ was not declared in this scope

case ESP_ERR_ESPNOW_NO_MEM: Serial.println(prefix+"Out of memory"); break; ^

ATWiFi.h:60: error: ‘ESP_ERR_ESPNOW_FULL’ was not declared in this scope

case ESP_ERR_ESPNOW_FULL: Serial.println(prefix+" ESPNOW peer list is full"); break; ^

ATWiFi.h:61: error: ‘ESP_ERR_ESPNOW_NOT_FOUND’ was not declared in this scope

case ESP_ERR_ESPNOW_NOT_FOUND: Serial.println(prefix+"ESPNOW peer is not found"); break; ^

ATWiFi.h:62: error: ‘ESP_ERR_ESPNOW_INTERNAL’ was not declared in this scope

case ESP_ERR_ESPNOW_INTERNAL: Serial.println(prefix+"Internal error"); break; ^

ATWiFi.h:63: error: ‘ESP_ERR_ESPNOW_EXIST’ was not declared in this scope

case ESP_ERR_ESPNOW_EXIST: Serial.println(prefix+"ESPNOW peer has existed"); break; ^

ATWiFi.h:64: error: ‘ESP_ERR_ESPNOW_IF’ was not declared in this scope

case ESP_ERR_ESPNOW_IF: Serial.println(prefix+"Interface error"); break; ^

sketch\ATWiFi.h: At global scope:

ATWiFi.h:71: error: ‘esp_err_t’ does not name a type

esp_err_t addPeer(const uint8_t mac6) { ^

sketch\ATWiFi.h: In function ‘void readESPNow(const uint8_t*, const uint8_t*, int)’:

ATWiFi.h:93: error: ‘esp_err_t’ was not declared in this scope

esp_err_t err; ^

ATWiFi.h:93: error: expected ‘;’ before ‘err’

esp_err_t err; ^

ATWiFi.h:121: error: ‘err’ was not declared in this scope

err = addPeer(mac_addr); ^

ATWiFi.h:121: error: ‘addPeer’ was not declared in this scope

err = addPeer(mac_addr); ^

ATWiFi.h:122: error: ‘ESP_OK’ was not declared in this scope

if (err == ESP_OK) { ^

ATWiFi.h:123: error: invalid conversion from ‘const uint8_t* {aka const unsigned char*}’ to ‘u8* {aka unsigned char*}’ [-fpermissive]

err = esp_now_send(mac_addr, buf, sz); ^

In file included from sketch\ATWiFi.h:5:0,

from C:\Users\Dev2\AppData\Local\Temp\arduino_modified_sketch_565310\ATSmartHome.ino:21:

C:\Users\Dev2\Documents\Arduino\libraries\ATSmartHome-master/esp_now.h:53:5: error: initializing argument 1 of ‘int esp_now_send(u8*, u8*, int)’ [-fpermissive]

int esp_now_send(u8 *da, u8 *data, int len); ^

In file included from C:\Users\Dev2\AppData\Local\Temp\arduino_modified_sketch_565310\ATSmartHome.ino:21:0:

sketch\ATWiFi.h: In function ‘void sendData(uint16_t)’:

ATWiFi.h:136: error: ‘esp_err_t’ was not declared in this scope

esp_err_t err; ^

ATWiFi.h:136: error: expected ‘;’ before ‘err’

esp_err_t err; ^

ATWiFi.h:149: error: ‘err’ was not declared in this scope

err = addPeer(buf); ^

ATWiFi.h:149: error: ‘addPeer’ was not declared in this scope

err = addPeer(buf); ^

ATWiFi.h:150: error: ‘ESP_OK’ was not declared in this scope

if (err == ESP_OK) { ^

sketch\ATWiFi.h: In function ‘boolean initESPNow()’:

ATWiFi.h:160: error: ‘ESP_OK’ was not declared in this scope

boolean result = (esp_now_init() == ESP_OK); ^

ATWiFi.h:161: error: ‘info’ was not declared in this scope

info.channel = APCHANNEL; ^

ATWiFi.h:163: error: invalid conversion from ‘void ()(const uint8_t, const uint8_t*, int) {aka void ()(const unsigned char, const unsigned char*, int)}’ to ‘esp_now_recv_cb_t {aka void ()(unsigned char, unsigned char*, unsigned char)}’ [-fpermissive]

if (result) esp_now_register_recv_cb(readESPNow); ^

In file included from sketch\ATWiFi.h:5:0,

from C:\Users\Dev2\AppData\Local\Temp\arduino_modified_sketch_565310\ATSmartHome.ino:21:

C:\Users\Dev2\Documents\Arduino\libraries\ATSmartHome-master/esp_now.h:50:5: error: initializing argument 1 of ‘int esp_now_register_recv_cb(esp_now_recv_cb_t)’ [-fpermissive]

int esp_now_register_recv_cb(esp_now_recv_cb_t cb); ^

C:\Users\Dev2\AppData\Local\Temp\arduino_modified_sketch_565310\ATSmartHome.ino: In function ‘void setup()’:

ATSmartHome:35: error: no matching function for call to ‘fs::FS::begin(bool)’

if (SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) Serial.println(F(“SPIFFS loaded”)); ^

C:\Users\Dev2\AppData\Local\Temp\arduino_modified_sketch_565310\ATSmartHome.ino:35:43: note: candidate is:

In file included from C:\Users\Dev2\AppData\Local\Temp\arduino_modified_sketch_565310\ATSmartHome.ino:1:0:

C:\Users\Dev2\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\cores\esp8266/FS.h:107:10: note: bool fs::FS::begin()

bool begin(); ^

C:\Users\Dev2\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\cores\esp8266/FS.h:107:10: note: candidate expects 0 arguments, 1 provided

exit status 1
‘esp_now_peer_info_t’ does not name a type

Allso wie gehts weiter. Könnte mir jemand Hilöfestellung geben.
Komm alleine nicht weiter.
Danke
Thomas

Peter Necas - März 31, 2019

Ich habe bei der Inbetriebnahme der Zentrale noch einen Stein im Getriebe gefunden.
Das Display bleibt finster.
Grund: Das Layout wurde geändert, zur Stromversorgung der Display Beleuchtung wird bei den neuen Leiterplattenversion ein PNP-Transistor eingesetzt. Das Signal aus dem ESP wird beim Aktivieren auf HIGH gesetzt, das ist falsch. LOW steuert den Transistor durch!
Abhilfe: Entweder die Ansteuerung in der Software, z.B ATDisplay.h oder in der bertreffenden .ino ändern, oder einen NPN-Transistor einsetzen.
LG Peter

Gerald - März 12, 2019

Der fehlerhafte Link ist korrigiert

Eber37 - März 12, 2019

Interessantes Projekt für begrenztes SmartHome (Garten oder Garage).
Auf jeden Fall etwas zu Lernen.

Ich wollte mir den Hinweis zum ArduiTouch im “Blog Beitrag” ansehen.
Über den angezeigten Link komme ich jedoch nur zum Login für Shopify.

Ich würde mir eine Übersichtsseite wünschen, mit der ich schrittweise das Projekt nachbauen und weiter verfolgen kann.

Adi - März 4, 2019

UP Netzteil: z.B: RECOM AC/DC-Unterputz-Netzteil RAC03-3.3SER/277, 3,3 V DC, 900 mA, teuer aber sicher.

Thomas - Februar 28, 2019

Bitte vergiss nicht, einen einfachen Schalter einzubauen. Das ist manchmal nicht so einfach.

Bernd - Februar 28, 2019

Ich kann schon jetzt sagen super Blogserie, danke :)

Was ist denn eine sinnvolle fest UP installierbare Stromversorgung bei der nicht das haus abbrennt? ne Steckdose mit USB port?

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung überprüft werden

Erforderliche Angabe