Proyecto casi terminado, necesito "afinarlo"

Hola Gente como andan, despues de varios meses trabajando en esto creo que llegue a mi limite..
se trata de un control de indoor, puede control la temperatura ambiente y la humedad, por medio de relees activando calefaccion o humificador.
tiene un RTC y un timer para encender y apagar las luces, ademas se puede programar una temperatura con luz y otra con luz apagada. entre otras cosas voy a dejar un video del funcionamiento (creo que me falto setear en el video temperaturas y humedad), pero es muy similar al seteo de timer.

bueno les cuento los problemas que estoy teniendo.
el DHT22 (temp y humedad ambiental) se cuelga y dice NAN, le desconecto el positivo lo vuelvo a conectar y vuelve a funcionar.

tambien aveces se tilda quedando totalmente colgado todo ya hay que reiniciarlo (1 vez al dia tal vez dure 2 dias funcionando) o se ponen todos caracteres raros en el display.
esto ultimo note que pasaba sobretodo cuando encendia un viejo tubo fluorecente del garaje de mi casa.
me estan por prestar una UPS online para descartar ruido electrico en la red y tener una tension mas estable.

pero se que en el codigo me faltan delay a los sensores, pero no los puedo usar porque me frenan todo el programa, deberia usar millis, pero no estoy muy seguro de como hacelo y como comprobar su funcionamiento luego de aplicarlo.

este es el link del video Control automatico indoor arduino - YouTube

tambien les dejo el diagrama (perdon lo hice a mano)
y el .ino del cod

Gracias de antemano al alma caritativa que pueda ayudarme con esto

final_depurandocomentado.ino (33.7 KB)

El mal de los DHT creo que lo sufrimos todos, aleatoriamente se quedan colgados y hay que hacerle un reset de alimentación, yo controlo el tiempo de la ultima lectura correcta, si hace mas de un minuto le hago un reset con un relé, si hace mas de cinco me envía una notificación push y un email.

Para el cuelgue tendrás que investigar el motivo, puedes usar el watchdog para que se haga un reinicio automático en caso de cuelgue, yo uso la librería Adafruit_SleepyDog.h

Hi,
El pin de salida del sensor require una resistencia de 10K de pullup. Por casualidad se la tienes instalada.

krnlpanic:
El mal de los DHT creo que lo sufrimos todos, aleatoriamente se quedan colgados y hay que hacerle un reset de alimentación, yo controlo el tiempo de la ultima lectura correcta, si hace mas de un minuto le hago un reset con un relé, si hace mas de cinco me envía una notificación push y un email.

Para el cuelgue tendrás que investigar el motivo, puedes usar el watchdog para que se haga un reinicio automático en caso de cuelgue, yo uso la librería Adafruit_SleepyDog.h

Vi la opcion del watchdog, pero como sospecho que el cuelgue es por problemas electricos, hay bajones de tension en casa, portal motivo tengo un elevador, estabilizador en la entrada de la casa, y note que si la luz sube o baja 2 o 3 veces seguidas cuelga... Voy a probar con la ups online y vere como va...
La del relee es buena no la habia pensado... Hace poco empece con arduino y que desepcion que me lleve con los sensores

Activa el watchdog, es un momento son 3 lineas y te va a evitar tenerlo colgado.

#include <Adafruit_SleepyDog.h>

void setup {
  Watchdog.enable(4000);
}
void loop {
  Watchdog.reset();
}

Si usas algún delay largo es posible que te dispare el watchdog, puedes ponerle mas tiempo o poner varios reset por tu código para reiniciar el contador.

Hi,
Aqui posiblemente el problema puede ser otro ya que estas usando un Power Supply de PC. Este trabaja de un voltaje de entrada de 100 voltios minimo y a un voltaje maximo de 240 voltios. El Power Sypply usa el principio de switchers. Yo te pregunte si habias conectado la resistencia de 10K al pin de la salida pues este require de una pero que creo que no haz contestado. Normalmente en el sketch en el setup hace un chequeo para ver si el sensor esta available y si no esta entonces se queda en ese loop permanentemente. De la unica manera sacarlo de ese loop es usando el reset. Yo uso ese modulo por mese y no he tenido problems con hellos.

yo tuvv problemas con tres,dejaban de funcionar, sea con el UNO o el Mega, por ese motivo cambie al bme280,

@tauro0221
Hola si tengo la resistencia, y de entrada lo lee bien el problema es despues de un rato que cae.
de echo venia usando una resistencia distinta, no recuerdo de cuanto, pero era la recomendada por el vendedor del DHT22, cuando vos me mencionaste la de 10k la cambie, desde esta mañana viene funcionando bien.. tendra algo que ver?

@krnlpanic

esto vendria a ser algo como que si el loop se frena por mas de 4s me resetee el arduio?
asi de simple es?

tendria que guardar en rom las temperaturas, humedades y horarios del timer para que cuando reinicie no se reincien tambien no?

Okay. este tema del DHT22 se nos cuelga a todos asi que lo declaro de Interés Arduino GENERAL ya que tarde o temprano todos lo usamos y tener algo que se cuelga sin motivo realmente es molesto.
Tenemos que idear varios planes de acción:

  1. Una solución aunque sea una chapuza (parche) que resuelva el tema. El relé o bien un pin extra que lo alimente y le quite alimentación y lo vuelva a alimentar para resetearlo parece ser lo mas simple. Si uso un pin para un rele me parece mas simple usarlo para alimentarlo directamente o poner un MOSFET Canal P que lo alimente directamente.
    Digamos que en parte tenemos algo que lo revive.

  2. Ver como se comporta con el uso del Watchdog sugerido por krnlpanic. Olvidate de guardar datos. Acá lo relevante es que no se cuelgue su funcionamiento.

  3. Acá viene el problema mas serio investigar que ocurre. Porque falla o se cuelga o es fallo de la rutina de lectura. Esto es lo mas dificil de resolver.

Tal vez abra un hilo para hacer un seguimiento del tema y no desvirtuar el hilo del compañero y luego en todo caso volcamos las conclusiones.

Por lo pronto con 1 o 2 resuelves tu problema inmediato @towersa1.

Hi,
Si la resistencia tiene que ver dependiendo del valor de esta. Si le pones una resistencia muy baja entoces estas poniendo el pin con un voltaje y corriete muy alta y posiblemente el transistor que usa el modulo de salida no es suficiente fuerte para manejar la senal de salida. Otra cosa es bueno simpre anadirle dos condesadores en parallelo entre el VCC y ground uno de ceramica de .1ufd y el otro de como 10ufd. Yo uso 8 modulos de esos y nunca he tenido problema como el que estas experimentando.Este es que yo uso adjunto foto.

Esa es la función del watchdog, reset al procesador si no ha recibido un reset al contador en 4 segundos o lo que le programes en el setup.

Puedes guardar datos en la eeprom si no es algo que modifiques muy a menudo ya que tiene un limite de escrituras aproximado de 100000, yo guardo horas temperaturas y estados que en caso de reset vuelve a leer de la eeprom.

Mis DHT22 nunca fallaron en protoboard, hasta que lo puse todo en su sitio y empezaron los fallos de lectura, el que mas reinicios necesita unos 2 al día es el mas alejado con unos 15m de cable, le puse cable de 0.5 apantallado y cambie el sensor y sigue igual.

Ahora estoy probando unos LM35 aunque estos no leen humedad, tengo 10 conectados en protoboard y me están dando lecturas muy similares al DHT22, estoy haciendo 100 lecturas de cada uno para hacer media y se leen por entrada analógica, precio 0.61€/unidad.

A ver si nos entendemos o tal vez sea yo quien no entiende.

tauro0221 dice que con 10k funciona el DHT22 y @towersa1 dice que con 10k ahora le funciona.
El "ahora me funciona" es porque antes no funcionaba nada o porque se colgaba y ahora no.
Yo tengo 4k7 y bueno probaré 10k a ver como se comporta. De todos modos estoy haciendo cambios y no he visto el comportamiento a largo plazo como para comentar si falla o no con 4k7 o 10k.
Cuando recupere la estabilidad de mi sistema lo haré y comentaré.

Hi,
Otra cosa es que hay que tener en consideracion las lecturas deben de ser cada

(2) Communication and signalSingle-bus data is used for communication between MCU and DHT22, it costs 5mS for single timecommunication.

. En otras palabras hay que esperar 5ms de lectura a lectura de lo contrario vaz a tener malas lecturas. Ya como dije estoy usando 8 con la resistencia de 10K y los dos condensadores uno de 10ufd y otro de .1ufd en parallelo a los 5 voltios y ground.

Mis lecturas son cada 4 segundos.

Acabo de abrir uno de mis sensores que son los que llevan la carcasa exterior y dentro el sensor con un mini circuito que lleva un condensador y una resistencia 4k7, resulta que no tiene soldado ninguno de los componentes... :o
Acabo de ponerle la resistencia de 10k pero ya usaba el pull up interno, a ver que tal va ahora.

Edito: en 7 horas llevo en uno de los sensores 90 lecturas erróneas y 2 reinicios, en el otro 406 lecturas erróneas sin reinicios, contando que se han hecho unas 6300 peticiones de lectura me parecen unos números muy altos. Probare a poner los condensadores como dice el compañero.

Actualizo la info sobre los DHT22, he conseguido estabilizar los fallos de lectura, ahora tengo unos 8 al día usando la resistencia de 10k entre positivo y data y el pullup interno, con solo la resistencia tenia muchas lecturas erróneas.
No tengo todavía los condensadores que decía el compañero, probé con uno electrolítico por probar y pasaba lo mismo.
He descubierto que a veces al activar los motores de las persianas me bloquea el sensor mas alejado, desconozco por que no bloquea el otro ya que se alimenta todo de una fuente conmutada de 5V 10A, he pedido unos núcleos de ferrita pero desconozco si eso me va a ayudar.

Hi,
Si usa la resistencia externa de 10K no necesitas la interna ya que esta es de 50K. Creo que los condesadores puden elimnar los ruidos que se generan en los. Esto de los ruidos de los ruidos no los habia mencionado anteriormente.