Proyecto control de chimenea (ampliable)

Hola y feliz año a tod@s

Antes de nada, ya que este es mi primer mensaje, quiero agradecer a esta comunidad su trabajo, sin vosotros posiblemente no habria llegado a plantearme el proyecto que llevo en mente ni habría ido resolviendo las dudas que por ahora han ido surgiendo.

Por otro lado, aprovecho para presentarme; soy mañico y tengo 50 primaveras, tengo experiencia sobre el mundo de la programación web y gracias a ello no me ha sido muy dificil adaptarme al lenguaje usado en Arduino.

Comencé en esto hace como 1 mes, cuando me plantee la idea de optimizar un sistema de calefacción por conductos desde una chimenea con un convertidor de calor; el proyecto era sencillo, con dos termostatos digitales controlar una turbina con dos velocidades y un par de ventiladores de extracción de aire caliente de la campana de la chimenea. No fue nada complicado pero no se adaptaba totalmente a lo que pretendía ya que necesitaba añadir algunas temporizaciones para no enfriar en exceso la campana de la chimenea con los ventiladores y los termostatos digitales no me daban esa opción :neutral_face:

Googleando, vi la posibilidad de hacerlo con Arduino debido a su control y me inicie en el tema con tutoriales y prácticas varias. He de decir que, aunque me considero un manitas y hago "casi" de todo, la electronica es un tema que no había trasteado aun.

Partiendo de una idea simple como la expuesta arriba, la fui complicando hasta tener a las 2 semanas un proyecto funcionando con un arduino UNO, un termopar tipo K y un display tft que me muestra la temperatura, los estados de las salidas y me permite modificar a voluntad las temperaturas de activación de los diferentes ventiladores, las temporizaciones y el apagado/encendido del sistema, pero tras haber visto lo que habéis hecho algunos... quería mas :grinning: :grinning:

Tras investigar en la red sobre el mundo del IoT y ver diferentes opciones, me ha planteado ampliar el proyecto para domotizar la vivienda y, en principio, había pensado en una Rapsberri como cerebro, openHab como software y MQTT como medio para comunicar todo; de hecho tengo ya funcionando en un PC openHab y mosquitto como MQTT, pero me he encontrado con un problema y es ese el tema del mensaje, he creído conveniente explicar la base del proyecto por si me aconsejais algo diferente.

El problema en cuestión es enlazar los diferentes dispositivos con el sistema central, por ahora estoy intentando que el tft antes comentado sea independiente para usarlo como monitor y configurador del sistema inalámbrico por wifi y tras intentarlo con un ESP8266-01 me he dado una y otra vez de golpe con un muro que no consigo superar :sob: :sob:

Necesito que el arduino que controla el tft reciba y envie mensajes MQTT al sistema, y no hay forma de que el ESP8266 lo haga, he probado muchas opciones que he ido buscando en Google y a lo mas que he llegado es a un "timeout" o "failed" por lo que yo creo son errores de respuesta del ESP con los comandos AT.

He visto muchas opciones sobre cómo programar ese chip para que sea autónomo, pero en mi caso no me sirve, ya que no se trata de enviar un dato via wifi, sino de enviar/recibir bastantes datos, por ello necesito que sea simplemente un medio de comunicación.

He probado con diferentes firmwares AT y con varios ESP-01 y en todas las pruebas obtengo el mismo resultado.

Tambien he estado viendo los cores que hay para el chip, pero entiendo que son para programarlo como autonomo y no como enlace wifi con el servidor MQTT.

Las librerias que estoy intentando usar son:
WifiEsp: GitHub - bportaluri/WiFiEsp: Arduino WiFi library for ESP8266 modules
Pubsubclient: GitHub - knolleary/pubsubclient: A client library for the Arduino Ethernet Shield that provides support for MQTT.

Pero no obtengo buenos resultados, unas veces me da error de tiempo, otras error de escritura, otras error de socked, vamos.... un belén :frowning:

Attempting MQTT connection...[WiFiEsp] Connecting to 192.168.1.105

startClient 192.168.1.105 1883


AT+CIPSTART=3,"TCP","192.168.1.105",1883
3,CONNECT

OK
---------------------------------------------- > 0

sendData: 3 27

OK


Recv 27 bytes
3,CLOSED
SEND FAIL
[WiFiEsp] >>> TIMEOUT >>>
[WiFiEsp] Data packet send error (2)
[WiFiEsp] Failed to write to socket 3
[WiFiEsp] Disconnecting 3
stopClient 3


AT+CIPCLOSE=3
UNLINK

ERROR

No se, soy un auténtico novato en esto y estoy convencido de que en algo me estoy equivocando, quizá el planteamiento del sistema, quizá el ESP-01... no puede ser tan complicado hacer funcionar algo que lleva años funcionando.

Agradecería por ello cualquier consejo sobre el planteamiento, hardware o software a cambiar y/o modificar porque estoy totalmente perdido :sob:

Un saludo

Bueno es y no es fácil.
Lo primero es dominar el ESP8266-01
Es una cosa chiquita que tiene vida propia pero porque cometemos errores tontos por desconocimiento.
Primer error tonto.
No lo alimentamos bien.
No dices nada de como lo alimentas.
Requiere 200mA a 3.3V provistos por una fuete adecuada. Es asi como lo alimentas?

Que regulador usas? un AM1117 u otro LDO?

Tienes puesto un capacitor de 10uF 6.3V o mas entre VCC y GND del ESP01? Es algo que elimina problemas aun teniendo la fuente de la corriente que mencioné antes.

Estos dos puntos son fundamentales.

Luego podemos analizar el código, podemos analizar que usas en la PC, etc etc.
Tengo sugerencias para eso tmb.

Pero vamos por este lado primero.

Hola surbyte, gracias por responder.

Estoy usando un modulo de alimentación MB102 para el ESP-01 y el USB para el arduino (con GND común), además tengo un convertidor lógico entre RX y TX del ESP al Arduino, no tengo puesto el condensador, solo lo he visto en esquemas para programar el ESP, pero no cuesta nada hacer la prueba (en cuanto tenga uno a mano).

Por el lado del PC, estoy usando un portatil con el IDE de Arduino, el (mini)PC donde tengo mosquitto y openHab es otro distinto que uso como media center, aunque esa parte la metere posteriormente en una Raspberry Pi.

En lo que respecta al código, uso el ejemplo que tras mucho buscar he encontrado en la web de Sony Arouje, también he realizado algunas modificaciones a la librería original de WifiEsp que se comentan en la sección de problemas para ampliar los tiempos de captura de respuesta. (Voy probando todo por separado antes de introducirlo en el código completo para no volverme loco)

#include <WiFiEsp.h>
#include <WiFiEspClient.h>
#include <WiFiEspUdp.h>
#include "SoftwareSerial.h"
#include <PubSubClient.h>

IPAddress server(192, 168, 1, 105);
char ssid[] = "iot_wifi";   // your network SSID (name)
char pass[] = "iot_pwd";    // your network password
int status = WL_IDLE_STATUS;  // the Wifi radio's status

// Initialize the Ethernet client object
WiFiEspClient espClient;

PubSubClient client(espClient);

SoftwareSerial soft( 3, 2 ); // RX, TX

