Vandaag andere uitbreidingen naast kleine wil ik jullie kennis laten maken met een andere verre apparaat van de waarden van de sensoren I2C BMP280 en / of onze Smarthomezentrale BME280 te leveren.
Het circuit is gebaseerd op één Mini D1 En de sensoren BMP280 en BME280. Omdat deze sensoren kunnen een adres van I2C of 0X77 0X76, vindt het programma automatisch uit die met adres sensor die ermee te maken had. Zonder veranderingen en levering van dossiernummer heeft uitgebracht van de 0X77 BMP280 het adres en de 280 BME 0X76 het adres.
Het circuit is wel makkelijk. De tact I2C houdt verband met de D1 D1 van Mini en de verbinding met de D2, D1 Mini. Met de BMP280 Chipselect beheer de gekoppeld moet worden aan het V 3.3, zodat de BMP280 begint in de I2C modus. De Mini in D1 we verbinden de ingang RESET D0 met de Pin (beheer mauve). Het programma gaat na de ESP8266 gewerkt in de diepe slaap. In dit verband is het van de wakker geworden na de ESP8266 tegen de tijd. Dat hierbij het Flashen een dit verband uit de weg geruimd moeten worden.
Sketch.
/* Wireless sensor en druk BMP280 of BME280 ESP nu ArduiTouch slimme woning Als het apparaat een server beschikken over een geldige MAC adres Een zoektocht wil made bve te vinden met een WLAN SSID ATSmartHome Gered worden lange Rabbethge ace ace stroomvoorziening wil de servers MAC adres wil worden onderbroken. Het protocol is zeer ESP nu bijna zo hoog voor de huidige netwerk zult zijn die worden verbruikt voor korte tijd (VS) alleen. Anus sturen de waarden, het apparaat Schakelaars voor vijf minuten in een diepe slaap mode met een zeer laag energieverbruik. */ //library voor WiFi # include <ESP8266WiFi.H> //libraries te gebruiken en BMP280 BME280 # include <Adafruit_Sensor.H> # include <Adafruit_BME280.H> # include <Adafruit_BMP280.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 voor de twee kanalen van de sensor # define CHANNEL_TEMP_BME 0 # define CHANNEL_PRESS_BME 1 # define CHANNEL_ALT_BME 2 # define CHANNEL_HUM_BME 3 # define CHANNEL_TEMP_BMP 4 # define CHANNEL_PRESS_BMP 5 # define CHANNEL_ALT_BMP 6 # define SEALEVELPRESSURE_HPA (1013.25) //Data structuur redt server voor MAC adres //and een controlesom inRTC geheugen struct MEMORYDATA { uint32_t : crc32; //checksum voor validatie uint8_t Mac[6]; }; De variabele //worldwide vluchtige bool callbackCalled; boolean hasBme = 0; boolean hasBmp = 0; //MAC adres en WLAN kanaal MEMORYDATA statinfo; AT_MessageBuffer MNG; Adafruit_BME280 bme; //I2C Adafruit_BMP280 bmp; //I2C //function te berekenen de controlesom uint32_t calculateCRC 32(const uint8_t *Gegevens, size_t Lengte) { uint32_t crc = 0xffffffff; Terwijl (Lengte--) { uint8_t C = *Gegevens++; Voor (uint32_t Ik = 0x80; Ik > 0; Ik >>= 1) { bool Beetje = crc & 0x80000000; Als (C & Ik) { Beetje = !Beetje; } crc <<= 1; Als (Beetje) { crc ^= 0x04c11db7; } } } Terugkeer crc; } //write MAC servers en RTC controlesom te geheugen Leegte UpdateRtcMemory() { uint32_t crcOfData = 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(); } //function sensor te initilize BME //try inwerkende adressen of 77 76 boolean initBme() { boolean status = bme.beginnen(0x77); Als (!status) status = bme.beginnen(0x76); Als (!status) { Serie.println("Kon vinden een geldige sensor BME280, bedrading controleren."); hasBme = Valse; Terwijl (1); } Terugkeer status; } //function sensor te initilize BMP //try inwerkende adressen of 77 76 boolean initBmp() { boolean status = bmp.beginnen(0x77); Als (!status) status = bmp.beginnen(0x76); Als (!status) { Serie.println("Kon vinden een geldige sensor BME280, bedrading controleren."); hasBme = Valse; Terwijl (1); } Als (status) { /* Standaardinstellingen datasheet */ uit bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Mode * actief Adafruit_BMP280::SAMPLING_X2, De overbemonstering Temp. */ /* Adafruit_BMP280::SAMPLING_X16, Druk */ /* overbemonstering Adafruit_BMP280::FILTER_X16, */ /* Filteren Adafruit_BMP280::STANDBY_MS_500); /* */ Stand-bytijd } Terugkeer status; } Leegte Valstrik() { Als (DEBUGGEN) { Serie.beginnen(115200); Serie.println("Start"); } Lokale //get MAC adres te gebruiken het apparaat id ace String strmac = WiFi.macAddress(); Als (DEBUGGEN) { Serie.Afdrukken("Micron van MAC adres ="); Serie.println(strmac); } MNG.setId(strmac); MNG.Duidelijk(); hasBme = initBme(); Als (hasBme && DEBUGGEN) { Serie.println("Sensor BME gevonden"); } hasBmp = initBmp(); Als (hasBmp && DEBUGGEN) { Serie.println("Sensor BMP gevonden"); } Mac //read server van RTC geheugen ESP.rtcUserMemoryRead(0, (uint32_t*) &statinfo, sizeof(statinfo)); Als (DEBUGGEN) Serie.println("RTC gedaan."); uint32_t crcOfData = calculateCRC 32(((uint8_t*) &statinfo) + 4, sizeof(statinfo) - 4); WiFi.Mode(WIFI_STA); //Station mode om ESP nu sensor 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(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("Een succesvolle combinatie"); //register callback esp_now_register_send_cb([](uint8_t* Mac, uint8_t sendStatus) { Als (DEBUGGEN) { Serie.Afdrukken("send_cb status, ="); Serie.Afdrukken(sendStatus); Serie.Afdrukken("te lozen."); char Mac string[50] = {0}; sprintf(Mac string,"X X X X X X", statinfo.Mac[0], statinfo.Mac[1], statinfo.Mac[2], statinfo.Mac[3], statinfo.Mac[4], statinfo.Mac[5]); Serie.println(Mac string); } callbackCalled = Waar; }); //set onder valse vlag callbackCalled = Valse; //start meting //Read waarden en voor het verzenden van redt Als (hasBme) { Als (DEBUGGEN){ Serie.Afdrukken("= temperatuur"); Serie.Afdrukken(bme.readTemperature()); Serie.println("* C"); Serie.Afdrukken("Druk ="); Serie.Afdrukken(bme.readPressure() / 100.0FA); Serie.println("hPa"); Serie.Afdrukken("Hoogte = ca."); Serie.Afdrukken(bme.readAltitude(SEALEVELPRESSURE_HPA)); Serie.println(ben "); Serie.Afdrukken("Vochtigheid ="); Serie.Afdrukken(bme.readHumidity()); Serie.println(" %"); } MNG.addCelsius(bme.readTemperature(), CHANNEL_TEMP_BME); MNG.addHektoPascal(bme.readPressure()/100.0FA, CHANNEL_PRESS_BME); MNG.addMeter(bme.readAltitude(SEALEVELPRESSURE_HPA), CHANNEL_ALT_BME); MNG.addPercent(bme.readHumidity(), CHANNEL_HUM_BME); } Als (hasBmp) { Als (DEBUGGEN) { Serie.Afdrukken(En de volgende("= temperatuur")); Serie.Afdrukken(bmp.readTemperature()); Serie.println("* C"); Serie.Afdrukken(En de volgende("Druk =")); Serie.Afdrukken(bmp.readPressure()); Serie.println("Pa".); Serie.Afdrukken(En de volgende("Hoogte circa =")); Serie.Afdrukken(bmp.readAltitude(SEALEVELPRESSURE_HPA)); /* Aangepast aan de lokale */ weersverwachting Serie.println(ben "); } MNG.addCelsius(bmp.readTemperature(), CHANNEL_TEMP_BMP); MNG.addHektoPascal(bmp.readPressure()/100.0FA, CHANNEL_PRESS_BMP); MNG.addMeter(bmp.readAltitude(SEALEVELPRESSURE_HPA), CHANNEL_ALT_BMP); } //copy datastructure in sendbuffer uint8_t Buffer[255]; uint8_t sz; sz = 255; Als (MNG.fillBuffer(&Buffer[0], &sz)) esp_now_send(NUL, Buffer, sz); //ZERO betekent afgeven aan alle collega's } Leegte Lus() { //wait dat de gegevens worden verzonden Als (callbackCalled || (millis() > SEND_TIMEOUT)) { Als (DEBUGGEN) Serie.println("Slaap"); Vertraging(100); //go gedurende 10 seconden in diepe slaap mode //wakeup door resetten //reset steelt en verwijderen van gegevens van RTCmemory ESP.deepSleep(10E6); } }
Zodat de tekening kunnen worden opgesteld, dient men naast de collectie voor de sensoren, de nieuwste versie van mij ATMessageBuffer Bibliotheek.
Vindt men de code van de sketch ook in het geval van de nieuwe versie van haar ATSmartHome Bibliotheek.
Na de slimme woning hoofdkwartier op het nieuwste land werden gebracht, stellen we de schets en laad hem in de Mini D1. Na een korte periode van het MAC adres vinden we de D1 in het onderste blauwe straal slimme woning hoofdkwartier van de Mini. We klikken ooit, lang (meer dan 3 seconden) over dit MAC-adres. De registratie is kant aangegeven. We kunnen een naam geven aan het apparaat en kunnen we later heeft geklikt op de nieuwe herinneringen die we meten waarden op het scherm te zien. Als hoofdkwartier in de slimme woning al geregistreerd waren andere apparaten, het kan ook zijn dat de nieuwe kanalen op één van de andere partijen worden genoemd. De automatische registratie zoekt vrije plaatsen op het scherm en geeft aan dat er nieuwe kanalen als de kleine Widgets.
Door de lange de Widgets Klik op één gaat aan de plaatselijke situatie en kan kant van uiterlijk veranderen en positie. Het volgende beeld toont een mogelijke configuratie als we allebei BMx gebruiken sensoren op hetzelfde moment.
Uiteindelijk nog steeds een kleine uitbreiding op de webpagina van een slimme woning hoofdkwartier. Indien een Widget Aktor is aangegeven is één, de mogelijkheid heeft om de verre apparaat wel meteen op de slimme woning hoofdkwartier zich aan een klik aanzetten of uitschakelen, en wel bij het Widget Aktor zie ook deel 3 van deze serie
Hier opnieuw de links naar alle voorgaande delen:
Veel plezier:)
10 Reacties
Franz Patzal
Hi Greg,
look in part 6:
Ein wichtiger Hinweis zu Beginn!
Die ArduiTouch Smarthome Zentrale funktioniert nur mit dem ESP32 stabil. Es zeigte sich, dass auf Grund des deutlich geringeren RAM des ESP8266 kein stabiler Betrieb möglich ist. Ich habe daher die Version für den ESP8266 wieder aus dem Repository entfernt. Die aktuelle Version der ATSmartHome Bibliothek kann nicht mehr mit dem Sketch für ESP8266 kompiliert werden!
Greg
Hi. I am trying to follow the examples fro the SmartHome project, but it refers to the library ESP8266WiFi.H, even for ESP32 examples . Where can I find this library?
Many thanks!
Greg.
Wolfgang Händel
Hallo Herr Lechner….
Bis auf die etwas begrenzte Reichweite der Arduitouch Zentrale funktioniert bei mir alles recht gut.
Was das Herz des Smarthome Einsteigers natürlich höher schlagen lassen würde, wäre ein Sensormodul für ein binäres Signal (Klingeltaster, Bewegungssensor, Dämmerungssensor uvm.)
Das binäre Signal eines solchen Moduls müsste in der Zentrale ausgewertet werden und bestimmte Funktionen (wie z.B. das Relaismodul aus Teil 3) auslösen.
Haben sie so etwas geplant? Meines Erachtens gehört so etwas zu den Standard-Features eines SmartHome-Systems.
Ansonsten vielen Dank für die interessanten Blogs zum Thema SmartHome und für die Mühe, die sie sich damit gegeben haben bzw. noch geben..
Wolfie
Siegl Reinhard
Hallo
Ich bekomme die Smart Home V" nicht zum laufen.Es stoppt schon bei #include “SPIFFS.h”.
Bei der alten Smart Home konnte ich alle Beiträge nachbauen.
Danke für die Unterstützung schon im Vorraus.
Matthias H.
Hallo Herr Lechner,
könnte man die Stimmungslaterne https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/mehrere-feuer-programme-fuer-unsere-stimmungslaterne?pos=3&_sid=3afeceff9&ss=r nicht mit der Smarthome Zenrale steuern?
Reinhard Schneider
Wie das mit den Fehlern so ist, es hat sich auch bei mir einer eingeschlichen.
Richtig muss es für 5 min deep-sleep heißen:
ESP.deepSleep(300*10E6);
Reinhard Schneider
Leider haben sich in das o.g. Programm einige kleine Fehler eingeschlichen:
1. /function to initilize BMP Sensor
….
Richtig:
Serial.println(“Could not find a valid BMP280 sensor, check wiring!”);
hasBmp = false;
2. In der Beschreibung heißt es
Für 5 Minuten müsste es heißen:….
After sending the values, the device switches for five minutes into a deep sleep mode with very low power consumption.
Der Code ist aber in void loop()
….
//go for 10 seconds into deep sleep mode
//wakeup by reset
//reset does not delete data in RTCmemory
ESP.deepSleep(10E6);
ESP.deepSleep(600*10E6);
Reinhard Schneider
Das obige Programm läuft nur mit der Version 0.15.0 von “ESPiLight”.
Die aktuelle Version 0.16.0 erzeugt Fehlermeldungen.
Ist eine Anpassung des ino-Files geplant?
Joe
Bei den Daten der beiden Sensoren kann man sagen das es Roh-Daten sind.
Jetzt muß man nur eine Kalibrierung mit einem Referenz-Meßgerät höherer Genauigkeit durchführen. Und dann die Rohdaten entsprechen mit einem Justage-Wert belegen.
Es wird immer eine geringfügige Abweichung zwischen den Sensoren geben.
(Rauschen, Eigentemperatur etc, Meßfehler).
Die redudante Messung ist in Bereichen bei denen der Ausfall, starker Unterschied der Meßwerte, ermittelt werden muß. Rreinraum, technische zu überwachende Prozeße.
Temperatur-Differenzen werden auch genutzt um Strömungen, in dem Fall Luft, zu ermitteln.
Also nicht vergessen Justage-Wert und Kalibrierung.
Marcus Klein
Beide Sensoren sind offenbar recht nah beieinander untergebracht. Sie messen trotzdem eine Differenz von einem kompletten Grad Celsius. Das ist ein absolutes No-Go, wenn man damit versucht Heimautomatisierung zu betreiben und die Heizung zu steuern. Daraus folgt direkt, dass der Heizkreis am Sensor mit der kleineren Temperatur immer heizt und der Kreis am Sensor mit der größeren Temperatur immer aus ist. Bei einem Grad Unterschied und nicht verschlossenen Türen zwischen den beiden Räumen und gut isolierter Hütte, wandert die Wärme ausreichend zwischen den beiden Räumen. Das trägt nicht wirklich zum Wohnkomfort bei, sondern stört diesen besonders.
Wie gedenken Sie, diesen Fehler zu kompensieren?