Cette Contribution complète le précédent post. Il décrit un Capteur de température avec ESP8266 toutes les cinq Minutes la Température actuelle de la dernière Contribution présentée Thermomètre envoie. Pendant la Pause entre les deux Mesures est de l'ESP8266 en Mode de Sommeil profond décalé dans lequel il moins d'Énergie. Pour Envoyer des Données, le programme de stabilité électronique, Now, le Protocole utilisé, sans complexe de la Connexion, les Données directement à l'Adresse MAC du Thermomètre envoie.
Nous utilisons l' ESP8266-E12 Module Adaptateur, car Contrairement à la ESP8266-01 Module Wake Pin GPIO-16 a déduit et pas en permanence, le voyant DEL de la Tension d'alimentation a. Le Wake Pin, nous avons besoin de la Réveiller d'un profond Sommeil et les Power-LED consomme inutilement de l'Énergie.
Circuit:
orange Fil qui relie le Wake Pin avec la remise à zéro Entrée et veille à ce que le Module à la Fin de la Schlafpause est démarré à nouveau. Le Capteur est le GPIO2 connecté (Fil blanc).
Pour le Programme à télécharger, nous avons besoin d'un FDTI Adaptateur pour l'ESP8266 via l'Interface de programmation.
Les FDTI Adaptateur de nous connecter avec le GND Connexion et TX à RX et RX avec TX. En outre, le Flash code Pin GPIO 0 relié à la terre (le Fil vert) pour que l'ESP8266 dans le Mode de Programmation va.
Après la Programmation, le vert est le Fil de l'éliminer. Si dans le Sketch DEBUG à true, on peut via l'Interface série, les Messages du Module de suivi.
Attention: Un Approvisionnement en ESP8266 par le FDTI-Conseil d'administration conduit à se bloquer si la scanNetwork Fonction est appelée, car la Consommation de courant, puis est trop élevé.
Sketch:
Pour Compiler le Conseil d'administration à
régler !!
/* Connexion WI-fi gratuite sonde de température ESP Now avec le Thermomètre Si aucune Adresse MAC a été déterminé à la recherche, le Capteur est un FIL avec un SSID Thermomètre Quand il l'AP a trouvé, il se souvient de l'Adresse MAC, tant que l'Alimentation n'a pas été interrompu Le programme de stabilité électronique Now Protocole est très rapide, si bien que très peu de Temps (us) plus de Courant. Le Capteur envoie les données de Température et puis s'en va pour 5 Minutes dans le Sommeil profond de sorte que très peu d'Énergie, et le Capteur, donc avec des Piles, ce qui peut être exploité. */ //Bibliothèque pour le WiFi #include <ESP8266WiFi.h> /Bibliothèques/pour Capteur de température DS18B20 #include <OneWire.h> //Bibliothèque pour ESP Now #include <DallasTemperature.h> extern "C" { #include <espnow.h> } //Debug Indicateur si la valeur est false, tous Debug Messages seront supprimés //pour plus d'économiser de l' #define DEBUG à true, //Constantes pour le WiFi #define WIFI_CHANNEL 1 #define SEND_TIMEOUT 2450 // 245 Millisecondes de délai d'attente //Broches pour la sonde de température const byte bus = 2;//pin GPIO2 //Structure de données pour l'Échange de données struct DATEN_STRUKTUR { float temp = 0; }; //Structure de données de la Mémoire Rtc avec la somme de contrôle pour la Validité //vérifier pour la MAC Adresse est stockée struct MEMORYDATA { uint32_t crc32; uint8_t mac[6]; }; //données Globales volatile bool callbackCalled; MEMORYDATA statinfo; OneWire oneWire(bus); DallasTemperature capteurs(&oneWire); //Tableau pour Sensoradressen enregistrer DeviceAddress adresses; //sous-programme pour Calculer la somme de contrôle uint32_t calculateCRC32(const uint8_t *data, size_t length) { uint32_t crc = 0xffffffff; while (length--) { uint8_t c = *data++; for (uint32_t i = 0x80; i > 0; i >>= 1) { bool bits = crc & 0x80000000; if (c & i) { bit = !bit; } crc <<= 1; if (bits) { crc ^= 0x04c11db7; } } } return crc; } //Écrit la Structure de données statinfo, avec un total de contrôle dans la Mémoire RTC void UpdateRtcMemory() { uint32_t crcOfData = calculateCRC32(((uint8_t*) &statinfo) + 4, sizeof(statinfo) - 4); statinfo.crc32 = crcOfData; ESP.rtcUserMemoryWrite(0,(uint32_t*) &statinfo, sizeof(statinfo)); } //recherche d'un point d'accès approprié void ScanForSlave() { bool slaveFound = 0; int8_t scanResults = WiFi.scanNetworks(); // reset on each analyse if (DEBUG) Serial.println("Scan done"); if (scanResults == 0) { if (DEBUG) Serial.println(sans WiFi devices dans AP Mode found"); } else { if (DEBUG) Série.d'impression("Trouvé "); si (DEBUG) Serial.impression(scanResults); si (DEBUG) Serial.println(" périphériques "); pour (int i = 0; i < scanResults; ++j') { // Imprimer SSID et RSSI pour chaque appareil de la Chaîne SSID = WiFi.SSID(je); int32_t RSSI = WiFi.RSSI(j'); Chaîne BSSIDstr = WiFi.BSSIDstr(je); si (DEBUG) { Serial.impression(que j' + 1); Série.d'impression(": "); Série.d'impression(SSID); Série.d'impression(" ("); Série.d'impression(RSSI); Série.d'impression(")"); Série.println(""); } retard(10); // Vérifier si le périphérique actuel commence avec `Thermomètre` si (SSID.indexOf("Thermomètre") == 0) { // SSID d'intérêt si (DEBUG) { Serial.println("Trouvé un Esclave."); Série.d'impression(j' + 1); Série.d'impression(": "); Série.d'impression(SSID); Série.d'impression(" ["); Série.d'impression(BSSIDstr); Série.d'impression("]"); Série.d'impression(" ("); Série.d'impression(RSSI); Série.d'impression(")"); Série.println(""); } int mac[6]; // wir ermitteln mourir MAC Adresse und speichern sie im RTC Mémoire 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 ii = 0; ii < 6; ++ii ) { statinfo.mac[ii] = (u_int8_t) mac[ii]; } UpdateRtcMemory(); } slaveFound = 1; //Nachdem der AP gefunden wurde können wir abbrechen pause; } } } si (DEBUG) { si (slaveFound) { Série.println("Esclave a Trouvé, de traitement.."); } d'autre { Série.println("l'Esclave n'est Pas Trouvé, d'essayer de nouveau."); } } // RAM freigeben WiFi.scanDelete(); } // fonction um eine Sensoradresse zu drucken vide printAddress(DeviceAddress adressen) { pour (u_int8_t je = 0; je < 8; je++) { si (adressen[j'] < 16) Série.d'impression("0"); Série.d'impression(adressen[je], HEX); } } void setup() { si (DEBUG) { Serial.commencer la(115200); Série.println("Démarrer"); } pinMode(bus,INPUT_PULLUP); //Wir ermitteln mourir Anzah der Capteurs suis Eindraht-Bus capteurs.de commencer(); si (DEBUG) { Serial.imprimer(les capteurs.getDeviceCount(), DÉC); Série.println(" les Capteurs gefunden."); } //Nonne prüfen wir ob einer der Capteurs suis Bus ein Température Capteur ist si (!les capteurs.getAddress(adressen,0)) { si (DEBUG) Serial.println("Kein Temperatursensor vorhanden!"); } //adressen anzeigen si (DEBUG) { Serial.print("Adresse: "); printAddress(adressen); Série.println(); } //Nun wir setzen noch die gewünschte Résolution (9, 10, 11 oder 12 bits) les capteurs.setResolution(adressen,10); //Zur Kontrolle lesen wir den Wert wieder aus si (DEBUG) { Serial.print("Résolution = "); Serial.imprimer(les capteurs.getResolution(adressen), DÉC); Série.println(); } les capteurs.requestTemperatures(); // Commando um die Temperaturen auszulesen //Wir lesen aus dem RTC Mémoire ESP.rtcUserMemoryRead(0, (uint32_t*) &statinfo, sizeof(statinfo)); si (DEBUG) Serial.println("RTC Fait"); uint32_t crcOfData = calculateCRC32(((u_int8_t*) &statinfo) + 4, sizeof(statinfo) - 4); WiFi.en mode(WIFI_STA); // Gare de mode pour esp-maintenant, capteur de nœud si (DEBUG) Serial.println("WifiMode"); si (statinfo.crc32 != crcOfData) { //wir haben keine gültige MAC Adresse si (DEBUG) Serial.println("Scan vor Esclave"); ScanForSlave(); si (DEBUG) { Serial.printf("mac: %s, ", WiFi.macAddress().c_str()); Série.printf("mac cible: %02x%02x%02x%02x%02x%02x", statinfo.mac[0], statinfo.mac[1], statinfo.mac[2], statinfo.mac[3], statinfo.mac[4], statinfo.mac[5]); Serial.printf(", canal: %i\n", WIFI_CHANNEL); } } si (esp_now_init() != 0) { si (DEBUG) Serial.println("*** ESP_Now init failed"); ESP.redémarrer(); } //ESP, Maintenant Contrôleur esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER); //Peer Daten initialisieren esp_now_add_peer(statinfo.mac, ESP_NOW_ROLE_SLAVE, WIFI_CHANNEL, NULL, 0); //wir registrieren die Funktion, die nach dem Senden aufgerufen werden soll esp_now_register_send_cb([](u_int8_t* mac, u_int8_t sendStatus) { si (DEBUG) { Serial.print("send_cb, statut = "); de Série.print(sendStatus); Serial.print(", to mac: "); char macString[50] = {0}; sprintf(macString,"%02X:%02X:%02X:%02X:%02X:%02X", statinfo.mac[0], statinfo.mac[1], statinfo.mac[2], statinfo.mac[3], statinfo.mac[4], statinfo.mac[5]); Serial.println(macString); } callbackCalled = true; }); //Flag sur false callbackCalled = false; //mesure de la Température de démarrer capteurs.requestTemperatures(); delay(750); //750 ms attendre jusqu'à ce que la Mesure est terminée //La température de la chercher, et dans Satenstruktur pour Envoyer DATEN_STRUKTUR data; data.temp = capteurs.getTempC(adresses); uint8_t bs[sizeof(data)]; //Structure de données dans les Sendebuffer copier memcpy(bs, &data, sizeof(data)); /Données Thermomètre envoyer esp_now_send(ZÉRO, bs, sizeof(data)); // NULL means send to all pairs if (DEBUG) { Serial.print("Température: "); Serial.print(data.temp); Serial.println("°C"); } } void loop() { //attendre jusqu'à ce que les Données ont été envoyées if (callbackCalled || (millis() > SEND_TIMEOUT)) { if (DEBUG) Serial.println("Sleep"); delay(100); //300 Secondes dans le mode de Veille prolongée //ensuite, on fait un Reset et de l'ESP8266 redémarre //les Données dans la Mémoire RTC lors de la Réinitialisation n'est pas supprimé. ESP.deepSleep(300E6); } }
Test:
une fois que le Module est alimenté en Électricité a été il ne sait pas d'Adresse MAC valide du Thermomètre. Il tente un Réseau ouvert à l'aide du SSID "Thermomètre" à trouver. Le Thermomètre étant à environ cinq Minutes après le Lancement de sa SSID caché, nous avons besoin d'un Redémarrage du Thermomètre déclencher. Maintenant, il doit Capteur Module le Thermomètre et trouver toutes les cinq Minutes, la valeur de Température actuelle de transmettre. Le Thermomètre devrait alternance de la Température locale (Maisonnette Symbole) et la Température du Capteur Module (Arbre Symbole) afficher.
5 commentaires
esp tester
Tolles Projekt!
Peter
Wie weit können die Module denn voneinander entfernt sein?
Peter
Tolles Projekt! Ist es möglich mehrere entfernte Module zu betreiben?
Viele Grüße Peter
Carsten Jürges
Wenn kein “Thermometer” gefunden wird, landet irgendeine MAC-Adresse in statinfo und das war’s dann erstmal. Daher habe ich Funktion DeleteRtcMemory spendiert, den CRC-Wert “zerstört”. Diese Funktionen wird aufgerufen, wenn das Senden nicht erfolgreich (sendStatus) war …
Dann gibt es beim nächsten Start einen neuen Verbindungsversuch …
Jörg
Super, genau so etwas habe ich gesucht.
Vielen Dank für die interessanten Projektvorstellungen.