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-12F 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.

ArduitouchEsp-nowEsp32Esp8266Smart homeSpiffsTft displayTouch screen

13 Kommentare

Andre

Andre

Kann mir mal einer erklären was das mit Kanal 0 (WLAN Kanal) bedeutet?? Meine Fritzbox hat keinen Kanal 0. (Benötigt die Zentrale WLAN???)

Sven Hesse

Sven Hesse

Hallo zusammen,

die Serie mit der SmartHome Zentrale finde ich persönlich super. So kann man sich in die Materie einarbeiten und muss es zwangsläufig auch, weil hier noch sehr viele Fehler enthalten sind.
Momentan arbeite ich daran, der Zentrale den Umgang mit 2 ESP8266 mit jeweils 4 und 8 Kanälen beizubringen, denn auch in der neuen Version sind maximal 8 Kanäle möglich.

Datahardy

Datahardy

Beim Kompilieren bin ich ebenfalls über den Fehler bei
database.clearDevices(ATDEVICEFILE);
gestolpert.
Nun, es liegt daran, dass die Funktion kein Argument erwartet, sondern zum Entfernen derselben schlicht und einfach über die registrierten Devices iteriert wird. Also in der ATDisplay.h im Sketch bitte ATDEVICEFILE löschen.

Wenn man ein aktuelles ArduiTouch verwendet bitte auch die Kommentarzeichen entfernen, wie nachfogend dargestellt.

//Shoud be defined if a Ardui-Touch version 01-02 or higher is used
#define ARDUITOUCH0102

Viel Erfolg
Datahardy

Christian

Christian

Wenn ich ESP8266Device versuche zu kompilieren erhalte ich die Fehlermeldung
" ‘class EspClass’ has no member named ‘rtcUserMemoryWrite’ ". Hat jemand eine Idee wie ich das Problem lösen kann? Ich benutze die Arduino Version 1.8.10.

Vielen Dank schon mal soweit

Christian

Steffen

Steffen

Hallo, ich bin auch dabei, mir eine SmartHome-Zentrale aufzubauen.
Dabei geht es mir später um die Aufzeichnung der Temperaturwerte an meiner Heizungsanlage.
Bei der Compilierung des Sketches bin ich über den gleichen Fehler wie Andreas gestolpert.
Es gibt ein Problem mit dem Befehl:
database.clearDevices(ATDEVICEFILE)

Wenn dieser Befehl ausgeklammert wird, läuft der Sketch durch.
Gerald, kannst Du uns helfen?

Viele Grüße aus Potsdam
Steffen

Andreas

Andreas

Danke für das interessante Projekt.
Dazu eine Frage. Beim compilieren erhalte ich nur eine Fehlermeldung. Wenn ich die Zeile ausklammere, läuft der Compiler ohne Fehler durch. Warum aber entsteht der Fehler:

database.clearDevices(ATDEVICEFILE);
in der Datei ATDisplay.h

Der Fehler lautet:
In file included from C:\Users\anbau\AppData\Local\Temp\arduino_modified_sketch_946137\ATSmartHome.ino:4:0:

C:\Users\anbau\Documents\arduino-1.8.10\libraries\ATSmartHome-master/AT_Database.h:190:11: note: candidate: boolean AT_Database::clearDevices()

boolean clearDevices();

C:\Users\anbau\Documents\arduino-1.8.10\libraries\ATSmartHome-master/AT_Database.h:190:11: note: candidate expects 0 arguments, 1 provided

Hat jemand vielleicht einen Tipp, wo ich da suchen muss? Ich bin ratlos.

Viele Grüße aus Hamburg,
Andreas

Prechtl

Prechtl

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

Peter Necas

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

Gerald

Der fehlerhafte Link ist korrigiert

Eber37

Eber37

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

Adi

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

Thomas

Thomas

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

Bernd

Bernd

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?

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert