Smarthome Zentrale mit ArduiTouch Teil 3  - Aktor Device mit D1Mini und Relais - AZ-Delivery

Diesmal wollen wir unser SmartHome um ein passives Geràt erweitern, das mit einem Relais dazu geeignet ist auch Steckdosen oder Netzverbraucher zu schalten. Wir verwenden wieder einen D1Mini zusammen mit einem Relais-Modul. Die Schaltung dazu ist sehr einfach.

 

dessin:

 

bibliothèque pour WiFi
#include <ESP8266WiFi.h>

bibliothèque pour le protocole de message utilisé
#include "AT_MessageBuffer.h"

bibliothèque pour ESP Now
Extern "C" {   #include <espnow espnow.h>
}

SSID à la recherche de
#define GW_SSID "ATSmartHome"

drapeau pour changer les messages de débogic à larine
#define Debug Vrai

#define SEND_TIMEOUT 2000  2 Temps d’arrêt Sekunden 

#define INTERVALL (EN ANGLAIS) 10000 intervalle de 10 secondes

définir les canaux du relais
#define CHANNEL_RELAIS 0

Épingles pour connecter les capteurs
#define RELAIS_PIN 2 GPIO2

Structure de données pour enregistrer l’adresse MAC du serveur
et un checksum dans la mémoire du CRTC
Struct MEMORYDATA (EN) {   uint32_t crc32; checksum pour validation   uint8_t Mac[6];
};

Adresse MAC et chaîne WLAN
MEMORYDATA (EN) statinfo;
temps quand la dernière envoyé
uint32_t last_sent = 0; Timestamp pour la dernière envoyé
uint8_t relais_status = 0; l’état actuel du relais
String mymac (mymac); propre adresse mac

nous avons deux tampons de message pour envoyer et recevoir
AT_MessageBuffer sendmsg;
AT_MessageBuffer rcvmsg;

écrire le serveur MAC et le checksum à la mémoire du CCF
Vide Mise à jourRtcMemory() {     uint32_t crcOfData =AT_CalculateCRC32(((uint8_t*) &statinfo) + 4, Sizeof(statinfo) - 4);     statinfo.crc32 = crcOfData;     Esp.rtcUserMemoryWrite(0,(uint32_t*) &statinfo, Sizeof(statinfo));
}