void setup()
{
  // initialize serial for debugging
  Serial.begin(9600);

  // initialize serial for ESP module
  soft.begin(9600);

  // initialize ESP module
  WiFi.init(&soft);

  // check for the presence of the shield
  if (WiFi.status() == WL_NO_SHIELD)
  {
    Serial.println("WiFi shield not present");
    
    // don't continue
    while (true);
  }

  // attempt to connect to WiFi network
  while ( status != WL_CONNECTED)
  {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    
    // Connect to WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }

  // you're connected now, so print out the data
  Serial.println("You're connected to the network");

  //connect to MQTT server
  client.setServer(server, 1883);
  client.setCallback(callback);
}

//print any message received for subscribed topic
void callback(char* topic, byte* payload, unsigned int length)
{
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  
  for (int i=0;i<length;i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void loop()
{
  // put your main code here, to run repeatedly:
  if (!client.connected())
  {
    reconnect();
  }
  client.loop();
}

void reconnect()
{
  // Loop until we're reconnected
  while (!client.connected())
  {
    Serial.print("Attempting MQTT connection...");
    
    // Attempt to connect, just a name to identify the client
    if (client.connect("arduinoClient"))
    {
      Serial.println("connected");
      
      // Once connected, publish an announcement...
      client.publish("command","hello world");
      
      // ... and resubscribe
      client.subscribe("presence");
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

De todas formas, siguiendo investigando el tema, he encontrado lo que creo es otra opción, es reprogramar el ESP como puente entre arduino <-> Wifi y evitar asi el uso de los comandos AT; no se si estoy en el camino o sigo equivocado, ya que prácticamente toda la información que encuentro es en inglés para gente experimentada y yo aún ando en pañales, pero soy muy cabezudo y no será por hacer pruebas :wink:

No soy de los que buscan "todo hecho", prefiero que me enseñen el camino y andarlo yo mismo para aprender, aunque ello me cueste horas de sueño y dolor de cabeza :sleeping: :sleeping:

Tu proyecto no es para principiantes de modo que aunque encontraras pinceladas de información en español, la gran mayoría esta en inglés.

No entiendo eso de reprogramar ESP para evitar usar comandos AT.
Ya estas usando el ESP sin comandos AT, comúnicate via Serial con el Arduino y listo

Te estoy entendiendo?

Vaya!! juraria que habia enviado una respuesta hace dias

No, surbyte, en el codigo que puse arriba utilizaba librerias que usan los comandos AT, pero me di cuenta de que son muy limitadas, asi que hice pruebas programando el ESP directamente desde el IDE de arduino como si de un arduino se tratase y funciona mucho mejor, mas simple y mas estable.

He avanzado mucho en el proyecto desde mi ultimo mensaje, y tambien he modificado mucho el proyecto en si; cuando puse en el titulo lo de ampl̀iable era porque la intencion final del tema era integrarlo con un sistena domotico a nivel global.

Desde entonces he ido haciendo pruebas y cambios hasta tenerlo basicamente definido.
He desestimado la pantalla tft por la complejidad que supone contra la facilidad de hacerlo via web y he ampliado el proyecto a un sistema domotico completo de la vivienda, apoyandome en una Raspberry Pi como sistema central, Home Assistant como software y MQTT para la comunicacion entre dispositivos; hasta ahora lo que he ido probando funciona perfectamente.

La parte de hardware la estoy realizando con Nodemcu por la facilidad que supone su programacion y comunicacion wifi; hasta el momento voy bien con los pines disponibles.

Aunque no estoy muy puesto en electronica, me he aventurado a hacer una placa integrando todo lo que necesitaria para cada habitacion mezclando un poco de aqui y un poco de alla.

No se si este foro es el lugar adecuado para exponer el circuito y que me podais comentar posibles problemas, pero seria de gran ayuda.

Un saludo

El foro es de Arduino pero puedes continuar porque es un tema interesante por los elementos involucrados.
Ya te daré mis opiniones pero vas muy bien.

Bueno, pues al lío.

Decir antes de nada que mi nivel de electrónica es muy muy básico, se lo que es y más o menos lo que hace cada componente, pero hasta ahí puedo leer... confío que meterme en este berenjenal me aporte algo de experiencia y aprendizaje; si que tengo conocimientos de electricidad a nivel "manitas".

Por lo dicho anteriormente, los esquemas que he hecho son en parte trozos recopilados a base de googlear y combinados para el proyecto en si.
No me peguéis mucho si he hecho alguna burrada; no los he probado aún debido a que no tengo todos los componentes necesarios, espero ir probandolos en breve.

Como comenté en un mensaje anterior, el proyecto inicial era controlar las turbinas / ventiladores de una chimenea que a través de conductos calienta las diferentes estancias de la vivienda. Los conductos también se utilizan por una bomba de calor, con lo que en cada rejilla tengo 2 vías de aire, una de la bomba de calor y otra de la chimenea. (surbyte, si ves conveniente modificar el título inicial, puedes hacerlo, ya que se va a ampliar a toda la vivienda)

Ya metidos en harina, me he propuesto también automatizar las rejillas de forma que se pueda regular la cantidad de aire que sale a cada habitación en función de la temperatura seleccionada en cada una de ellas, de esa forma se conseguiría una temperatura más uniforme y reducir costes.

El proyecto en sí lo he ampliado para realizar una domotización más amplia de la vivienda, concretamente en cada estancia el sistema se encargará de:

  • Encender / apagar luces cuando se detecte presencia (sensor PIR) Y no haya suficiente luz (sensor LDR) Y se esté dentro de un intervalo horario concreto (Home Assistant). Las luces deben mantener el control manual con interruptores actuales.
  • Abrir / cerrar las rejillas de ventilación en función de la temperatura de cada habitación (sensor temperatura DHT22) y la temperatura de salida de aire de los conductos (sensores de temperatura en rejillas DS18B20 OneWire).
  • Encender / apagar luces exteriores de la vivienda cuando oscurezca (sensor exterior LDR o Home Assistant)

El esquema se ha hecho integrando más o menos todo lo necesario, pero el hardware se va a realizar de forma modular porque cada lugar precisará de unos u otros componentes, por ello pretendo hacer una placa de alimentación, otra de entradas / salidas al Nodemcu y otra de relés para activación / desactivación de luces o lo que sea necesario.

Cito las fuentes de varias partes del esquema:

Detalle del esquema de iluminación, por cada línea se ha añadido un relé que activa / desactiva la luz y, a su vez, informa al sistema de su estado.

De momento es lo que tengo hecho, cuando reciba los componentes que me faltan iré comprobando si funciona como debe y haciendo los diferentes programas para arduino.

Cualquier comentario / crítica será bien recibida, recordar que soy novato :-[ :-[

Está todo bien?
No haríais ningún cambio de componentes?

Ya verás que risas como le meta "chispa" y haga Boom!! :smiley: :smiley:

El HCPL-3700 es carísimo, hemos respondido en algunos hilos alternativas.

Lo que veo luce bien.
El 1N4148 es un diodo de señal, si esta para controla un relé no me gusta mucho su eleccion, usa un 1N470X donde X es el numero en cientos de volts. con un 2 vas bien.

El diodo del segundo esquema veo que es un error al poner el componente en Easyeda, realmente puse un 1N4004 como aparece en el superior, pero si lo ves mejor los cambiaré por el 1N4702

El HCPL-3700 es un poco más caro que otros, pero integra todo y los encontré en aliexpress a 5€ el pack de 10, bastante asumible.

Quisiera añadir al esquema unos leds informativos para ver a simple vista los estados de salidas / entradas de señales de iluminación y relés, con el relé es sencillo añadiendo una resistencia de 220ohm, pero me pierdo con el HCPL.

La salida del HCPL es inversa, con lo que pretendía poner ese led en paralelo con el condensador C1, el problema es que por más fórmulas que miro y por más que leo el datasheet, no logro averiguar el porqué de las resistencias de 27K y que voltaje tendría en C1 para calcular el valor de la resistencia para el led, no se si me explico...

Con lo que me comentas doy el esquema por válido cambiando ese diodo y lo prototiparé para ir haciendo pruebas.

Gracias :wink:

El diodo del segundo esquema veo que es un error al poner el componente en Easyeda, realmente puse un 1N4004 como aparece en el superior, pero si lo ves mejor los cambiaré por el 1N4702

No espera!!! yo me confundí, era 1N400X y no 470X como puse... es un error de mi parte.
El mas genérico para ese uso es el 1N4002

El HCPL-3700 es un poco más caro que otros, pero integra todo y los encontré en aliexpress a 5€ el pack de 10, bastante asumible.

Vaya, eso lo pone a 0.5 € cada uno, impecable, adelante entonces.

La salida del HCPL es inversa, con lo que pretendía poner ese led en paralelo con el condensador C1, el problema es que por más fórmulas que miro y por más que leo el datasheet, no logro averiguar el porqué de las resistencias de 27K y que voltaje tendría en C1 para calcular el valor de la resistencia para el led, no se si me explico...

Las resistencias de 27K son para disminuir la corriente de 220VAC al valor que necesita el par de diodos en antiparalelo de la entrada del HCPL-3700. Luego reviso eso si para 220VAC esta bien pero supongo que si.
Seguro que ese valor viene indicado en el datasheet para 220VAC si es asi, es correcto.

Ok, entonces doy por válidos los 1N4004 que tengo puestos en el esquema.

He encontrado un documento de uso del HCPL-3700 donde explica los cálculos para 110V, pero sinceramente... con tantísimos valores como aparecen en el datasheet... me pierdo del todo y no he sido capaz de traspolarlo a 220V porque no se de donde saca el valor de 98V que usa de referencia.

Los 27K del esquema los vi en otro topic de este foro en los que se usa ese chip para detectar tensión de 220V y di los valores por buenos, es una pena no encontrar ese mensaje >.<

La duda es que voltaje tendré en el condensador C1 para poner ahí un led informativo, pero tampoco es problema, cuando haga el montaje mido lo que tengo realmente y calculo la resistencia para ese led.

Te dejo los enlaces del datasheet y el documento que te he comentado.

Datasheet
HCPL-3700 Application Note

Esto

Este es el hilo Sensor de voltaje 220 voltios AC para arduino con Optoacoplador

Exacto, ese es, gracias :wink: