Monitoreando la temperatura de un termotanque solar usando D1 Mini y Wifi

Javier Navarro
9 min readApr 28, 2018

--

Con el proposito de ahorrar gas, recientemente instalé en casa un termotanque solar marca ArgentumTech(1) (http://www.argentumtech.com.ar/), siendo en la actualidad el único medio para calentar agua sanitaria (cocina, lavadero y baños).

Termotanque solar ArgentumTech, 200 litros de capacidad

El mismo usa la radiacion solar para calentar el agua, y en caso que ésta no sea suficiente (por ejemplo tras varios dias nublados con temperatura reducida o un rapido y considerable consumo de agua caliente), el mismo cuenta con una resistencia electrica que puede tambien calentar el agua.

Luego de la instalación me surgieron varias preguntas:

a) Cuan rápido baja la temperatura de noche?

b) Cuán rápido se recupera la temperatura cuando sale el sol?

c) Cuanto se usa el calor del sol y cuanto la energía electrica para mantener el agua caliente?

Siendo un aficionado a la automatizacion hogareña, con un poco de electronica casera se pueden responder las dos primeras preguntas, y la tercera se puede resolver con un monitor de consumo eléctrico -motivo de otro post.

Los Sensores

Para medir la temperatura utilicé un sensor DS18B20 (USD 6 en Amazon, $100 en MercadoLibre). Es digital y viene con un cable de 1 metro sumergible. Inicialmente había considerado introducirlo por el orificio de venteo del termotanque pero luego de consultar con el vendedor me sugirio ponerlo en contacto con el tanque en alguna superficie expuesta.

DS18B20 — Sensor sumergible de temperatura

Tambien utilicé un sensor de temperatura y humedad DHT11. El mismo es un sensor ambiental, que utilicé para comparar contra la temperatura exterior del tanque. El sensor de humedad si bien emite information no la tengo en cuenta debido a que esta dentro de un compartimiento estanco. Se consigue en Amazon por alrededor de USD 6.

DHT11 — Sensor de temperatura y humedad

El Chipset: Wemos D1 Mini

Para capturar y procesar la señal de los sensores utilicé un chipset Wemos D1 Mini. El mismo se consigue a alrededor de USD 6 en Amazon y $200 en Mercadolibre. Tiene wi-fi incorporado (esta basado en el chipset ESP8266), procesador de 80/160 MHZ y 4 M de RAM (salvo el wifi, igual capacidad que mi PC Pentium del año 1995). Cuenta con un puerto USB para alimentacion y útil asimismo para debugging (Arduino). Mide apenas 2.5 cm de ancho y 3.4 cm de largo.

D1 Mini: puerto USB en la parte inferior

Los sensores van soldados a los puertos digitales D8-D8 (requiere algunos puntos de soldadura).

Utilicé una caja hermética para dar estanqueidad y proteger el chipset del clima:

Wemos D1 Mini (izq) + DHT11 (inf. der.)

Hay dos opciones disponibles para alimentación eléctrica:

a) Usar el pin de 5V en el D1 Mini: con tres pilas AA se puede alimentar todo el chipset, pero el consumo electrico del chipset dura apenas un dia. Se puede xtender la vida útil entre recargas poniendo el procesador en deep-sleep y luego de un tiempo prudencial (ej. 30 minutos) hacer un wake-up. Otra opcion es recargar las pilas durante el dia con un pequeño panel solar, esto quedará para una etapa futura.

b) Proveer energía usando el puerto Mini-USB en el D1 Mini: mas simple pero necesita un outlet USB. Esta fue la opcion seleccionada.

Cable 220V, adaptador a ficha inglesa de 3 patas (el unico que tenia disponible) y adaptador USB. Tuve que serruchar la toma electrica porque no entraba dentro del receptor hermético

Capturando y enviando datos vía HTTP

Una vez conectados los sensores al chip el ultimo paso es cargar el código que se ejecutará en el D1 Mini.

En mi caso utilicé el IDE de Arduino (version 1.8.5) y las librerias DHT.h para leer la temperatura y humedad, OneWire.h para leer y decodificar la temperatura de la sonda sumergible. ESP8266WiFi.h se utiliza para establecer conexion con el access point WIFI y para enviar los datos via HTTP.

Nota: el codigo fuente esta disponible en GitHub bajo licencia Apache License 2.0: https://github.com/jenavarro/d1minitempsensor

En el código fuente hay 3 partes bien diferenciadas:

void setup()

Establece la conexion Wifi, incluyendo codigo para hacer un restart en caso que no sea exitoso (resiliencia).

float getTemp(void)

Esta función realiza la lectura de la temperatura del sensor digital, y su decodifcación.

void loop()

Ejecuta un lopp infinito donde se toman las lecturas y se envian al servidor via HTTP. Luego existe una espera de 60 segundos y vuelve a repetir el proceso. Con metricas de temperatura no tiene sentido tomar metricas con mas periodicidad, dada la baja tasa de cambio de las variables.

#include <DHT.h>
#include <ESP8266WiFi.h>
#include <OneWire.h>
String apiKey = "THINGSPEAK API KEY";
const char* ssid = "SSID";
const char* password = "PWD";
const char* server = "api.thingspeak.com";
int connecttimes = 0;

#define DHTPIN D2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;
OneWire ds(D6);void setup()
{
Serial.begin(115200);
delay(10);
dht.begin();

WiFi.begin(ssid, password);

Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);
connecttimes = 0;
while (WiFi.status() != WL_CONNECTED && connecttimes < 120 )
{
delay(500);
Serial.print(".");
connecttimes++;
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Cannot connect to WiFi, resetting...");
delay(3000);
WiFi.disconnect();
ESP.restart();
delay(3000);
}
Serial.println("");
Serial.println("WiFi connected");
}
float getTemp(void)
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

