Slimme woning ArduiTouch hoofdkwartier op deel 3 - apparaat met Aktor D1Mini en door te geven

Deze keer willen we onze slimme woning uitbreiden door een passief apparaat dat geschikt is een relais met daarnaast ook over te schakelen netto afzetmogelijkheden of consumenten. We gebruiken er eentje weer D1Mini Samen met een Relais module. Het circuit is bovendien zeer eenvoudig.

 

Sketch.

 

//library voor WiFi
# include <ESP8266WiFi.H>

Voor de gebruikte //library message protocol
# include "AT_MessageBuffer.h"

Voor nu //library ESP
extern "C" {   # include <espnow.H>
}

//SSID te zoeken
# define GW_SSID "ATSmartHome"

//flag debug-berichten om over te stappen op
# define DEBUGGEN Waar

# define SEND_TIMEOUT 2000  Time-out //2 seconden 

# define INTERVAL 10000 //interval = 10 seconden

//define kanalen voor het relais
# define CHANNEL_RELAIS 0

//Pins te verbinden de sensor
# define RELAIS_PIN 2 //GPIO2

//Data structuur redt server voor MAC adres
//and een controlesom inRTC geheugen
struct MEMORYDATA {   uint32_t : crc32; //checksum voor validatie   uint8_t Mac[6];
};

//MAC adres en WLAN kanaal
MEMORYDATA statinfo;
Toen stuurde //time lezen
uint32_t last_sent = 0; //Timestamp stuurde om te lezen
uint8_t relais_status = 0; //current status van de relais
String mymac; //own Mac adres

//we twee boodschap hebben voor buffer voor verzenden en ontvangen
AT_MessageBuffer sendmsg;
AT_MessageBuffer rcvmsg;

//write MAC servers en RTC controlesom te geheugen
Leegte UpdateRtcMemory() {     uint32_t crcOfData =AT_CalculateCRC 32(((uint8_t*) &statinfo) + 4, sizeof(statinfo) - 4);     statinfo.: crc32 = crcOfData;     ESP.rtcUserMemoryWrite(0,(uint32_t*) &statinfo, sizeof(statinfo));
}

Voor //search het toegangspunt
Leegte ScanForSlave() {   bool slaveFound = 0;      int8_t scanResults = WiFi.scanNetworks();   //reset op iedere scan   Als (DEBUGGEN) Serie.println("Scan gedaan.");   Als (scanResults == 0) {     Als (DEBUGGEN) Serie.println("Geen WiFi apparaten van AP mode gevonden");   } Anders {     Als (DEBUGGEN) Serie.Afdrukken("Gevonden");      Als (DEBUGGEN) Serie.Afdrukken(scanResults);      Als (DEBUGGEN) Serie.println("hulpmiddelen");     Voor (int Ik = 0; Ik < scanResults; ++Ik) {       SSID RSSI //print en voor elk apparaat gevonden       String SSID = WiFi.SSID(Ik);       int32_t RSSI = WiFi.RSSI(Ik);       int32_t chl = WiFi.Kanaal(Ik);       String BSSIDstr = WiFi.BSSIDstr(Ik);       Als (DEBUGGEN) {         Serie.Afdrukken(Ik + 1);         Serie.Afdrukken(": ");         Serie.Afdrukken(SSID);         Serie.Afdrukken(" /");         Serie.Afdrukken(chl);         Serie.Afdrukken(" (");         Serie.Afdrukken(RSSI);         Serie.Afdrukken(")");         Serie.println("");       }       Vertraging(10);       Als de huidige //check apparaat begint met 'ATSmartHome       Als (SSID == GW_SSID) {         //SSID van belang         Als (DEBUGGEN) {           Serie.println("Vond ik een slaaf.");           Serie.Afdrukken(Ik + 1); Serie.Afdrukken(": "); Serie.Afdrukken(SSID); Serie.Afdrukken(" ["); Serie.Afdrukken(BSSIDstr); Serie.Afdrukken("]"); Serie.Afdrukken(" ("); Serie.Afdrukken(RSSI); Serie.Afdrukken(")"); Serie.println("");         }         int Mac[6];         De MAC //get servers en redt RTC te geheugen         Als ( 6 == sscanf(BSSIDstr.c_str(), "%x:%x:%x:%x:%x:%x%c",  &Mac[0], &Mac[1], &Mac[2], &Mac[3], &Mac[4], &Mac[5] ) ) {           Voor (int ii = 0; ii < 6; ++ii ) {             statinfo.Mac[ii] = (uint8_t) Mac[ii];           }           UpdateRtcMemory();         }         slaveFound = 1;         //no keer zoeken naar wat anus gevonden AP         breken;       }     }   }         Als (DEBUGGEN) {     Als (slaveFound) {       Serie.println("Slaaf gevonden verwerken.");     } Anders {       Serie.println("Slaaf niet gevonden, opnieuw proberen.");     }   }   //release RAM   WiFi.scanDelete();
}

Leegte sendData() {   uint8_t Buffer[100]; //buffer helderziendheid   uint8_t sz = 100;   Buffer //clear boodschap   sendmsg.Duidelijk();   Als (DEBUGGEN) {     Serie.println("Stuurt"+mymac);   }   sendmsg.setId(mymac);   Huidige status //add relais Ace een boodschap aan de Booleaanse buffers   sendmsg.addSwitchOut(relais_status != 0,CHANNEL_RELAIS);   //fill de buffers en sturen de inhoud aan het controlecentrum   Als (sendmsg.fillBuffer(Buffer,&sz)) esp_now_send(NUL, Buffer, sz);   //remember de tijd te berekenen interval   last_sent=millis();
}

