Thermomètre avec écran OLED

Cet article décrit la construction d’un simple thermomètre avec un capteur DS18B20. Nous mettons fin à un conseil d’administration avec ESP8266-E12 et affichage OLED intégré et un Capteur DS18B20 sans planche. Le circuit est très simple et le capteur peut être soudé directement à la carte.

Circuit:

Vue:

Depuis l’ESP8266 prend en charge WiFi, j’ai déjà construit dans le croquis le soutien d’un deuxième capteur à distance. Ce deuxième capteur communiquera avec le thermomètre avec ESP-Now, un protocole avec lequel des solutions très économes en énergie peuvent être créées. Les résultats de mesure sont ensuite affichés en alternance sur l’écran. Si aucun capteur distant n’est connecté, seule la valeur du capteur interne est affichée.

L’esquisse est commentée en détail.

dessin:

/Esp8266 avec écran OLED comme thermomètre 
 */

Bibliothèques pour WiFi 
#include <ESP8266WiFi.H (en)>
Bibliothèque pour affichage OLED
#include <U8g2lib.H (en)>
Bibliothèques pour capteur de température DS18B20
#include <OneWire (oneWire).H (en)>
#include <DallasTemperature.H (en)>

Bibliothèque pour ESP-Now
Externe "C"{
#include <espnow espnow.H (en)>
}

Épingles pour capteur de température
Const Octet Bus = 0;broche GPIO0

Protocole pour la lecture du capteur
OneWire (oneWire) oneWire(Bus);

Instance de capteur
DallasTemperature Capteurs(&oneWire);

Array pour stocker les adresses des capteurs
DeviceAddress (deviceAddress) Adresses;

Affichage initialisé
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2 u8g2(U8G2_R0, /horloge/ 5, /données/ 4, / Réinitialisation/ 16);

Décalage pour l’étalonnage de la température
Const uint8_t Compenser = 15;

Valeurs des capteurs de température -127 - la valeur, 
que vous obtenez quand aucun capteur n’est connecté    Flotteur Extérieur = -127;   Flotteur Intérieur = -127;

Après une réinitialisation, le SSID est visible de sorte qu’un capteur à distance peut être 
peut se connecter. Après environ 2 minutes, le SSID doit être caché 
Compteur pour éteindre le SSID visible  
Int Cnt = 24;

Logos comme bitmap pour l’affichage
#define haus_width 16
#define haus_height 16
Statique Unsigned Char Char haus_bits[] = {    0x80, 0x0c, 0xc0, 0x0d 0x0d, 0x60, 0x0f, 0x30, 0x0e, 0x18, 0x0c, 0xcc, 0x19,    0x46, 0x31, 0x47, 0x71 (en), 0xc5, 0x51 (en), 0x04, 0x10, 0xf4, 0x16, 0x94, 0x16,    0x94, 0x16, 0x94, 0x10, 0x94, 0x10, 0xff, 0xff };

#define baum_width 16
#define baum_height 16
Statique Unsigned Char Char baum_bits[] = {    0x00, 0x00, 0x00, 0x00, 0xe0, 0x01 (en), 0x10, 0x05, 0x08, 0x0a 0x0a, 0x34, 0x13,    0x04, 0x10, 0x02, 0x10, 0x02, 0x08, 0x04, 0x16, 0x18, 0x10, 0xd0, 0x17,    0xa0, 0x09, 0x80, 0x01 (en), 0x80, 0x01 (en), 0xff, 0xff };


Structure de données pour l’échange de données via ESP Now
Struct DATEN_STRUKTUR {     Flotteur Temp = 0;
};

Nom du réseau
Char Char* Ssid = "Thermomètre";


Fonction de rappel lorsque les données ont été reçues 
Vide on_receive_data(uint8_t *Mac, uint8_t *r_data, uint8_t Len) {       DATEN_STRUKTUR Données;     nous copieons les données reçues à la structure de données     d’accéder à la structure de données     Memcpy Memcpy (Memcpy)(&Données, r_data, Sizeof(Données));     Extérieur = Données.Temp;   };
 
fonction d’impression d’une adresse de capteur
Vide printAddress(DeviceAddress (deviceAddress) Adresses)
{   Pour (uint8_t Ⅰ. = 0; Ⅰ. < 8; Ⅰ.++)   {     Si (Adresses[Ⅰ.] < 16) Série.Imprimer("0");     Série.Imprimer(Adresses[Ⅰ.], Hexagonale);   }
}

