Capteur de température à distance pour thermomètre avec ESP8266

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.

Esp-8266Projets pour avancéCapteurs

2 commentaires

Carsten Jürges

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

Jörg

Super, genau so etwas habe ich gesucht.
Vielen Dank für die interessanten Projektvorstellungen.

Laisser un commentaire

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

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi

Produits recommandés