//callback voor ontvangen berichten van ESP nu
Leegte readESPNow(uint8_t *mac_addr, uint8_t *r_data, uint8_t data_len) {   ATDATAPACKET Gegevens;   uint32_t newstatus;   //copy ontvangen data ontvangen bericht in buffer   rcvmsg.Lezen is buffer(r_data);   Als (mymac.equalsIgnoreCase(rcvmsg.getId())) {     //accept alleen berichten voor dit apparaat     Als (rcvmsg.getPackets() > 0) {       //did krijgen we een data pack       Gegevens = rcvmsg.getData(0);       Als (DEBUGGEN) {         Serie.printf("Zijn gegevens voor channel %i %i waarde \n",Gegevens.Kanaal, Gegevens.Waarde[0]);       }         Als (Gegevens.Kanaal == CHANNEL_RELAIS) {         De gegevens werden //if voor het juiste kanaal zetten het roer status         newstatus = Gegevens.Waarde[0];         Als (newstatus != relais_status) {           //if de status is veranderd, is er het exporteren naar de relais           relais_status = newstatus;           digitalWrite(RELAIS_PIN,relais_status);           Als (DEBUGGEN){             Serie.printf("Relay %i\n status =",relais_status);           }         }       }     }   }
}

Leegte Valstrik() {   Als (DEBUGGEN) {     Serie.beginnen(115200);      Serie.println("Start");   }   pinMode(RELAIS_PIN,OUTPUT);   digitalWrite(RELAIS_PIN,relais_status);   Lokale //get MAC adres te gebruiken het apparaat id ace   mymac = WiFi.macAddress();   Als (DEBUGGEN) {     Serie.Afdrukken("Micron van MAC adres =");     Serie.println(mymac);   }   ESP.rtcUserMemoryRead(0, (uint32_t*) &statinfo, sizeof(statinfo));   Als (DEBUGGEN) Serie.println("RTC gedaan.");   uint32_t crcOfData = AT_CalculateCRC 32(((uint8_t*) &statinfo) + 4, sizeof(statinfo) - 4);   WiFi.Mode(WIFI_STA); //Station mode van aktor ESP nu node   Als (DEBUGGEN) Serie.println("WifiMode");   Als (statinfo.: crc32 != crcOfData) { Controlesom //if verschillende die hebben we een geldige MAC server     Als (DEBUGGEN) Serie.println("Scan voor een slaaf");     ScanForSlave();     //for (uint8_t i = 0; i< 6; i) statinfo.mac [i] = [i] gwmac;     Als (DEBUGGEN) {       Serie.printf("Dit mac %s:", WiFi.macAddress().c_str());        Serie.printf("target mac X x x x x x", statinfo.Mac[0], statinfo.Mac[1], statinfo.Mac[2], statinfo.Mac[3], statinfo.Mac[4], statinfo.Mac[5]);      }   }   Als (esp_now_init() != 0) {     Als (DEBUGGEN) Serie.println("* Init ESP_Now heeft gefaald.");     ESP.Rust voor();   }   Nu //controller ESP   WiFi.setAutoConnect(Valse);   esp_now_set_self_role(3); // (ESP_NOW_ROLE_CONTROLLER);   uint8_t ch = esp_now_get_peer_channel(statinfo.Mac);   Als (DEBUGGEN) Serie.printf("= kanaal %i\r\n",ch);   Peer //initialize gegevens   int res = esp_now_add_peer(statinfo.Mac, ESP_NOW_ROLE_CONTROLLER, 1, NUL, 0);   Als (res==0) Serie.println("Gepaarde succesvol");   //register callback   esp_now_register_recv_cb(readESPNow); 
}

Leegte Lus() {   //send berichten aan het controlecentrum op regelmatige basis   Als ((millis() - last_sent) > INTERVAL) {  //interval data te versturen aan deze indien nodig     sendData();   }
}

 

 

Voor het programma dient de ESP8266Wifi.h en hen espnow.h Daarvan was de ESP8266. Bovendien hebben, nog steeds wordt de bibliotheek ATMessageBuffer Slimme woning voor nodig heeft.

Ook de slimme woning het hoofdkwartier heeft te gaan met de nieuwste bibliotheken ATMessagebuffer, ATSmartHome en Lucht geval worden opgesteld. In de voorbeelden te ATSmartHome haar tekening ook boven vindt.

Nadat de programma's en ESP8266Switch ATSmartHome aan het voorbeeld van de bibliotheek verzamelt en AT_SmartHome op de D1Mini of op de zeer ArduiTouch geladen, werd het bestandssysteem worden geformatteerd moeten eerst over de slimme woning hoofdkwartier, de dasich datastructuur van de Konfig bestand met deze update is veranderd. Dit is echter niet het andere slecht wij in het huidige versies nog steeds geen handmatige instellingen zou kunnen uitvoeren.

Na een Reset van de zetel en het begin van het Mac adres D1Mini zijn aangegeven moet worden in de onderste blauwe straal.

Een dubbelklik op de balk brengt ons de registratie op kant.

Na een dubbelklik op de registratie van het getoonde beeld verandert naar de centrale kant en daarom moeten wij het volgende plaatje.

Mocht er een badge moeten omschakelen kort ingegaan op de Reaal en ga bij nog eens met een andere korte aanraking. Trouwens, de achtergrondkleur van de wijzigingen van de badge grey op helder groen.

Hij is er uiteraard sensor modules en over te schakelen op hetzelfde moment (foto zie titel).

Veel plezier met uitproberen en experimenteren.

Esp-8266Projekte für fortgeschritteneSmart home

6 Kommentare

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.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert