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.
16 comentarios
Gerald Lechner
Vielen Dank!
Die Buchse für den Akku an der Untrerseite der Platine ist ein 1.25mm JST 2.
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
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
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
Hallo! Ich kann die externen und internen Thermometer nicht anschließen. Wie richte ich es ein?
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
Guten Tag,
ist es möglich das Board mit ESPEASY zu betreiben?
An welchen I/O Ports hängt das Display.
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
Warum gibt es bei den Kommentare keine Antworten zu lesen, werden die Antworten nur über Email verschickt.
Gruß Helmut
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
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
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
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
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
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
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