recherche du point d’accès
Vide ScanForSlave() {   Bool esclaveFound = 0;      int8_t scanResults = Wifi.scanNetworks (scanNetworks)();   réinitialiser chaque analyse   Si (Debug) Série.println("Scan fait");   Si (scanResults == 0) {     Si (Debug) Série.println("Aucun appareil WiFi en mode AP trouvé");   } Autre {     Si (Debug) Série.Imprimer("Trouvé");      Si (Debug) Série.Imprimer(scanResults);      Si (Debug) Série.println(" dispositifs ");     Pour (Int  = 0;  < scanResults; ++) {       Imprimer SSID et RSSI pour chaque appareil trouvé       String Ssid = Wifi.Ssid();       int32_t RSSI RSSI = Wifi.RSSI RSSI();       int32_t Lch = Wifi.Canal();       String BSSIDstr = Wifi.BSSIDstr();       Si (Debug) {         Série.Imprimer( + 1);         Série.Imprimer(": ");         Série.Imprimer(Ssid);         Série.Imprimer(" /");         Série.Imprimer(Lch);         Série.Imprimer(" (");         Série.Imprimer(RSSI RSSI);         Série.Imprimer(")");         Série.println("");       }       Retard(10);       Vérifiez si l’appareil actuel commence par ATSmartHome'       Si (Ssid == GW_SSID) {         SSID d’intérêt         Si (Debug) {           Série.println("J’ai trouvé un esclave.");           Série.Imprimer( + 1); Série.Imprimer(": "); Série.Imprimer(Ssid); Série.Imprimer(" ["); Série.Imprimer(BSSIDstr); Série.Imprimer("]"); Série.Imprimer(" ("); Série.Imprimer(RSSI RSSI); Série.Imprimer(")"); Série.println("");         }         Int Mac[6];         obtenir le serveur MAC et enregistrer à la mémoire RTC         Si ( 6 == sscanf(BSSIDstr.c_str(), "%x:%x:%x:%x:%x:%x%c",  &Mac[0], &Mac[1], &Mac[2], &Mac[3], &Mac[4], &Mac[5] ) ) {           Pour (Int  = 0;  < 6; ++ ) {             statinfo.Mac[] = (uint8_t) Mac[];           }           Mise à jourRtcMemory();         }         esclaveFound = 1;         plus de recherche après AP a été trouvé         Pause;       }     }   }         Si (Debug) {     Si (esclaveFound) {       Série.println("Esclave trouvé, le traitement..");     } Autre {       Série.println("Esclave pas trouvé, essayant à nouveau.");     }   }   libérer RAM   Wifi.scanDelete();
}

Vide sendData() {   uint8_t buf buf[100]; tampon pour esp   uint8_t Sz = 100;   tampon de message clair   sendmsg.Clair();   Si (Debug) {     Série.println("Sende"+mymac (mymac));   }   sendmsg.setId setId(mymac (mymac));   ajouter le statut de relais actuel comme message boolean au tampon   sendmsg.addSwitchOut(relais_status != 0,CHANNEL_RELAIS);   remplir le tampon et envoyer le contenu au centre de contrôle   Si (sendmsg.fillBuffer (en)(buf buf,&Sz)) esp_now_send(Null, Buf Buf, Sz);   rappelez-vous le temps de calculer l’intervalle   last_sent=Millis();
}

rappel sur recevoir des messages de ESP-Now
Vide lireESPNow(uint8_t *mac_addr, uint8_t *r_data, uint8_t data_len) {   PAQUET ATDATA Données;   uint32_t newstatus (newstatus);   copier les données reçues dans le tampon de réception de message   rcvmsg.lireBuffer(r_data);   Si (mymac (mymac).égaltignoreCase(rcvmsg.Getid Getid())) {     n’accepter que les messages pour cet appareil     Si (rcvmsg.getPackets getPackets() > 0) {       avons-nous obtenu un paquet de données       Données = rcvmsg.Getdata(0);       Si (Debug) {         Série.Printf("Got data for channel %i value %i",Données.Canal, Données.Valeur[0]);       }         Si (Données.Canal == CHANNEL_RELAIS) {         si les données étaient pour le bon canal définir le nouveau statut         newstatus (newstatus) = Données.Valeur[0];         Si (newstatus (newstatus) != relais_status) {           si le statut a changé, nous l’exportons vers le relais           relais_status = newstatus (newstatus);           digitalWrite (en)(RELAIS_PIN,relais_status);           Si (Debug){             Série.Printf("Statut de relais - %i’n",relais_status);           }         }       }     }   }
}

Vide Configuration() {   Si (Debug) {     Série.Commencer(115200);      Série.println("Démarrer");   }   pinMode(RELAIS_PIN,Sortie);   digitalWrite (en)(RELAIS_PIN,relais_status);   obtenir l’adresse LOCALE MAC de l’utiliser comme id appareil   mymac (mymac) = Wifi.macAddress macAddress (en)();   Si (Debug) {     Série.Imprimer("Mon adresse MAC ");     Série.println(mymac (mymac));   }   Esp.rtcUserMemoryLiez(0, (uint32_t*) &statinfo, Sizeof(statinfo));   Si (Debug) Série.println("RTC fait");   uint32_t crcOfData = AT_CalculateCRC32(((uint8_t*) &statinfo) + 4, Sizeof(statinfo) - 4);   Wifi.Mode(WIFI_STA); Mode station pour nœud aktor esp-now   Si (Debug) Série.println("WifiMode");   Si (statinfo.crc32 != crcOfData) { si checksum différent, nous n’avons pas un serveur valide MAC     Si (Debug) Série.println("Scan pour esclave");     ScanForSlave();     pour (uint8_t i '0; i’lt;6;i') statinfo.mac[i] - gwmac[i];     Si (Debug) {       Série.Printf("Ce mac: %s",, Wifi.macAddress macAddress (en)().c_str());        Série.Printf("cible mac: %02x%02x%02x%02x%02x%02x%02x%02x"02x", statinfo.Mac[0], statinfo.Mac[1], statinfo.Mac[2], statinfo.Mac[3], statinfo.Mac[4], statinfo.Mac[5]);      }   }   Si (esp_now_init() != 0) {     Si (Debug) Série.println("ESP_Now init a échoué");     Esp.Redémarrer();   }   ESP Maintenant Contrôleur   Wifi.setAutoConnect(Faux);   esp_now_set_self_role(3); (ESP_NOW_ROLE_CONTROLLER);   uint8_t Ch = esp_now_get_peer_channel(statinfo.Mac);   Si (Debug) Série.Printf("Canal - %i’r"n",Ch);   initialiser les données peer   Int Res = esp_now_add_peer(statinfo.Mac, ESP_NOW_ROLE_CONTROLLER, 1, Null, 0);   Si (Res==0) Série.println("Réussi jumelé");   rappel d’enregistrement   esp_now_register_recv_cb(lireESPNow); 
}

Vide Boucle() {   envoyer des messages au centre de contrôle sur une base régulière   Si ((Millis() - last_sent) > Intervalle) {  l’intervalle pour envoyer des données modifier ceci si nécessaire     sendData();   }
}

 

 

Pour le programme, l’ESP8266Wifi.h et le espnow.h espnow.h Bibliothèque pour l’ESP8266. En outre, la bibliothèque est ATMessageBuffer pour SmartHome.

Le panneau de contrôle SmartHome doit également être connecté aux dernières bibliothèques ATMessagebuffer, ATSmartHome (en) Et TouchEvent (TouchEvent) Compilé. Dans les exemples d’ATSmartHome, vous trouverez également des croquis ci-dessus.

Après que les programmes ESP8266Switch et ATSmartHome ont été compilés à partir des exemples de la bibliothèque AT_SmartHome et téléchargés sur le D1Mini ou ArduiTouch, le FileSystem devrait d’abord être formaté sur le siège de SmartHome, que j’ai changé la structure de données du fichier config lors de cette mise à jour. Mais ce n’est pas trop mal car nous n’avons pas été en mesure de faire des paramètres manuels dans les versions précédentes.

Après une réinitialisation du panneau de contrôle et le début du D1Mini, son adresse MAC doit être affichée dans la barre bleue inférieure.

Un double clic sur cette barre nous mènera à la page d’inscription.

Après avoir double clic sur Register, l’écran retourne à la page principale et nous devrions voir l’image suivante.

Si vous touchez brièvement à ce bouton, allumez le reais et éteignez-le à nouveau avec une autre touche courte. La couleur de fond du bouton passe du gris au vert clair.

Bien sûr, vous pouvez utiliser les deux modules capteur et commutateur en même temps (voir image de couverture).

Amusez-vous à essayer et à expérimenter.

Esp-8266Projekte für fortgeschritteneSmart home

7 commentaires

Birger T

Birger T

Das in der Einleitung verlinkte Relais mit Kontakten für 50V/3 ist nicht zum Schalten von Steckdosen und Netzverbrauchern geeignet. Wollte ich nur mal erwähnen, weil ich auch diesen Blog Beitrag gelesen habe
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/entwurf-sicherheit-sicherheit

Jörg Reinisch

Jörg Reinisch

@OGGIN→
Ich weiß ja beim besten Willen nicht was ich noch alles versuchen soll.
Ich habe die Erweiterung des Sketch, so wie du es hier geschrieben hast, auch eingegeben.
Ich habe einen D1 Mini Pro, von der Beschaltung her eigentlich nicht anders.
Nur kann ich beim besten Willen in keinem Fall das zweite Relais ansteuern, obwohl ich es auch auf meiner Anzeige im Display als Switch 1 stehen habe,
Ich kann dir ja gern mal den Sketch zukommen lassen, vielleicht findest du ja den Fehler den ich verzweifelt suche.

Jörg

Jörg

Die ganze Schaltung und Programmierung an sich ist schon wirklich ein wunderbares Spielfeld.
Im Großen und Ganzen macht die Schaltung ja auch genau das was sie eigentlich machen sollte……
eigentlich!?!?
Ich hab nur das Problem dass wenn ich mein Relais auschalten lassen will, diese eingeschaltet wird und genau auch umgekehrt. Ich bin auch schier am Verzweifeln und finde nicht die Stelle an der ich diesen ominösen Umstand umkehren kann…..
Kann mir einer auf die Sprünge helfen?

Oggin

Oggin

Hallo Sven,
ich habe den ESP8266Switch.ino Sketch erweitert für zwei Relais (den Namen Relais habe ich nach Relais1 u. 2 erweitert). Habe den Code Auszugsweise in mehren Teil-Abschnitten des Sketchs kopiert, wie folgt:

//Pins to connect the sensors
#define RELAIS2_PIN 2 //GPIO2 ESP8266-01
#define RELAIS1_PIN 0 //GPIO0 ESP8266-01

// Beide Relais werden invers angesteuert
uint8_t relais1_status = 1; //current status of the relais
uint8_t relais2_status = 1; //current status of the relais

sendData:
sendmsg.addSwitchOut(relais1_status != 0,CHANNEL_RELAIS1);
sendmsg.addSwitchOut(relais2_status != 0,CHANNEL_RELAIS2);

if (data.channel == CHANNEL_RELAIS1) {
//if the data were for the right channel set the new status
newstatus = data.value0;
if (newstatus != relais1_status) {
//if the status has changed we export it to the relais
relais1_status = newstatus;
digitalWrite(RELAIS1_PIN,!(relais1_status));
if (DEBUG){
Serial.printf(“Relais1 status = %i\n”,relais1_status);
}
}
}
if (data.channel == CHANNEL_RELAIS2) {
//if the data were for the right channel set the new status
newstatus = data.value0;
if (newstatus != relais2_status) {
//if the status has changed we export it to the relais
relais2_status = newstatus;
digitalWrite(RELAIS2_PIN,!(relais2_status));
if (DEBUG){
Serial.printf(“Relais2 status = %i\n”,relais2_status);
}
}
}
}
}

Setup:
pinMode(RELAIS1_PIN,OUTPUT);
pinMode(RELAIS2_PIN,OUTPUT);
digitalWrite(RELAIS1_PIN,!(relais1_status));
digitalWrite(RELAIS2_PIN,!( relais2_status));

-——————
Das ist es im Wesentlichen.
Kann Dir den Sketch auch per Mail schicken, dazu brauche ich aber Deine Mail-Adr.
Gruß
Oggin

Sven Hesse

Sven Hesse

Jetzt muss ich einfach mal fragen – entweder habe ich einen Denkfehler oder ich mache etwas falsch.

Man kann doch mit dem D1 Mini auch mehrere Relais steuern …..wie aber bekomme ich die Informationen dazu ( Relais_Channel, Relais_Pin) auch in den Sketch.
Ich habe nun schon so viel probiert, bekomme es aber einfach nicht hin :-(.
Kann mir jemand einen Denkanstoß geben?

Sven Hesse

Sven Hesse

Die Registrierungsseite für neue Geräte (ESP8266/D1 Mini) wird nicht mittels Doppelklick auf den blauen Balken erreicht, sondern indem man lange auf den blauen Balken drückt.

In der SmartHome.ino wird auch ein AP-Passwort initiiert, im Sketch für den D1 Mini jedoch nicht definiert.
Entweder man definiert hier kein AP-Passwort oder initiiert eben eines für die D1-Mini.

Peter Necas

Peter Necas

Zu meinem gestrigen Kommentar betreffend Display bleibt dunkel.
Inzwischen habe ich die Zeilen:
#ifdef ARDUITOUCH0102
digitalWrite(TFT_LED, LOW);
gefunden. Damit ist mein Kommentar gegenstandslos,

Besten Dank,
Peter.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery