Monitor de temperatura para la heladera del kiosco: ESP32 + DS18B20 + Telegram, por menos de 15 dólares
Atado con alambre, pero avisa. Y no toca nada de 220V
Contents
Che, les cuento algo que armé la semana pasada porque me salvó de otra macana.
Tengo el taller de reparaciones en Rosario y al lado mi señora tiene un kiosco con una heladera exhibidora de bebidas y lácteos. Hace un mes, un sábado a la noche, se quemó el capacitor de arranque del compresor. Sí, ya sé: el técnico electrónico con la heladera rota. En casa de herrero, cuchillo de palo. El lunes a la mañana estaba todo a 22 grados. Yogures, quesos, todo a la basura. Más de 100 dólares de mercadería.
Así que armé esto. Aclaro de entrada: no toco nada de 220V. El ESP32 solo mide y avisa. La heladera sigue enchufada como siempre, nadie abre nada.
Materiales (precios de acá)
- ESP32 DevKit: unos 9.000 pesos (unos 7 dólares)
- Sonda DS18B20 sumergible, cable de 1 metro: unos 4.500 pesos
- Resistencia de 4,7k: del cajón
- Fuente de 5V: un cargador de celular viejo que estaba tirado
- Caja impresa en PETG, dos horas de impresora
Conexión
- DS18B20: rojo a 3,3V, negro a GND, amarillo (datos) al GPIO 4
- Resistencia de 4,7k entre datos y 3,3V. Sin esto no lee nada, o lee -127, que es el valor de "sensor desconectado"
- El cable de la sonda entra por el burlete de la puerta. Fino, cierra bien, no hay que agujerear nada
El código
Arduino, con las librerías OneWire y DallasTemperature. Para Telegram no uso ninguna librería: un pedido HTTP a la API del bot y listo. El bot lo crean hablando con BotFather en Telegram, que les da el token.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define TOKEN "123456:ABC-el-de-botfather"
#define CHAT_ID "987654321"
OneWire bus(4);
DallasTemperature sonda(&bus);
const float LIMITE = 8.0; // grados
uint32_t calienteDesde = 0;
uint32_t ultimoAviso = 0;
void avisar(String msg) {
msg.replace(" ", "%20");
WiFiClientSecure cli;
cli.setInsecure(); // macana, ya sé. leer abajo
HTTPClient http;
http.begin(cli, String("https://api.telegram.org/bot") + TOKEN +
"/sendMessage?chat_id=" + CHAT_ID + "&text=" + msg);
http.GET();
http.end();
}
void setup() {
sonda.begin();
WiFi.begin("kiosco", "clave");
while (WiFi.status() != WL_CONNECTED) delay(500);
avisar("Monitor de heladera arrancado");
}
void loop() {
sonda.requestTemperatures();
float t = sonda.getTempCByIndex(0);
uint32_t ahora = millis();
if (t == DEVICE_DISCONNECTED_C) {
avisar("Sonda desconectada");
} else if (t > LIMITE) {
if (!calienteDesde) calienteDesde = ahora;
bool pasaron15 = ahora - calienteDesde > 15UL * 60 * 1000;
bool unaHora = !ultimoAviso || ahora - ultimoAviso > 60UL * 60 * 1000;
if (pasaron15 && unaHora) {
avisar("HELADERA a " + String(t, 1) + " grados");
ultimoAviso = ahora;
}
} else {
calienteDesde = 0;
ultimoAviso = 0;
}
delay(60000);
}
La lógica: mide cada minuto. Si pasa de 8 grados durante 15 minutos seguidos, avisa. Si sigue caliente, vuelve a avisar cada hora. Si la sonda se desconecta, avisa cada minuto, a propósito, para que moleste.
Las macanas que sé que tiene
- setInsecure(): no verifica el certificado de Telegram. Para una heladera me alcanza. Si lo usan para algo serio, carguen el certificado raíz.
- Si se corta la luz, el ESP32 también se apaga y no avisa nada. Justo cuando más importa. Para eso: cada 10 minutos el ESP32 le pega a una URL de healthchecks.io (gratis para pocos chequeos), y si deja de llegar ese "estoy vivo", healthchecks me manda el aviso a Telegram. Así me entero del corte también.
- El WiFi del kiosco es el router de la empresa de cable, que se cuelga cada tanto. Si no conecta, el ESP32 se queda esperando en el setup. Lo voy a arreglar. Algún día.
Costo total: menos de 15 dólares. La mercadería que tiré: más de 100. Cuentas claras.
Cualquier duda pregunten, che.
Written by
Nicolás Benítez
Impresión 3D, Arduino y ESP32 en Rosario. Técnico electrónico. Arreglo cosas que según el fabricante no tienen arreglo.
Get the best of #codigo_en_espanol weekly
One email each Monday with the most useful posts. No spam; unsubscribe in one click.
Comments
Sign in to join the conversation.
Sign in to comment