Thermometer mit OLED Display - AZ-Delivery

Este artículo describe la construcción de un termómetro simple con un sensor DS18B20. Morimos con una tabla ESP8266-E12 y pantalla OLED integrada  y uno Sensor DS18B20 sin placa. El circuito es muy simple y el sensor se puede soldar directamente a la placa.

Circuito:

Vista:

Como ESP8266 es compatible con WiFi, ya he incluido el soporte de un segundo sensor remoto en el boceto. Este segundo sensor se comunicará con el termómetro con ESP-Now, un protocolo con el que se pueden crear soluciones muy ahorradoras de energía. Los resultados de la medición se muestran alternativamente en la pantalla. Si no hay un sensor remoto conectado, solo se muestra el valor del sensor interno.

El boceto se comenta en detalle.

Bosquejo:

/ * Esp8266 con pantalla OLED como termómetro 
 */

// Bibliotecas para WiFi 
#include <ESP8266WiFi.h>
// Biblioteca para visualización OLED
#include <U8g2lib.h>
// Bibliotecas para el sensor de temperatura DS18B20
#include <OneWire.h>
#include <Temperatura de Dallas.h>

// Biblioteca para ESP-Now
externo "C"{
#include <saber.h>
}

// Pines para sensor de temperatura
const byte bus = 0;// pin GPIO0

// Protocolo para leer el sensor
OneWire oneWire(bus);

// instancia del sensor
Temperatura de Dallas sensores(&oneWire);

// matriz para almacenar direcciones de sensores
DeviceAddress direcciones;

// Inicializa la pantalla
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, / * reloj = * / 5, / * datos = * / 4, / * reset = * / 16);

// Offset para calibrar la temperatura
const uint8_t compensación = 15;

// valores de los sensores de temperatura -127 = el valor, 
// que obtienes cuando no hay un sensor conectado    flotar afuera = -127;   flotar dentro = -127;

// Después de un reinicio, el SSID es visible para que un sensor eliminado 
// se puede conectar. El SSID debe ocultarse después de aproximadamente 2 minutos. 
// Contador para apagar el SSID visible
int cnt = 24;

// Logotipos como mapa de bits para mostrar
#definir ancho de la casa 16
#definir altura de la casa 16
estática sin firmar char bits de la casa[] = {    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 };

#definir tree_width 16
#definir altura_del árbol 16
estática sin firmar char pedazos de árbol[] = {    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 };


// Estructura de datos para el intercambio de datos a través de ESP Now
estructura DATOS_ESTRUCTURA {     flotar temp = 0;
};

// nombre de la red
char* SSID = "Termómetro";


// Función de devolución de llamada cuando se han recibido datos 
nulo on_receive_data(uint8_t *mac, uint8_t *r_data, uint8_t Len) {       DATOS_ESTRUCTURA datos;     // copiamos los datos recibidos a la estructura de datos     // para poder acceder a la estructura de datos     memcpy(&datos, r_data, tamaño de(datos));     afuera = datos.temp;   };
 
// función para imprimir una dirección de sensor
nulo printAddress(DeviceAddress direcciones)
{   para (uint8_t yo = 0; yo < 8; yo++)   {     si (direcciones[yo] < 16) De serie.imprimir("0");     De serie.imprimir(direcciones[yo], Hexadecimal);   }
}

nulo configuración() {   De serie.comenzar(115200);       WiFi.comenzar();   // Configuración del punto de acceso   WiFi.la moda(WIFI_AP);      WiFi.softAP(SSID);    // Inicializa ESOP-Now   si (esp_now_init()!=0) {     ESP.reiniciar();     retrasar(1);   }       // Establecer el rol ESP 1 = maestro, 2 = esclavo 3 = maestro + esclavo   esp_now_set_self_role(2);    // registro y función de devolución de llamada   esp_now_register_recv_cb(on_receive_data);     // Prepara la pantalla   u8g2.comenzar();   u8g2.enableUTF8Print();   u8g2.setFontMode(0);   // Inicializa el sensor de temperatura   sensores.comenzar();   De serie.imprimir(sensores.getDeviceCount(), DEC);   De serie.println("Sensores encontrados".);   // Ahora verificamos si el bus está en modo parásito   De serie.imprimir("El modo parasitario es");   si (sensores.isParasitePowerMode()) {     De serie.println("ENCENDIDO");   } otra cosa {     De serie.println("APAGADO");   }   // Ahora verificamos si uno de los sensores en el bus es un sensor de temperatura   si (!sensores.getAddress(direcciones,0)) {     De serie.println("¡No hay sensor de temperatura disponible!");   }   // mostrar direcciones   De serie.imprimir("Dirección:");   printAddress(direcciones);   De serie.println();   sensores.setResolution(direcciones,12);   De serie.imprimir("Resolución =");   De serie.imprimir(sensores.getResolution(direcciones), DEC);   De serie.println();   // Resistencia pullup para sensor de temperatura   pinMode(0,INPUT_PULLUP);
}

nulo bucle() {   char texto[50] = {0}; // Búfer de texto para mostrar   int tmp; // Temporal para temperaturas   sensores.requestTemperature(); // Iniciar medición del sensor   retrasar(800);// hora de medir la temperatura   dentro = sensores.getTempC(direcciones); // Leer temperatura del sensor   // Convertimos la temperatura a entero con un decimal   tmp = ronda(dentro * 10);   // Generar texto de salida   sprintf(texto,"% 2d.% 01d ° C", tmp/10-compensación, abs(tmp%10));   // y enviar para mostrar   u8g2.firstPage(); hacer {     // primero el logo     u8g2.drawXBM( 0, 8, ancho de la casa, altura de la casa, bits de la casa);     // entonces el texto     u8g2.setFont(u8g2_font_osb26_tf);     u8g2.setFontDirection(0);     u8g2.drawUTF8(20, 30, texto);   } mientras que ( u8g2.nextPage() );     retrasar(5000); // espera 5 segundos   // disminuir contador   si (cnt > 0) cnt--;   // Tenemos un valor de un sensor remoto   // Luego lo mostramos   si (afuera !=  -127) {     // Convertimos la temperatura a entero con un decimal     tmp = ronda(afuera * 10);     // Generar texto de salida     sprintf(texto,"% 2d.% 01d ° C", tmp/10, abs(tmp%10));     // y enviar para mostrar     u8g2.firstPage(); hacer {       // primero el logo       u8g2.drawXBM( 0, 8, tree_width, altura_del árbol, pedazos de árbol);       // entonces el texto       u8g2.setFont(u8g2_font_osb26_tf);       u8g2.setFontDirection(0);       u8g2.drawUTF8(20, 30, texto);     } mientras que ( u8g2.nextPage() );     retrasar(5000); // espera 5 segundos     // disminuir contador     si (cnt>0) cnt--;   }   // Si los contadores en 0 ocultan el SSID   si (cnt <= 0) WiFi.softAP(SSID,CERO,1,1);
}   


Con una batería LiPo adecuada de 3.7 V, el termómetro puede funcionar con una batería. El controlador de carga y el enchufe de la batería están disponibles en la placa.

 

DisplaysEsp-8266Projekte für anfängerSensoren

16 comentarios

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

Deja un comentario

Todos los comentarios son moderados antes de ser publicados