Thermometer met OLED-display

Dit artikel beschrijft de constructie van een eenvoudige thermometer met een DS18B20-sensor. We sterven met een bord ESP8266-E12 en geïntegreerd OLED-display  en een Sensor DS18B20 zonder kaart. Het circuit is heel eenvoudig en de sensor kan direct op het bord worden gesoldeerd.

Circuit:

Bekijk:

Omdat de ESP8266 WiFi ondersteunt, heb ik de ondersteuning van een tweede externe sensor al in de schets opgenomen. Deze tweede sensor communiceert met de thermometer met ESP-Now, een protocol waarmee zeer energiebesparende oplossingen kunnen worden gecreëerd. De meetresultaten worden vervolgens afwisselend op het display weergegeven. Als er geen externe sensor is aangesloten, wordt alleen de waarde van de interne sensor weergegeven.

De schets wordt gedetailleerd besproken.

Schets:

/ * Esp8266 met OLED-display als thermometer 
 */

// Bibliotheken voor WiFi 
# opnemen <ESP8266WiFi.h>
// Bibliotheek voor OLED-weergave
# opnemen <U8g2lib.h>
// Bibliotheken voor DS18B20 temperatuursensor
# opnemen <OneWire.h>
# opnemen <DallasTemperatuur.h>

// Bibliotheek voor ESP-Now
extern "C"{
# opnemen <vooral.h>
}

// Pinnen voor temperatuursensor
const byte bus = 0;// pin GPIO0

// Protocol voor het uitlezen van de sensor
OneWire oneWire(bus);

// sensor exemplaar
DallasTemperatuur sensoren(&oneWire);

// array om sensoradressen op te slaan
DeviceAddress adressen;

// Initialiseer het display
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, / * klok = * / 5, / * data = * / 4, / * reset = * / 16);

// Offset voor het kalibreren van de temperatuur
const uint8_t offset = 15;

// waarden van de temperatuursensoren -127 = de waarde, 
// die u krijgt als er geen sensor is aangesloten    zweven buiten = -127;   zweven binnenin = -127;

// Na een reset is de SSID zichtbaar zodat een verwijderde sensor aanwezig is 
// kan verbinden. De SSID moet na ongeveer 2 minuten worden verborgen 
// Teller voor het uitschakelen van de zichtbare SSID
int cnt = 24;

// Logo's als bitmap voor weergave
#define huisbreedte 16
#define huishoogte 16
statisch niet ondertekend char huisbits[] = {    0x80, 0x0c, 0xc0, 0x0d, 0x60, 0x0f, 0x30, 0x0e, 0x18, 0x0c, 0xcc, 0x19,    0x46, 0x31, 0x47, 0x71, 0xc5, 0x51, 0x04, 0x10, 0xf4, 0x16, 0x94, 0x16,    0x94, 0x16, 0x94, 0x10, 0x94, 0x10, 0xff, 0xff };

#define tree_width 16
#define boomhoogte 16
statisch niet ondertekend char tree_bits[] = {    0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x10, 0x05, 0x08, 0x0a, 0x34, 0x13,    0x04, 0x10, 0x02, 0x10, 0x02, 0x08, 0x04, 0x16, 0x18, 0x10, 0xd0, 0x17,    0xa0, 0x09, 0x80, 0x01, 0x80, 0x01, 0xff, 0xff };


// Gegevensstructuur voor gegevensuitwisseling via ESP Now
struct DATA_STRUCTURE {     zweven temp = 0;
};

// netwerknaam
char* SSID = "Thermometer";