Vide Configuration() {   Série.Commencer(115200);       Wifi.Commencer();   Configuration du point d’accès   Wifi.Mode(WIFI_AP);      Wifi.softAP (softAP)(Ssid);    Initialiser ESOP-Maintenant     Si (esp_now_init()!=0) {     Esp.Redémarrer();     Retard(1);   }       SET ESP rôle 1-Master, 2 ' Esclave 3 ' Maître et Esclave   esp_now_set_self_role(2);    et enregistrer la fonction de rappel   esp_now_register_recv_cb(on_receive_data);     Préparation de l’affichage   u8g2 u8g2.Commencer();   u8g2 u8g2.enableUTF8Print();   u8g2 u8g2.setFontMode setFontMode(0);   Initialiser le capteur de température   Capteurs.Commencer();   Série.Imprimer(Capteurs.getDeviceCount (en)(), Dec);   Série.println("Capteurs trouvés.");   Maintenant, nous allons vérifier si le bus est en mode parasite   Série.Imprimer("Le mode parasite est ");   Si (Capteurs.isParasitePowerMode()) {     Série.println("SUR");   } Autre {     Série.println("OFF");   }   Maintenant, nous vérifions si l’un des capteurs sur le bus est un capteur de température   Si (!Capteurs.getAddress (en)(Adresses,0)) {     Série.println("Aucun capteur de température disponible!");   }   Afficher les adresses   Série.Imprimer("Adresse: ");   printAddress(Adresses);   Série.println();   Capteurs.setResolution(Adresses,12);   Série.Imprimer("Résolution ");   Série.Imprimer(Capteurs.getResolution(Adresses), Dec);   Série.println();   Résistance à la traction pour capteur de température   pinMode(0,INPUT_PULLUP);
}

Vide Boucle() {   Char Char Texte[50] = {0}; Tampon de texte pour l’affichage   Int Tmp; Temporaire pour les températures   Capteurs.demandeTemperatures(); Démarrage de la mesure du capteur   Retard(800);Il est temps de mesurer la température   Intérieur = Capteurs.getTempC (en)(Adresses); Température de lecture du capteur   Nous convertissons la température en intégrant avec un lieu décimal   Tmp = Rond(Intérieur * 10);   Générer du texte de sortie   Sprintf(Texte,"%2d.%0 1d 'C", Tmp/10-Compenser, Abs(Tmp%10));   et envoyer à l’affichage   u8g2 u8g2.première Page(); Jeu {     d’abord le logo     u8g2 u8g2.drawXBM( 0, 8, haus_width, haus_height, haus_bits);     puis le texte     u8g2 u8g2.setFont(u8g2_font_osb26_tf);     u8g2 u8g2.setFontDirection(0);     u8g2 u8g2.drawUTF8(20, 30, Texte);   } Tandis que ( u8g2 u8g2.Nextpage() );     Retard(5000); 5 secondes à attendre   Réduire le compteur   Si (Cnt > 0) Cnt--;   Avons-nous une valeur d’un capteur à distance   Ensuite, nous montrons le   Si (Extérieur !=  -127) {     Nous convertissons la température en intégrant avec un lieu décimal     Tmp = Rond(Extérieur * 10);     Générer du texte de sortie     Sprintf(Texte,"%2d.%0 1d 'C", Tmp/10, Abs(Tmp%10));     et envoyer à l’affichage     u8g2 u8g2.première Page(); Jeu {       d’abord le logo       u8g2 u8g2.drawXBM( 0, 8, baum_width, baum_height, baum_bits);       puis le texte       u8g2 u8g2.setFont(u8g2_font_osb26_tf);       u8g2 u8g2.setFontDirection(0);       u8g2 u8g2.drawUTF8(20, 30, Texte);     } Tandis que ( u8g2 u8g2.Nextpage() );     Retard(5000); 5 secondes à attendre     Réduire le compteur     Si (Cnt>0) Cnt--;   }   Lorsque les compteurs sur 0 cachent le SSID   Si (Cnt <= 0) Wifi.softAP (softAP)(Ssid,Null,1,1);
}   


Avec une batterie LiPo appropriée avec 3,7 V, le thermomètre peut être actionné avec batterie. Le contrôleur de charge et la prise de batterie sont disponibles sur le tableau.

 

EtalagesEsp-8266Projets pour les débutantsCapteurs

16 commentaires

Gerald Lechner

Gerald Lechner

Vielen Dank!

Die Buchse für den Akku an der Untrerseite der Platine ist ein 1.25mm JST 2.

Rahul

Rahul

Tolles Projekt!
Von dem Aufbau habe ich ein System mit DS18B20 und eins mit DHT22 aufgebaut.
Die loggen ihre Temperatur- (und Feuchte-) Werte auf einem Intranet-Webserver.

Um welchen Steckverbinder handelt es sich bei dem Akku-Anschluss?

Bernd Albrecht

Bernd Albrecht

Die eingebaute LED ist die Lade-Kontrollleuchte für einen LiPo-Akku. Rot = laden, grün = laden fertig, rot-blinkend = kein Akku und dunkel = geladener Akku. Diese LED kann nicht abgeschaltet werden.

AndreasD

AndreasD

Hallo,

kann mir jemand helfen, wie ich die Onboard-LED abschalte? Ich weiß nicht, warum ich mich so anstelle. Bei mir blinkt sie sehr schnell. Im Sketch habe ich allerdings nichts gefunden.
Danke für eine Antwort.
Andreas

István Maszlik

István Maszlik

Hallo! Ich kann die externen und internen Thermometer nicht anschließen. Wie richte ich es ein?

Carsten Jürges

Carsten Jürges

Man könnte das noch um die Luftfeuchtigkeit (bme280) erweitern.
Weiterhin habe ich einen Balken spendiert, der anzeigt, wie alt die Messung vom Aussensensor ist. Ist diese zu alt, setze ich den Wert wieder zurück, damit dessen Anzeige unterdrückt wirdWas interessiert eine Temperatur von vor zwei Stunden …
Wenn der Wert sehr alt ist, lasse ich dieses Thermometer im WiFi sichtbar werden, damit sich das Aussenthermometer neu verbinden kann …

Mario Spies

Mario Spies

Guten Tag,
ist es möglich das Board mit ESPEASY zu betreiben?
An welchen I/O Ports hängt das Display.

Michael Riedel

Michael Riedel

Hallo ich bin neu Hier ,
versuche seit Tagen das kleine Projekt zum laufen zu bringen und verzweifle ….
beim überprüfen bleib es hier hängen
#include
Meldung “no such file oder Directory”
wo kann ich und welche Libary " espNow " herunterladen ???
habe schon vieles versucht ohne Erfolg
beim anstecken des ESP 8266 steht auf dem Display 10 nets found
wer kann mir helfen ??
mfG Michael

Helmut Riethmeier

Helmut Riethmeier

Warum gibt es bei den Kommentare keine Antworten zu lesen, werden die Antworten nur über Email verschickt.

Gruß Helmut

AndreasD

AndreasD

Hallo,
ich bin neu hier und dementsprechend nicht der Profi. Das Projekt finde ich sehr gut. Meine erste Frage ist, warum ist bei
esp_now_set_self_role(2);
standardmäßig Slave eingestellt?
Die zweite Frage: Wann nutze ich (3) Master & Slave und wann (1) Master?
Und drittens: Wenn ich einen Aussensensor mit dem ‘Master’ verbinden möchte, was trage ich dann beim Master ein, (1) oder (3)? Und wenn ich es richtig deute, dann trage ich bei dem zweiten (2) ein. Wie viele könnte ich an den Master anmelden?
Viertens: Wenn ich einen Aussensensor habe, der kein Display benötigt, kann ich dann auch einen esp8266 ESP01S WLAN nutzen? Was müsste dann im Code geändert werden?
Ich bin dankbar für jeden Hinweis.
Beste Grüße, Andreas

Thomas

Thomas

Hallo.
Super Projekt. Ich hätte allerdings 2 Fragen.
1. Was stellt die Schaltung im ersten Bild dar? Die mit dem 10 kOhm Widerstand?
2. Warum ein Temperaturoffset von 15? Wozu ist das Offset gut?
Ich habe das Offset auf 0 gestellt, nun zeigt mir das Thermometer die richtige Temperatur an.

Vielen Dank.
Grüße, Thomas

Gerald

Gerald

Ein 1200mAh Akku hält ohne Aufladung ca. 1 Tag.
Der 4.7 kOhm Widerstand ist nicht nötig wenn man den Datenpin mit pinMode auf INPUT_PULLUP setze.
Für einen Temperatursensor der dei Daten mit WiFi und mit Batterie betrieben werden kann, möchte ich auf den nächsten Beitrag in diesem Blog verweisen.

Sören

Sören

Meines Erachtens fehlt zwischen Plus-Pol und Daten-Pin ein 4,7kOhm Widerstand – oder ist der bei 3.3V nicht nötig?
Ich arbeite grundsätzlich mit 5V.

Passende Widerstände sollte az-delivery auch anbieten…

Stephan

Stephan

Hallo Manuel,

du könntest die Temperaturen mit MQTT versenden. Für OpenHab gibt es da dann entsprechende Unterstützung.
Nutze ich auch für diverse Sensoren. Z.B.: https://github.com/stritti/smart-swimming-pool

Ralph

Ralph

Das mit der Batterie würde mich auch interessieren.

Zu. Kühlschrank, der ist ein relativ guter Farradayscher Käfig mit Wifi innen ist da nicht viel. Funfakt deswegen hatte Snowden als die Journalisten ihn in HongKong aufsuchten, deren Smartphones in den Kühlschrank gesteckt.

Manuel

Manuel

Hi,

interessante Sache. Wie lange würde die Batterie in etwa halten? Und wäre das WiFi geeignet, um den Sensor im SmartHome (openHAB) zu integrieren? Suche noch eine Lösung um die Kühlschranktemperatur zu überwachen.

Danke für Kommentar.

Grüße

Manuel

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