ds.reset_search();

if ( !ds.search(addr))
{
ds.reset_search();
delay(250);
return -200;
}


if (OneWire::crc8(addr, 7) != addr[7])
{
Serial.println("CRC is not valid!");
return -200;
}
Serial.println();

// the first ROM byte indicates which chip
switch (addr[0])
{
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return -200;
}

ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

for ( i = 0; i < 9; i++)
{
data[i] = ds.read();
}

// Convert the data to actual temperature
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms

}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
return celsius;
}

void loop()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
float tsonda = getTemp();
if (isnan(h) || isnan(t))
{
Serial.println("Failed to read from DHT sensor!");
}

if (client.connect(server,80)) {
String postStr = apiKey;
if (!isnan(t)) {
postStr +="&field1=";
postStr += String(t);
}
if (!isnan(h)) {
postStr +="&field2=";
postStr += String(h);
}
if (tsonda != -200) {
postStr +="&field3=";
postStr += String(tsonda);
}
postStr += "\r\n\r\n";

client.print("POST /update.json HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);

Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" degrees Celsius Humidity: ");
Serial.print(h);
Serial.print(" Temp Sonda: ");
Serial.print(tsonda);
Serial.println(" Sending data to Thingspeak");
}
client.stop();

Serial.println("Waiting 1 min");
delay(60000);
}

Visualización de datos

Finalmente, para la presentación de los datos usé el servicio gratuito de https://thingspeak.com. El mismo permite capturar datos en un canal gratuito y establecer graficas.

Se debe registrar un usuario y luego obtener un API KEY para enviar datos a Thingspeak.com. Admite envio via MQTT o HTTP, por simplicidad elegí este último.

Una vez que se envian datos, se pueden configurar diferentes charts para visualizar los datos en una serie de tiempo:

Instalacion y puesta en marcha

Volviendo al techo de la casa, es el momento de instalar el dispositivo.

La primera opcion era instalar la sonda a la salida del agua caliente, desmontando el aislador de silicona. Como el sello de silicona estaba firmemente adherido, desestimpé dicha opcion. Mirando en el lugar del tanque donde esta el conector electrico (el calentador esta en el mismo lugar pero del lado interno del tanque), pude observar una superficie metálica expuesta entre el aislamiento de poliuretano. Procedi a poner la sonda de en contacto y en mi celular pude observar que tenia una temperatura de 63 °C. Bingo! Por lo que puse la sonda apoyada contra esa superficie y luego agregué aislante térmico.

Conector electrico del calentador, cable violeta es el proviene de la instalacion de la casa, cable blanco alimenta el conector USB del dispositivo.

Como la fuente de alimentación del chipset es vía puerto USB, tome energia electrica del ingreso al termotanque, con eso evite traer varios metros de cable desde la base del tanque de agua.

Resultado luego de cerrar nuevamente el receptáculo

Finalmente el receptaculo hermético quedó sujeto al armazon metálico. Dado que es extremadamente liviano lo asegure al armazón.

En el grafico inferior se puede observar las temperaturas de la sonda del tanque. Antes de las 11:50, las temperaturas se corresponden cuando el sensor estaba en el interior de la casa, a partir de las 11:40+ se corresponden con la temperatura del agua del tanque.

Cabe notar que la temperatura fue en aumento con la incidencia de la luz solar, desde alrededor de 69°C a las 11:38 hasta los 83°C.

En resumen, se puede inferir que el termotanque solar, en horario óptimo de luz solar, en el transcurso de 266 minutos hizo elevar de temperatura de 200 litros de agua, 14 °C, a un ratio de 1°C cada 19 minutos.

A las 11:38 se hizo la instalacion de la sonda
69°C a las 11:38
83°C a las 16:03

Por último, una prueba puntual: para visualizar empíricamente la respuesta térmica ante un evento, se puede observar el efecto de tomar una ducha de 4 minutos, sobre la temperatura del agua. La misma finalizó en el punto marcado por la fecha (17:29). Si bien hay un leve curva decreciente, el diferencial térmico no es considerable. A las 16hs se observa el valor de temperatura máximo para el día: 83.31°C, teniendo a las 17:29 un valor de 81.25°C, o sea una diferencia de -2.06 °C.

Valor máximo de temperatura y post-baño.

En conclusión, con un costo de hardware alrededor de $500 (entre chips, cables y caja hermética) y un costo cero de software y servicios, se puede montar un monitor de temperatura remoto. Si bien no está pensado para un tiempo de uso prolongado, debería funcionar sin problemas durante varios meses.

Cabe aclarar que existen dispositivos dedicados de hardware que realizan esta tarea, incluso en combinacion con casos de uso adicionales, como por ejemplo detener el uso del calentador electrico si es de día (donde se asume que el sol debería ser suficiente), o cortar el ingreso de agua fria al tanque durante la noche, para evitar que se diluya el agua caliente. Estos dispositivos, si bien mas caros, cuentan con calidad de construccion por lejos mejor que el dispositivo hobbysta montado para este artículo.

(1) Argentumtech es el fabricante del termotanque pero no auspicia ni influyó en este articulo.

--

--

Javier Navarro

Lector ávido, programador hobbista, fan de la música en todas sus formas. [javier.e.navarro (at) gmail.com]