// Terugbelfunctie wanneer gegevens zijn ontvangen 
nietig on_receive_data(uint8_t *mac, uint8_t *r_data, uint8_t len) {       DATA_STRUCTURE gegevens;     // we kopiëren de ontvangen gegevens naar de gegevensstructuur     // om toegang te krijgen tot de gegevensstructuur     memcpy(&gegevens, r_data, grootte van(gegevens));     buiten = gegevens.temp;   };
 
// functie om een ​​sensoradres af te drukken
nietig printAdres(DeviceAddress adressen)
{   voor (uint8_t ik = 0; ik < 8; ik++)   {     als (adressen[ik] < 16) Serie.afdrukken("0");     Serie.afdrukken(adressen[ik], HEX);   }
}

nietig instellen() {   Serie.beginnen(115200);       WiFi.beginnen();   // Configuratie van het toegangspunt   WiFi.mode(WIFI_AP);      WiFi.softAP(SSID);    // Initialiseer ESOP-Now   als (esp_now_init()!=0) {     ESP.herstart();     vertraging(1);   }       // Stel ESP-rol 1 = master, 2 = slave 3 = master + slave in   esp_now_set_self_role(2);    // registreren en terugbellen functie   esp_now_register_recv_cb(on_receive_data);     // Bereid het display voor   u8g2.beginnen();   u8g2.inschakelenUTF8Print();   u8g2.setFontMode(0);   // Initialiseer de temperatuursensor   sensoren.beginnen();   Serie.afdrukken(sensoren.getDeviceCount(), DEC);   Serie.println("Sensoren gevonden.");   // Nu controleren we of de bus in parasitaire modus staat   Serie.afdrukken("Parasitaire modus is");   als (sensoren.isParasitePowerMode()) {     Serie.println("AAN");   } anders {     Serie.println("UIT");   }   // Nu controleren we of een van de sensoren op de bus een temperatuursensor is   als (!sensoren.getAddress(adressen,0)) {     Serie.println("Geen temperatuursensor beschikbaar!");   }   // toon adressen   Serie.afdrukken("Adres:");   printAdres(adressen);   Serie.println();   sensoren.setResolution(adressen,12);   Serie.afdrukken("Resolution =");   Serie.afdrukken(sensoren.getResolution(adressen), DEC);   Serie.println();   // Pullupweerstand voor temperatuursensor   pinMode(0,INPUT_PULLUP);
}

nietig lus() {   char tekst[50] = {0}; // Tekstbuffer voor weergave   int tmp; // Tijdelijk voor temperaturen   sensoren.requestTemperature(); // Start sensormeting   vertraging(800);// tijd om de temperatuur te meten   binnenin = sensoren.getTempC(adressen); // Uitlezen temperatuur van sensor   // We converteren de temperatuur naar een geheel getal met één decimaal   tmp = rond(binnenin * 10);   // Genereer uitvoertekst   sprintf(tekst,"% 2d.% 01d ° C", tmp/10-offset, buikspieren(tmp%10));   // en verzenden om weer te geven   u8g2.eerste pagina(); doen {     // eerst het logo     u8g2.drawXBM( 0, 8, huisbreedte, huishoogte, huisbits);     // vervolgens de tekst     u8g2.setFont(u8g2_font_osb26_tf);     u8g2.setFontDirection(0);     u8g2.drawUTF8(20, 30, tekst);   } terwijl ( u8g2.volgende pagina() );     vertraging(5000); // wacht 5 seconden   // teller verlagen   als (cnt > 0) cnt--;   // We hebben een waarde van een externe sensor   // Dan tonen we het   als (buiten !=  -127) {     // We converteren de temperatuur naar een geheel getal met één decimaal     tmp = rond(buiten * 10);     // Genereer uitvoertekst     sprintf(tekst,"% 2d.% 01d ° C", tmp/10, buikspieren(tmp%10));     // en verzenden om weer te geven     u8g2.eerste pagina(); doen {       // eerst het logo       u8g2.drawXBM( 0, 8, tree_width, boomhoogte, tree_bits);       // vervolgens de tekst       u8g2.setFont(u8g2_font_osb26_tf);       u8g2.setFontDirection(0);       u8g2.drawUTF8(20, 30, tekst);     } terwijl ( u8g2.volgende pagina() );     vertraging(5000); // wacht 5 seconden     // teller verlagen     als (cnt>0) cnt--;   }   // Als tellers op 0 de SSID verbergen   als (cnt <= 0) WiFi.softAP(SSID,NUL,1,1);
}   


Met een geschikte 3,7 V LiPo-batterij kan de thermometer met een batterij worden gebruikt. Laadcontroller en batterijaansluiting zijn beschikbaar op het bord.

 

DisplaysEsp-8266Projekte für anfängerSensoren

16 Kommentare

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

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi