Acuario Norte

Colaboradores => Zootecnia Domestica => Mensaje iniciado por: Ramon en 12-Marzo-2020, 18:51

Título: Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 12-Marzo-2020, 18:51
(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/terrario-exterior-pogona-marquesina-RET.jpg)


Terrario exterior para Pogona

El pasado día 1 de febrero unos amigos encontraron un pogona abandonado en una cuneta lejos de cualquier población. Pues nada, diez días después comencé con este proyecto que avanza bastante rápido.

Pretendo mantenerlo en el exterior en un invernadero climatizado todo el año de 2x1 metros cuadrados a las faldas del Pirineo con el mismo gasto energético que tendría en un terrario interior. Es posible? Hay posibilidades pero habrá que verlo.

Parte del secreto consiste en la relativa similitud entre las temperaturas del sur del "Outback" australiano y las de La Garrotxa (Girona) en lo que respecta a máximas y mínimas (Curioso no?) y parte del reto se lo lleva la gran diferencia en cuanto a pluviometría y por tanto humedad relativa.

Técnicas de carpintería, manipulación del policarbonato alveolar, electricidad, electrónica, fabricación de un hibernáculo (Nido donde hibernar, en este caso brumar) con clima controlado, montajes paso a paso, presupuestos, Etc...

Ya es el artículo más largo que he publicado y lo que le queda...

http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 13-Marzo-2020, 00:54
Menudo hotel!!

Ya quisieran todas las mascotas tener esos cuidados.

Un estupendo y completo proyecto muy bien documentado, como siempre.

Por cierto, le huesped  está pidiendo a gritos un retrato  :ppy:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 13-Marzo-2020, 07:45
Gracias Nell! Pues a falta de sol, hoy se ha complicado el tiempo para hacer fotos, copio aquí esta de hace unos días:


(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/Invernadero-pogona-RET.jpg)


Es asombrosa la rapidez con la que se ha recuperado este bicho. Son animales muy duros y recomendables pero solo para gente responsable, claro...
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 16-Marzo-2020, 01:07
Ramón, el bicho se libra de tener un "book" por estar lejos, pero si llego a estar cerca además de malcriarlo le aburriría a fotos porque es realmente precioso.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 16-Marzo-2020, 08:36
Aquí siempre serás bienvenida  :heart:

Pongo unos afotos generales del montaje:

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/invernadero-reptiles-montaje-10-RET.jpg)
http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/invernadero-reptiles-montaje-14-RET.jpg)
http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/invernadero-reptiles-montaje-28-RET.jpg)
http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)

Y ahora las del dormitorio climatizado. A que esta primera con un par de cuadros y un visillo parecería hasta confortable?

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/Hibernaculo-interior.jpg)
http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)


Bastante curro de marquetería...

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/Hibernaculo-carpinteria-acabada.jpg)
http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)


Y ayer, electricidad:

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/Calefaccion-hibernaculo-montada.jpg)
http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)


Primera prueba: Incremento de 15ºC en 15 45 minutos sin aislamiento externo y con solo 50w. A ver si baja la temperatura mañana a casi 0ºC como dicen y lo probamos de verdad. Sería cojonudo porque viendo como funciona ahora a bajas temperaturas, tendré todo el verano para corregirlo:

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/Hibernaculo-trabajando.jpg)
http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)


Sabéis a qué hora y qué día pasa el puto coronabicho? Necesito termostatos y temporizadores ya!  :mmm:


EDITO: Fueron 45minutos, lío de tablas y eso que me las hago yo...
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 16-Marzo-2020, 12:38
Ramón, te aseguro que hay cantidad de gente que te encargaría el hogar de sus mascotas. Plantéate meter en tu blog un modo de contacto para hacer encargos, es cuestión de que te compense económicamente.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: homerrafa (Noel) en 16-Marzo-2020, 23:01
No me esperaba menos de ti.  :clap1:

Quien habra sido el... que ha dejado tirado el pobre bichito.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 17-Marzo-2020, 06:54
Gracias Noel!  :kac:

Nell: Tengo un formulario de contacto en el blog, abajo (Pie) derecha, pero sospecho que ha dejado de funcionar...  :alas:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 17-Marzo-2020, 07:47
Pero no veo que pongas que haces todo ese tipo de trabajos por encargo, es información. Pon en grande...

¿Te planteas montar un acuario?
¿Quieres instalar una batería de acuarios?
¿Tú mascota necesita una casa a medida?
PONTE EN CONTACTO CONMIGO Y TE HARÉ UN PRESUPUESTO    :ppy:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: casal en 17-Marzo-2020, 09:46
Increíble el chalecito!
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 17-Marzo-2020, 10:13
Gracias a los dos  :kac:

Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: homerrafa (Noel) en 18-Marzo-2020, 10:19
Pero no veo que pongas que haces todo ese tipo de trabajos por encargo, es información. Pon en grande...

¿Te planteas montar un acuario?
¿Quieres instalar una batería de acuarios?
¿Tú mascota necesita una casa a medida?
PONTE EN CONTACTO CONMIGO Y TE HARÉ UN PRESUPUESTO    :ppy:

Hablando de eso y aprovechando el confinamiento... Ramón ¿Te planteas montar un acuario?   :coo:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 18-Marzo-2020, 10:49
Mmmm...  :whi:

Hace ya como dos años que palmó de viejo mi último pez y como la coyuntura no ayudaba, paré en seco.

Llevo algún año más mirando de tener un curro estable. Parecía que ahora la cosa aunque de forma precaria funcionaba y por eso me atreví a adoptar a esta pobre bestia y gastarme unos cuartos en instalarla (Me lo estoy pasando bien, ciertamente  :enj:) sabiendo además que en caso de mudanza express será fácil colocarla en buena casa. El pasado viernes mientras currábamos nos dijeron que en una hora teníamos que cerrar por decreto, eso es previsión... Este mes ya casi no cobraremos y ahora me encuentro con una instalación a medio montar y un futuro incierto porque no sabemos si volveremos. Vamos, una m----a de panorama y espera...  :mmm:

En cualquier caso, esto ya me ha pasado varias veces. Parones de varios años sin acuarios y por alguna maldita razón siempre recaigo  :ght:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 25-Marzo-2020, 07:19
Actualizo. Ha llegado el invierno a finales de marzo  :whi:

Tampoco es nuevo, aquí he visto nevar en mayo pero me ha permitido hacer las pruebas que necesitaba. Esta foto es de la primera prueba en exterior. Estoy contento con los resultados:

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/hibernaculo-primera-prueba-ext-RET.jpg)

Teniendo en cuenta que el cajón está desnudo, sin aislar y además fuera del invernadero, el sistema funcionará con tan solo 50w de consumo soportando mínimas de -8ºC.

He recibido los termostatos Inkbird ST-1000 y ya tengo el cuadro eléctrico secundario listo para montar pero a la espera de poder salir y comprar cable...

Como la cosa se alargará bastante y el bicho está creciendo, le he tenido que montar otro terrario de guerrilla que triplica la superficie del de cuarentena. Aquí ya no cabe:

(http://www.zootecniadomestica.com/wp-content/uploads/2020/03/Pogona-progreso-38-dias.jpg)

Y hoy estrena este, mientras no acabemos la instalación definitiva:

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/Terrario-reciclado-terminado.jpg)


Saludos y recogimiento  :kac:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 11-Abril-2020, 08:08
Buenas!

A pesar del confinamiento van llegando por correo los componentes, algunos de ellos pedidos hace un mes y aún quedan cosas por recibir (Contador de consumo eléctrico, Etc..)

El caso es que ya tengo a medio montar el cuadro de control del invernadero para bichos desérticos. Afortunadamente tanto termostatos como magnetotérmicos, diferencial, interruptor crepuscular y temporizadores horarios parecen venir bien de fábrica y eso que los precios son insultantemente baratos. Veremos lo que duran  :ppy:   Los componentes de seguridad son todos de marca fiable (Legrand).

De hecho, son dos cuadros eléctricos en uno pues una caja para cuadro industrial en la que quepa todo resulta cara:


(http://www.zootecniadomestica.com/wp-content/uploads/2012/10/Termostato-terrario-mecanizado.jpg)

El cuadro superior alberga (Caja de empalmes de arriba):


-Dos termostatos Inkbird ITC-1000 de doble relé (Calor y frío)

-Un transformador 5.5vcc para alimentar el ventilador de recirculación del hibernáculo.

-Un transformador 12Vcc para el extractor general.

-Un balastro para el HID (Lámpara de halogenuro metálico, la luz auxiliar para días nublados)


El cuadro general, empezando por arriba:


-1ª Guía DIN: (A) Magnetotérmico+diferencial generales / Hueco libre: Contador Kw consumo total / (B) Reloj temporizador+Interruptor crepuscular+Magnet. (HID?)

-2ª Guía DIN: (C) Reloj temporizador para termostato hibernáculo+Magnet. Calefacción hibernáculo / (D) Magnet. Foco infrarrojo auxiliar (IR) / (E) Reloj temporizador para termostato general+Magnet. Calefacción general.

(A): Protección general cuadro

(B): Interruptor crepuscular temporizado. Enciende la luces cuando el día está nublado y solo durante el día.

(C): Convierte al termostato del hibernáculo en termostato horario. Esto nos permite anular su funcionamiento durante el día mientras el bicho campa al sol (Ahorro energético)

(D): Protector magnetotérmico para un foco IR auxiliar e independiente.

(E): Convierte al termostato general en termostato horario. Esto nos permite anular su funcionamiento durante la noche mientras el bicho duerme en el hibernáculo y esto incluye todo el invierno durante la brumación (Ahorro energético)


La mitad de los componentes son prescindibles pero uno de los objetivos es mantener todo el año y en perfecto estado a un bicho del desierto australiano en plena calle (Y a pleno sol) a las faldas del Pirineo consumiendo la misma energía que gastaría en un terrario interior convencional de unos 500l.


A que se entiende?  :ght:

Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Gabri en 11-Abril-2020, 19:31
Tiene mas artilugios que el cuadro de mi casa  :nos: :alas: :ght:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 12-Abril-2020, 22:28
Ramón, tú todo a lo grande!

Más mimado no puedes tener al bicho.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 13-Abril-2020, 06:16
No es tan grande, engaña mucho. De hecho son tan solo tres líneas: Dos para el control del clima y una para controlar el alumbrado. Un tercio de los trastos son por seguridad. Otro tercio por ahorro energético y el tercio que queda es lo que realmente se necesita.

Aún le doy vueltas a la apertura automática del techo del invernadero. Hay varias opciones y algunas muy curiosas. Cuando lo decida os contaré.

Cuidaros
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 13-Abril-2020, 19:56
Ya tengo el mamotreto en fase de pruebas. Por ahora muy bien y sorprendido con la precisión y rapidez de los termostatos Inkbird ITC-1000:

(http://www.zootecniadomestica.com/wp-content/uploads/2020/04/modulo-analogico-terrario-exterior.jpg)
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 13-Abril-2020, 22:46
EDITO (Ramón): Añado aquí la pregunta te hice en tu tema  http://www.acuarionorte.com/index.php?topic=3255.15 (http://www.acuarionorte.com/index.php?topic=3255.15) con el fin de mantenerlo limpio:

4 euros?  :ght:

Creo que te entiendo, estás utilizando un procesador exclusivamente para la pantalla que debido al dimeo de 10 canales ya supone de por sí un cableado importante y el uso de casi todos los puertos. Ahora la duda que me ha quedado es acerca de los delay o retrasos a los que haces referencia:

En el uso que haces de una unidad de ESP32 monitorizando la pantalla has notado un retraso es decir, te ha dejado de trabajar en tiempo real?

Te explico. Ando en un proyecto que tengo comentado por aquí y que depende de cierto control horario estricto. Un sistema de control "analógico" montado sobre raíles DIN vamos, un cuadro eléctrico convencional.

Viene a ser un panel de control de clima en el que existen dos líneas independientes de termostatos de doble relé (Calefacción/refrigeración) que están controlados por sus respectivos temporizadores horarios. Más una línea de alumbrado que consta de temporizador horario e interruptor crepuscular (Célula LDR).

Un cuarto componente es el contador de consumo en Kw/h para simplemente eso, monitorizar el consumo total de todo el terrario. Todo esto es la versión simplificada de lo que me hubiera gustado controlar pero ya me valdrá. Lo tengo ahora mismo en pruebas en un terrario interior. Lleva unas 23 horas funcionando:

(http://www.zootecniadomestica.com/wp-content/uploads/2020/04/modulo-analogico-terrario-exterior.jpg)


Hace muuuchos años ya hice un taller de Basic en el colegio y comprobé de primera mano que soy un desastre para la lógica de programación  :kac:

Con todo, llevo bastante tiempo planteándome si meterme en Arduino o su versión pija Raspberry y ahora me acabas de mostrar el ESP32 que desconocía:

-Crees que con estos sistemas podría programar las temperaturas día-noche de dos zonas (Dos sondas/cuatro relés) y temporizar el encendido durante el día del alumbrado tan solo cuando el tiempo está nublado (LDR/1 relé) con un solo módulo y sin que afecte al parámetro tiempo o sea, sin delay?

-Sabes algo sobre la precisión de los elementos de medición (Periféricos) de estos montajes?

Este es el tema donde comenté el asunto: http://www.acuarionorte.com/index.php?topic=3260.0 (http://www.acuarionorte.com/index.php?topic=3260.0)

Perdona por ensuciarte el tema. Si quieres, no tengo mas que abrir otro cortar y pegar para dejar esto limpio.

Gracias de antemano!


Te respondo por aquí.

Si ese sistema no es difícil en sí y los pines te sobran pq serial 5 para reles y 3 de sensores y el Esp32 cuenta con 32 pines. El delay en sí es de milisegubdos y solo si está conectado a Internet en mi caso desde que digo "alexa empieza mantenimiento" hasta que se termina de ejecutar pasan 2 segundos... Vamos no se nota casi. Sin nada que vaya por Internet las lecturas y acciones son instantáneas.

En tu caso,  conectaría el Esp32 a una estacion meteorológica de tu zona y con un protocolo ntp para decir la hora exacta, 4 sondas de temperatura 2 dentro y 2 fuera así haces doble check.

La resolución de la sonda ds18b20 es de 0.0625 ° C y por el precio que tienen es bastante ya que cuestan sobre 0.40 euros. El Inkbird ITC-1000 tiene una resolución de 0.1

El raspberry pi para estas cosas es demasiado, no sería necesario.

En cuanto a la programación no te preocupes que estoy aburrido y te ayudo sin compromiso
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 14-Abril-2020, 07:00
Muchas gracias por tu ofrecimiento Korneto! Voy a estudiarme un poco el tema y sobretodo ver que lenguajes de programación admite el ESP32 porque tendría que empezar de cero y preferiría meterme en el de mayor difusión, no sea que en unos años desaparezca y a volver a empezar.

Supongo que la mayoría de periféricos usados en Arduino y Raspberry serán compatibles. Los componentes electrónicos seguro que lo son.

Hace tiempo que observo unos kits de aprendizaje cargados de componentes y sondas (NTC, PTC, LDR, DHT11...) Me pregunto si sería buena forma de empezar porque algunos vienen con tutoriales al menos para Arduino y Rasp.

Mi principal duda ahora mismo es si mirarme el ESP32 o Arduino- Raspberry porque su difusión es mayor y resultará más fácil encontrar tutoriales para monguers   :whi:

Muchas gracias crack! Me lo miro!
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 14-Abril-2020, 08:40
eso ya depende de gustos y mas que gustos necesidades.

Las diferencias basicas son

RASPBERRY Pi: Es un ordenador en si, es decir, admite monitores, teclados ratones etc etc y demas, una comunidad muy grande pero tambien muy tecnica, lleva sistema operatibo Debian, vamos un linux, lo mas intuitivo es programar en python pero hay que montar un servidor LAMP para ello... Tendrias que aprender a manejar Linux y a programar python o otro lenguaje web

Arduino / ESP32: Es un micro controlador, tambien admite algunas pequeñas pantallas pero no mas de 15 pulgadas, no admite ratones ni teclados, esta bastante mas limitado en este sentido, no lleva ningun SO dentro simplemente se compila un pequeño sketch o programa dentro. Para programar se puede hacer en LUA-Script o con ARduino IDE que basicamente es C++

Cualquiera de los dos tiene Tutoriales a barrer son comunidades muy grandes, quizas , Raspberry Pi al ser un poco mas complejo hay que expliralo mas detenidamente, en Arduino normalmente te poenne el codigo una breve explicacion lo cargas y funciona, es mas sencillito aunque menos explicado. En cuanto al ESP32 la gran mayoria de tutoriales son para el ESP8266 que tiene menos puertos pero sirven para los dos modelos, solo cambian algunas librerias.

Lo de los KIts... yo no soy partidario pq al final terminaras con mas trastos que no usaras por casa y nromalmente cuando compras un modulo (por ejemplo la sonda) ya te pone el vendedor una pagina con el ejemplo

Para que veas, pon en google "ds18b20 ESP32" o "ds18b20 Raspberry Pi" asi puedes comparar como se hace uno y otro. Personalmente yo no se nada de programacion y he ido aprendiendo con el tiempo poco a poco y la verdad que con Arduino IDE me ha ido bien y es facilote, quizas no el mejor pero si mas facil

Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 14-Abril-2020, 10:12


He echado tan solo una horita y media gugleando sobre el tema y ya me ha explotado la cabeza. Cualquier respuesta a un término plantea un mínimo de cuatro nuevos interrogantes. Para colmo escriben igual que programan, para encontrar en una frase una palabra completa has de pasar por varios acrónimos...  :ght:

Veamos, si me pongo en el tema para limitarme a sustituir mecanismos analógicos por periféricos en un microcontrolador gracias a la implementación de un código libre y gratuito que no entiendo, lo que voy a conseguir es lo que ya tengo eso si, en un espacio muy reducido y a menor precio. Ya es una ventaja. Pero dispongo de espacio y de los componentes analógicos en casa.

La cuestión importante (E interesante) es que además, voy a disponer de mucho tiempo libre y pocos recursos en estos próximos meses me temo, pues el dichoso virus me ha dejado sin trabajo y de recuperarlo (Parece que si) será probablemente para junio...

Ahora lo que primero tengo que sopesar es la posibilidad de llegar a asimilar algún día el código suficiente como para que un termostato sea un cronotermostato programable por ejemplo, al que pueda atribuir una serie de temperaturas a lo largo de un mismo día. Si soy capaz de eso en un par de meses tras haber conectado un Arduino (Seguramente por precio) al PC, añadirle el reloj, hacer que estos tres se entiendan y ya luego meterme a instalar algo de hardware (Sonda y relés) para por último introducir los primeros "sketch", me doy con un canto en los dientes.  :alas:

Me lo voy a estudiar de cerca y así que me decida por un equipo, otro, o desista te lo haré saber.

Gracias de nuevo Korneto.  :oba:







Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 14-Abril-2020, 10:58
Mi madriña, habláis en chino para mi, y eso que os leo atentamente e intento enterarme de algo.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 14-Abril-2020, 11:09
Nada yo solo te puedo decir desde mi humilde opinion, que intentes despiezar lo que quieres hacer en varias secciones, por asi decirlo, en vez de atacar el conjunto del codigo.  Si queremos un reloj que programe un interruptor, deberiamos coger el reloj mas fiable, osea, un NTP ( Network Time Protocol ) el cual nos dara la hora exacta, pero... antes hay que conectarse a internet. A eso me refiero con hacer secciones del codigo y hacer poco a poco

Por ejemplo para conectar el esp 32 a internet irias por secciones.

Primero las librerias necesarias

#include <Arduino.h>   // libreria de arduino
#include <WiFi.h>        // libreria para el wifi ( todas las sondas y demas usan librerias)

Luego las variables configurables ( Nombre de la red y la contraseña)

#define WIFI_SSID  "xxxxxxx"   
#define WIFI_PASS  "xxxxxxxx"


Donde xxxxx sera rellenado con tu nombre de red y contraseña

Luego lo que seria el codigo para conectarse a internet

void WIFI(){                         // el void es como un contenedor o caja donde ponemos un codigo para llamarlo desde cualquier parte del resto de codigo
WiFi.mode(WIFI_STA);          // Ponemos el modulo en STA o ESTACION, se puede poner en ESTACION, PUNTO DE ACCESO o LAS DOS
Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID);      //todo lo que ponga Serial.print sirve para escribir esto en el Monitor de Arduino, asi se comprueban los fallos
WiFi.begin(WIFI_SSID, WIFI_PASS);       // Iniciamos el Wifi con nuestra SSID Y CONTRASEÑA
while (WiFi.status() != WL_CONNECTED) {      // Le indicamos que mientras ( while )  el Estatus del WIFI  ( WiFi.status() ) sea diferente ( != ) a Conectado (WL_CONNECTED) Haga lo de dentro de los corchetes
Serial.print(".");      // imprime un . en el Monitor de Arduino
delay(100);            // Hacemos una pausa de 100 milisegundos para que se vuelva a ejecutar todo y reintentarlo
}
}


y por ultimo los dos unicos que son OBLIGATORIOS SIEMPRE el SETUP que digamos seria lo que se carga al inicio y solo una vez y el LOOP que es un ciclo infinito que se repite, estos dos van en todos los sketch puesto que son obligatorios sin estos dos no funciona

void setup() {
   Serial.begin(115200);      // Iniciamos el Monitor de Arduino para leer lo que escribamos con Serial.print
WIFI();                             // Llamamos a nuestro contenedor void WIFI
}
void loop() {
}


Como ves el loop esta vacio pq no necesitamos que se conecte constantemente solo la primera vez que se arranca, si se va la luz es como si arrancase de nuevo asi que se conecta solo


Y ya estaria conectado

A mi me ayudo mucho leer a luis llamas y el blog de prometec que estan los dos en español y luego ya empece con ingles. Cualquier cosa me dices
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 14-Abril-2020, 11:22
Ok! De ese modo, no es necesario implementar el reloj, recurre a él mediante wifi, supongo. Si quisiera un sistema autónomo en caso de caída de internet no funcionaría no? O sigue trabajando hasta volver a conectar y luego ya corrige la posible desviación horaria? Lo digo porque en mi casa tengo internet por telefonía y puntualmente tiene caídas...
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 14-Abril-2020, 11:28
Ya tengo localizados y guardados ambos blogs. A partir de aquí, a romperse la cabeza!  :dedit:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 14-Abril-2020, 12:16
En ese caso seria mejor un modulo RTC que se actualice regularmente. El problema de los RTC es que, como los relojes normlaes, hay que ponerlos en hora y al cabo de los meses tienen un pequeño retraso ( nada importante) pero se puede hacer para que se conecte a internet y se actualice cada mes por ejemplo
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 14-Abril-2020, 14:00
Perfecto, debe tener RTC y cuando me haga mayor sabré hacer que se actualice de modo automático  :ppy:.  (Estoy bromeando) Eso...  :ok: 
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 15-Abril-2020, 10:21
Buenas...

Empiezo a decantarme por "Arduino" (Elegoo) Mega 2560R3, sobretodo por la cantidad de proyectos que he podido encontrar, ir sobrado de entradas y tener cierta capacidad de memoria.

La sorpresa es que el módulo Wifi oficial Arduino era carísimo y está descatalogado. La alternativa? Parece que la mejor es utilizar un ESP8266 (El antiguo) que viene preparado para ello como "módem", je...

Otra sorpresa es que el RTC utiliza una pila de botón de litio NO recargable con lo que de tratarse del DS3231 (Más fiable) durará menos de un año...

También me sorprende no encontrar un "kit" con ArduinoMega+RTC+LectorSD, Etc... Todo son kits de aprendizaje exclusivamente? De ser así no me sorprende el éxito de Raspberry. Solo localizar y pedir el hardware ya es una tragedia.

Siguen las sorpresas. Nunca he comprado por Aliexpress por parecerme un portal absolutamente engañoso en cuanto a precios, sobretodo en lo que respecta a gastos de envío pero con todo, aparentemente es un 30-50% más barato que Amazon. Alguien sabe si es así? Habéis tenido problemas?



En fin, que esto es muy complicado pero seguimos en estudio... Ya iré actualizando.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 16-Abril-2020, 11:22
por partes

El problema del Mega es que como bien dices la parte wifi ha de conectarse a un 8266 ( por eso uso el ESP32 que ya va todo en uno y tiene mas salidas que el mega   :talk: ).

Los RTC es lo que tienen... que funcionan a pilas por eso uso protocolo NTP pero en tu caso sin internet es mas complicado aunque podrias hacer un contador a modo de reloj si no hay internet.

Si, digamos que la mayoria de gente que usa arduino va a lo barato, es decir Aliexpress

Personalmente mi acuario esta comprado casi al 80 % en aliexpress, sondas , esp32, leds, tip120, calentador sun sun, manoreductor y dosificador co2, modulos reles etc etc etc nunca ningun problema el unico pero es que tarda 30 dias mas o menos
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 16-Abril-2020, 20:53

Me estoy mirando el ESP32. Su instalación. Cómo instalar el IDE Arduino. Como programar ESP32 mediante el uso de GIT HUB, sustitución de repositorio, activación compilador...  :und:  Esto es más complicado que crackear la última versión del videojuego de moda y eso que es totalmente legal  :ght:

Tan solo me preocupa que algunas instrucciones del IDE cambien para ser interpretadas por el ESP32 pero todo eso ya lo iré viendo cuando me llegue el cacharro y algún accesorio para ir empezando de cero, seguro que encuentro algún "traductor".

PD: He visto tutoriales para niños. Sospecho que llegado el momento me hundiré en la miseria pero será divertido, nadie se va a enterar y tiempo me va a sobrar  :whi:

Muchas gracias otra vez Korneto! 
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 17-Abril-2020, 08:46
Nada Hombre, ya te dije que para lo que necesites aquí estamos. El  ESP32 en el Arduino IDE es fácil instalarlo solo hay que ponerle la dirección del GITHUB en preferencias para que se actualice solo. Todo lo demás tiene librerías propias en el 80% de los casos y el 20% restante son las mismas del ESP8266.

La Única instrucción que cambia del esp32 al esp8266 es el digitalWrite(GPIO,VALOR) que se convierte el LEdC(GPIO,VALOR) y solo se usa para dimmear las luces, motores o lo que sea. Los teles funcionan igual que en MEGA o ESP8266 con digitalWrite(GPIO,VALOR).

Como ya te comente cualquier duda que tengas pregúntame sin compromiso que yo encantado de ayudarte. En el 90% de los casos yo copio el código de los ejemplos y lo pego , así no tengo que escribirlo y luego lo modifico al gusto
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 17-Abril-2020, 11:17
Así que me ponga, te iré contando por aquí.  :dedit:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 26-Abril-2020, 13:15
A 26-04-20. Seguimos confinados (COVID) y el proyecto parado… A pleno sol y sin tapar, unos 21ºC fuera y 27ºC dentro registrados por sonda en el suelo y a la sombra. Ya ventila pero no se esconde…:

(http://www.zootecniadomestica.com/wp-content/uploads/2012/11/pogona-ventilando-ret.jpg)

Seguiremos actualizando. Cuando a los que no tenemos curro nos dejen salir...



Korneto: Me tiré al vacío hace una semana. Llevo ocho días de cursillo intensivo de programación con IDE. Se me fue la olla y estoy esperando un Arduino UNO, un MEGA y un ESP32. Empezaré con el UNO encendiendo leds  :ppy: y ya iremos gradualmente a los otros... Sondas DHT22, LDR, dos relojes RTC3231, sonda UVa-UVb, dos cajas de 8 relés, LCD 4x20 I2c, 3 protoboards y yo que sé más... Aquí el kit que me he pedido a medida:


(http://www.zootecniadomestica.com/wp-content/uploads/2020/04/mi-kit-completo-FORO.jpg)


No hay plazo de entrega y si a finales de año lo tengo medio en marcha, me doy con un canto en los dientes. El proyecto consiste en:

-Dos termostatos horarios (Cronotermostatos) de doble relé con sondas independientes.

-Interruptor crepuscular temporizado que actúe durante los días nublados (Y conmute foco infrarrojo paralelo al HID UVb en función Temp.).

-Lector porcentaje emisión UVa-UVb con alarma de cambio de lámpara.

-Control de actuador lineal para abrir-cerrar puertas superiores dependiente de: A- Temperatura. B- Lluvia. El actuador trabaja con finales de carrera, bastarán dos relés, uno con inversión de polaridad (Relay obligado entre maniobras) comandados mediante los sketchs de termostato y sensor de lluvia simultáneamente. Ya veremos como lo gestiono.

-Sensor de lluvia que active sistema de puertas superiores.

Iré montando cada componente y probando sus respectivos sketch individualmente. Llegará el día de integrarlos en un solo microcontrolador. La programación se tornará en un infierno pero ya tendré un poco de rodaje, espero.


Y ya para cuando sea mayor y me jubile, empezaré con el tema conectividad en el que tal vez incluya sensores inalámbricos (5 periféricos basados en ESP32) alimentados por minicélulas fotovoltaicas independientes, reguladores de carga, estabilizador de tensión para ESP32 y pilas de litio... Soñar no es gratis pero en este caso es barato.

Ya iré actualizando.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 26-Abril-2020, 22:16
Es que me encanta!
Qué cosa más bonita!
El bicho, el proyecto a mi se me escapa y me parece un trabajazo tremendo.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 27-Abril-2020, 07:04
Gracias de su parte Neli!  :ght:

Oye, pues yo creo que conociéndote, el poco espacio que ocupa y tu experiencia en informática, esto de Arduino te iba a enganchar. Además de lo sorprendentemente barato que es hoy en día. Te puedes hacer un controlador muy completo que te facilita bastante el trabajo y te aporta tranquilidad, sobretodo cuando tienes que estar fuera de casa unos días. Por tan solo unos 30 euros. Otra cosa es montarlo y conseguir que funcione, pero va a ser divertido  :alas:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 27-Abril-2020, 20:37
Ya tengo un kit básico de arduino pero no me puse con ello y para acuario ya no creo. Estoy pensando desmontar lo poco que me queda o montar un africano que pueda mantener.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 28-Abril-2020, 06:55
Los africanos piden bastante piedra en general (Salvo sardinas y poco más), tendrás que pedirle una mano al chaval pero son muy divertidos, sobretodo los pequeños de Tanganyca. Tengo pendiente desde hace años un buen tanque con conchícolas y pequeños Lamprologus de roca así en plan "dos ambientes" en un gran acuario en el que se les vea pequeñitos. Supongo que cuando me jubile y tenga clara mi residencia definitiva.

Tienes ese juguete en casa y no te has puesto a trastear? Nos hacemos mayores...  :whi:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Nell en 29-Abril-2020, 13:23
El montaje sería con calma, lo importante es el mantenimiento, que debe ser mínimo.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 30-Abril-2020, 14:24
Todo depende como lo monetes, en mi caso ahora estoy por la parte de los test (que me parece un autentico coñazo) y estoy investigando con un modulo de colorimetro conectado al esp32 y que me lo guarde en una base de datos.... por ahora el proyecto va al 50% y las pruebas iniciales van de perlas, solo hay que echar los liquidos y ya. Tambien hay sondas de ph kh gh etc etc pero algunas valen sobre los 300 pavos y va a ser que no, la version rata me vale. Al final lo bueno de Arduino es que cualquier cosa que te imagines la puedes hacer con un coste minimo
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 04-Mayo-2020, 10:08
Korneto: Pues eso de los análisis suena tan bien como complicado. Ha de ser la pera tener monitorizados los parámetros del agua en tiempo real a un precio aceptable. Ya leí que algunas sondas como las de pH no bajan de precio ni por esas...


Bueno, primer avance en el tema Arduino. Me llegaron parte de los componentes el miércoles. Empecé el jueves con más miedo que otra cosa. Al rato ya pinchaba aquí y allá asumiendo que tenía placa de recambio y creo que es la mejor manera de meterse en esto, trasteando sin miedo (Conseguí colgar el IDE, el Arduino se volvió loco y un relé se puso a ratear como una ametralladora  :alas:)


(http://www.zootecniadomestica.com/wp-content/uploads/2020/05/arduino-modulo-terrario-exterior-00RET.jpg)


En este momento ya tengo dos termostatos "básicos" de doble relé con histéresis (calefacción, ventilación) a la espera de asignar las variables editables para poder modificar en el futuro los parámetros mediante un pequeño teclado matricial. Esto va a tener miga, supongo...

Ya tengo trabajando el interruptor crepuscular regulado analógicamente mediante un pequeño potenciómetro de ajuste. Ahora le falta programar un contador y un temporizador para el encendido y apagado del foco HID pues necesita de cierto tiempo de arranque y nos lo cargaríamos con cuatro nubes que pasaran...

También tengo ya monitorizadas las temperaturas y HR en monitor serie así como el estado de la iluminación (On/Off)


(http://www.zootecniadomestica.com/wp-content/uploads/2020/05/arduino-monitor-serie-RET.jpg)


He conseguido integrar todo en un solo sketch y quizás sea lo que más me ha costado por ahora. Tengo que conseguir un soldador de precisión porque la cagué comprando la pantala LCD 4x20 y esta requiere soldar un módulo i2C de muuuchos pines...

Sospecho que el mayor reto va a ser todo lo relacionado con el tiempo: Instalar RTC, integrar valores horarios a los distintos sketch y sustituir los "delay" por otras funciones como "millis". El factor tiempo se me antoja muy complejo para un ñapas en materia de programación. Superado esto, no quiero pensar en lo que será la conectividad!

Todos los componentes han llegado bien menos los famosos por "precisos" DHT22 (sondas de temperatura y humedad relativa) que marcan un diferencial en HR de hasta el 10%! Y no son baratos precisamente. Llevo un cabreo del carajo porque los higrómetros precisos siempre habían sido un sueño y veo que lo siguen siendo...

El mayor puteo ha sido la lógica inversa de los relés chinos. Esto me ha supuesto cargarme cinco pines tan solo para los indicadores LED que integraré en el panel de control de la caja. Total, que el Arduino UNO se me ha quedado ya sin pines en tres días de montaje y así que me lleguen las sondas restantes tendré que pasar al Mega  :hap:. En cuanto a memoria interna, todavía ando razonablemente bien pese  (18%).

Estoy bastante contento porque me temía una toma de contacto aún más bestia... Queda todo y lo más difícil por hacer pero no hay plazo.

Por si se pasara por aquí alguien interesado o mejor aún, con una mínima experiencia para corregir cualquier cosa, añado el código:


Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido


#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada

int SENSORC = 2;                          //sensor DHT22 CLIMA
int SENSORN = 9;                          //sensor DHT22 NIDO
int SENSORLDR = 0;                        //sensor LDR
float TEMPERATURAC;                       //variable temperatura CLIMA
float TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
int LEDFC = 4;                            //LED indicador frío CLIMA
int LEDCC = 3;                            //LED indicador calor CLIMA
int LEDFN = 11;                           //LED indicador frío NIDO
int LEDCN = 10;                           //LED indicador calor NIDO
int LEDLDR = 7;                           //LED indicador LDR iluminación Gral.
int RELECC = 5;                           //Relé alta calor CLIMA
int RELEFC = 6;                           //Relé baja frío CLIMA
int RELELDR = 8;                          //Relé LDR iluminación Gral.
int RELECN = 12;                          //Relé alta calor NIDO
int RELEFN = A1;                          //Relé baja frío NIDO


DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

void setup(){
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida(OJO!pinA1!)
}                                         //NOTA: Entradas analógicas asignan por defecto
void loop(){                             
                                          //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO
 
                                          //MONITOR SERIE
  Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
  Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 
  delay(500);                             //lapso demora 500 miliseg.(1/2 segundo)
 
                                          //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
  }
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
    Serial.println("LUZ:On");
   }else{                                 //sino...
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");   
  }                                       //ATENCIÓN: Relés chinos: lógica inversa!
 delay(500);                              //lapso demora 500 miliseg.(1/2 segundo)
 
                                          //MÓDULO TERMOSTATO CLIMA GRAL. INVERNADERO
  if(TEMPERATURAC < 23){
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
  }else{
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }   
 
  if(TEMPERATURAC > 23){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
  }else{
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  } 
 
  delay(500);
                                          //MÓDULO TERMOSTATO CLIMA NIDO HIBERNÁCULO
  if(TEMPERATURAN < 22){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
  }else{
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }   
 
  if(TEMPERATURAN > 22){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
  }else{
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  } 
 
  delay(500);
}


Hala, un saludo!
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 09-Mayo-2020, 10:05
Actualizo...

De atasco en atasco, ya he tenido que pasar al Arduino Mega al quedarme sin pines  :alas:. Tengo bastante claro que alguien que sepa, se habría ahorrado dos o tres de los 22 pines que ya tengo ocupados pero a falta de conocimiento, recursos. El UNO me ha durado una semana  :und:

Me encuentro en pleno frenazo. Un día entero dedicado a entender y aplicar la función millis para temporizar sin interrumpir el trabajo del controlador. Esto lo necesitaré tanto para el interruptor crepuscular (No puede encender o apagar el foco HID hasta haber pasado al menos media hora) y para el controlador del actuador lineal, un motor que abrirá y cerrará las tapas automáticamente: Sin resultado todavía.

Otro día entero para intentar aplicar la función for como contador sumatorio del registro de temperatura para realizar después la media. Esto le daría mucha estabilidad al termostato a la hora de realizar las maniobras sin encender y apagar repetidas veces el relé en cada cambio de maniobra: Sin resultado todavía.

A la espera de que llegue el módulo de reloj a tiempo real RTC DS3231 para instalarlo, configurar la hora y fecha y poder aprender a activar alarmas que en este caso, sustituirían parámetros de temperatura para diferenciar el día y la noche, por ejemplo. Ya veremos cuando me ponga si esto es viable por esta vía.

(http://www.zootecniadomestica.com/wp-content/uploads/2020/05/arduino-modulo-terrario-exterior-02RET.jpg)


En la foto: Los dos leds rojos indican que los termostatos están calentando tanto invernadero como nido. El led amarillo del centro indica que la luz está apagada. Si apago la luz del escritorio, se enciende. El led verde de la izquierda indica que las puertas están cerradas para ahorrar tiempo de calefacción.


Es todo tan canijo que he usado dos tableros de conexión ("Protoboard") para que me quepan los dedos al hacer las conexiones  :ght:.

Ya solo me sobra un relé en la placa de ocho. El ventilador sustituye de cara a las pruebas al actuador lineal. En vez de abrir y cerrar, sopla hacia un lado u otro (Inversión de fase). Este es uno de los casos en los que tengo que temporizar pues para abrir o cerrar las puertas necesito 1 segundo para que el pistón avance o retroceda 10mm. De este modo, la apertura se haría por fases hasta ajustarse automáticamente siguiendo las órdenes del termostato y ahorrando muuuucha energía.

Uno de los objetivos de este proyecto recuerdo que es mantener una instalación de 1300l. en exterior con el consumo de un terrario de unos 500l. en interior... A estas alturas ya puedo decir que serán dos los proyectos. Uno es por control analógico (Cuadro eléctrico ya montado pendiente de instalar) y el otro es este, ya digital.

He recibido el contador de consumo que se encargará algún día de contrastar ambos sistemas de control. En el futuro, podremos ver el ahorro energético de un sistema frente al otro y sacar conclusiones respecto a los costes y amortización.

Para el que acabe de llegar, recuerdo que estoy publicando el montaje aquí: http://www.zootecniadomestica.com/terrario-exterior-para-pogona/ (http://www.zootecniadomestica.com/terrario-exterior-para-pogona/)


Seguiré actualizando...
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 14-Mayo-2020, 09:51
jajajaj como me alegra ver que te diviertes y te desesperas..... es lo bonito del arduino que a veces crees que eres Bill Gates y a los 5 segundos piensas que eres un crio de 4 años, eso es normal.

Vamos por partes

EL DHT22:  En el Datasheet del cacharro pone que los rangos de humedad son de 0.1 % asi que algo anda mal por ahi a ver si te lo encuentro que yo nunca use ese modulo

ME FALTAN PINES:  Esto es tambien normal jajaja y mas en uno o mega que tienen menos que el esp32, pero tienen algo de solucion. Veo en elsketch que cada vez que el Clima va a Frio o calor se enciende un led para indicarlo... yo lo haria de una de estas dos maneras.... conectando el led al mismo pin que el rele asi cuando deje pasar corriente a uno tambien al led y se enciende o apaga, otra opcion seria conectar un led RGB para que cambie de color dependiendo de lo que tengas enchufado, asi ahorras 5 pines

SETUP: No entiendo muy bien pq haces el digitalwrite aqui, en principio , el rele estara en estado LOW nada mas arrancar ( cuidado hay pines que arrancan en HIGH), lo de los reles chinos tiene su tema... yo cogi un traductor con la camara del movil para ver el estado Normalmente Abierto o Cerrado

LOOP: Aqui veo el mayor problema y comun en muchos casos. Intentas meter toda la logica en el loop y eso lo que hace es relentizar el sistema. Tendrias que meter cada "apartado" en un void e invocarlo desde el loop asi podrias usar los millis. te dejo un ejemplo a ver si se entiende.

Código: [Seleccionar]
///.................................................. VARIABLES DESPUES DE LOS INCLUDES..........................................................
#define SENSORES 300000 // 5 Minutes
uint64_t tiempodelectura = 0;
int TempNID = 22;  /// Temperatura que querremos en el Nido
int TempINV = 23;  /// Temperatura que querremos en el Invernadero

///.................................................. ANTES QUE EL SETUP...........................................................

void LEER_SENSORES{
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO

////////////////// ESCRIBIMOS EN EL SERIAL //////////////////////////

                                          //MONITOR SERIE
  Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
  Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 
 
}

void CREPUSCULO{
                                          //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
       Serial.println("LUZ:On");
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");   
  }
 
}

void TEMPERATURA{
     
                                          //MÓDULO TERMOSTATO CLIMA GRAL. INVERNADERO
  if(TEMPERATURAC < TempINV){
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
  }else{
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }   
 
  if(TEMPERATURAC > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
  }else{
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  } 
 

                                          //MÓDULO TERMOSTATO CLIMA NIDO HIBERNÁCULO
  if(TEMPERATURAN < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
  }else{
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }   
 
  if(TEMPERATURAN > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
  }else{
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  } 
 
}

///..................................................  DESPUES DEL SETUP...........................................................

void loop(){                             

   uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
      if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
}
CREPUSCULO();
TEMPERATURA();
 

 
}


FOCO: Bueno en el loop ya tienes un ejemplo del uso de millis simplemente  duplicarlo y ponerle 30 minutos en vez de 5 a la variable

ACTUADOR LINEAL: Basicamente es un motor paso a paso, aunque yo lo que haria es cambiar la parte de temperatura que te puse arriba y decirle que lea el termometro y si , por ejemplo, si es menor de 24 grados encienda la calefaccion y si es mayor de 25 abra la tapa, le puedes poner un TIP120 y enchufarlo a una salida PWM para que abra mas o menos en funcion de la temperatura.

FOR: No entiendo muy bien esta parte la verdad, la funcion for es, por asi decirlo, un loop. se suele usar para contar variables o sustituir rutinas repetitivas como asignacion de pines, pero lo que entiendo es que tienes problema es algo comun, es cuestion de los rangos que ponemos a las temperaturas, es decir tu le estas indicando que cuando la temperatura sea mayor a 25 se encienda el rele y cuando sea menor a 25 se apague, pues bien, ese es el error, cuando la sonda tenga 25.01 se activara y cuando tenga 25 se apagara, una diferencia tan sumamente minima como 0.01 grados es acercar la mano al cristal, por ejemplo, yo pondra una desviacion logica de, por ejemplo, 1 grado o medio grado lo cual le permite no volverse loco al rele. seria algo asi como if( Temp < 25 && Temp> 26)

Si no es esto que te comento dimelo y buscamos solucion



Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 14-Mayo-2020, 21:14
Joder Korneto, menudo currazo! Gracias, creo que me has ahorrado muchos dolores de cabeza!

Ya tenía sospechas y muchas dudas sobre qué parte del programa corresponde al setup y cual al loop... Creo que me ha quedado claro!  :oba:

Ahora no puedo pero mañana mismo me pongo a probarlo. Ha quedado reducido a la mitad y las variables en un 70%!  :alas:

He visto a un italiano desoldar el LED SMD de la placa de relés para soldar dos cables que alimentan a un DIPLED normal y corriente. Me lo voy a pensar, me sobrará un relé para probarlo...

En cuanto lo pruebe y mire de arreglar lo que falle (Nada sale a la primera en Arduino, menos aún la ortografía), te digo algo. Gracias otra vez.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 15-Mayo-2020, 08:05
Vaya... no consigo ver donde comienzo el void setup... (Ha de haber void setup???) El void loop lo veo muy claro. Tal vez empieza en el serial? O con el primer void (void LEER_SENSORES)? Pruebo ambas opciones.


EDITO: El sketch literalmente ha explotado  :und:  !. Probado (void LEER_SENSORES) antes y después del voidsetup. Unos 30 errores de aviso, uno por línea de programa, en ambos casos. Entre otros:

-variable or field "LEER_SENSORES" declared void

-error: expected declaration before '}' token (Tantos como líneas, repasados corchetes y no los encuentro...)

-error: "n" does not name a type ("n": Todas las variables)


Hago copia del armaggedon:

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido


#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada
#define SENSORES 300000 // 5 Minutes

uint64_t tiempodelectura = 0;
int TempNID = 22;  /// Temperatura que querremos en el Nido
int TempINV = 23;  /// Temperatura que querremos en el Invernadero

int SENSORC = 2;                          //sensor DHT22 CLIMA
int SENSORN = 9;                          //sensor DHT22 NIDO
int SENSORLDR = 0;                        //sensor LDR
float TEMPERATURAC;                       //variable temperatura CLIMA
float TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
int LEDFC = 4;                            //LED indicador frío CLIMA
int LEDCC = 3;                            //LED indicador calor CLIMA
int LEDFN = 11;                           //LED indicador frío NIDO
int LEDCN = 10;                           //LED indicador calor NIDO
int LEDLDR = 7;                           //LED indicador LDR iluminación Gral.
int RELECC = 22;                           //Relé alta calor CLIMA
int RELEFC = 24;                           //Relé baja frío CLIMA
int RELELDR = 26;                          //Relé LDR iluminación Gral.
int RELECN = 28;                          //Relé alta calor NIDO
int RELEFN = 30;                          //Relé baja frío NIDO


DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

void setup(){
 
  void LEER_SENSORES{
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO
 
  }
 
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida(OJO!pinA1!)
                                          //NOTA: Entradas analógicas asignan por defecto

  Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
  Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 
  delay(500);                             //lapso demora 500 miliseg.(1/2 segundo)

 

  void CREPUSCULO{
                                          //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
       Serial.println("LUZ:On");
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");   
   }
 
  }

  void TEMPERATURA{
     
                                          //MÓDULO TERMOSTATO CLIMA GRAL. INVERNADERO
  if(TEMPERATURAC < TempINV){
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
  }else{
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }   
 
  if(TEMPERATURAC > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
  }else{
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  } 
 

                                          //MÓDULO TERMOSTATO CLIMA NIDO HIBERNÁCULO
  if(TEMPERATURAN < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
  }else{
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }   
 
  if(TEMPERATURAN > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
  }else{
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  } 
 
 }



void loop(){                             
         
    uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
      if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
     }
     CREPUSCULO();
     TEMPERATURA();
   
   }
           
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 16-Mayo-2020, 15:28
jajajajaj tienes todos los void metidos dentro del setup ponlos antes que el setup. Los void siempre van fuera de setup o loop para poder llamarlos desde cualquier lado. Yo como soy autodidacta tengo una manera peculiar de programar (sera por el TOC  :ght:). Te lo pongo a mi manera, a mi no me da errores asi, es que me gusta tenerlo ordenado para que nos sea caos.

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   INCLUDES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada


//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   PINES                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

int SENSORC = 2;                          //sensor DHT22 CLIMA
int SENSORN = 9;                          //sensor DHT22 NIDO
int SENSORLDR = 0;                        //sensor LDR
int LEDFC = 4;                            //LED indicador frío CLIMA
int LEDCC = 3;                            //LED indicador calor CLIMA
int LEDFN = 11;                           //LED indicador frío NIDO
int LEDCN = 10;                           //LED indicador calor NIDO
int LEDLDR = 7;                           //LED indicador LDR iluminación Gral.
int RELECC = 22;                           //Relé alta calor CLIMA
int RELEFC = 24;                           //Relé baja frío CLIMA
int RELELDR = 26;                          //Relé LDR iluminación Gral.
int RELECN = 28;                          //Relé alta calor NIDO
int RELEFN = 30;                          //Relé baja frío NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  VARIABLES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

float TEMPERATURAC;                       //variable temperatura CLIMA
float TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CONFIGURACION                                  ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

uint64_t tiempodelectura = 0;
int TempNID = 22;  /// Temperatura que querremos en el Nido
int TempINV = 23;  /// Temperatura que querremos en el Invernadero
#define SENSORES 300000 // 5 Minutes

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  SENSORES                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

 void LEER_SENSORES{
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO
    Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
  Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 

  }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CREPUSCULO                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

  void CREPUSCULO{
                                          //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
       Serial.println("LUZ:On");
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");   
   }
 
  }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                               TEMPERATURA                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

    void TEMPERATURA{
     
                                          //MÓDULO TERMOSTATO CLIMA GRAL. INVERNADERO
  if(TEMPERATURAC < TempINV){
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
  }else{
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }   
 
  if(TEMPERATURAC > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
  }else{
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  } 
 

                                          //MÓDULO TERMOSTATO CLIMA NIDO HIBERNÁCULO
  if(TEMPERATURAN < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
  }else{
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }   
 
  if(TEMPERATURAN > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
  }else{
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  } 
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                     SETUP                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝


void setup(){
 
 
 
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida(OJO!pinA1!)
                                          //NOTA: Entradas analógicas asignan por defect
 
 }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                    LOOP                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void loop(){                             
         
    uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
      if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
     }
     CREPUSCULO();
     TEMPERATURA();
   
   }
Para que lo tengas mas claro, porque la traducción lleva a error el setup no es una configuración sino es una configuración inicial, es decir, esa parte del sketch solo se ejecuta una sola vez que es cuando se enciende.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 21-Mayo-2020, 09:19
Hola Korneto! Pues entre tu TOC y mi supuesto TDA formaríamos un buen equipo  :ght:

Te escribí creo que el lunes pero tuvimos que actualizar el foro y perdimos el mensaje.  :alas:

Necesito saber si el sketch te está funcionando con Arduino IDE. Te explico, lo he copiado y pegado directamente en un archivo nuevo a estrenar. A la hora de compilar se vuelven a desatar los mismos demonios, mismos mensajes de error que tuve en sendas pruebas anteriores, tanto antes como después del SETUP.

La cuestión es que no he podido integrarlo tampoco por partes para intentar aislar el problema principal y estoy llegando a la conclusión de que tal vez hayas utilizado un compilador diferente a IDE... (Ya no se qué pensar...)

De hecho, empiezo a creer que no me admite la instrucción VOID en ningún tramo del sketch ya sea antes, dentro o después del SETUP pues así me lo confirma el informe de errores, que es inmenso.

Sobre los errores tipográficos, repasados hasta la saciedad, desde el reconocimiento de funciones hasta los corchetes y todo está correcto: No reconoce las variables y da errores en VOID.

Empiezo a plantearme comenzar el proyecto de nuevo y desde cero (No tengo plazo, el bicho ya vive fuera sin control alguno y el clima ya le es favorable) porque basándome en el sketch que hice y que ya funciona básicamente, todo intento de mejora (temporizar con millis, eliminar decimal en temperatura, Etc..) resulta un mar de errores.

Tengo que ponerme con la soldadura del LCD y liarme con el protocolo i2C. Pronto recibiré los RTC y deberé instalarlos. Tal vez sea el momento de hacer ambas cosas antes del sketch, en un archivo nuevo y en blanco para luego tratar de crearlo de cero basándome en las instrucciones de tiempo de la librería del RTC, por buscar otra vía...

Un saludo!

Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 22-Mayo-2020, 13:35
Hola otra vez! He soldado el módulo i2C a la pantalla LCD, sin lupa y con un soldador del chino ( :whi:) y ya que estaba, he aprovechado para probarla en el sketch del demonio. Por una vez, en honor a la verdad y porque rectificar es de sabios, esto si que ha funcionado a la primera... en contra de mis anteriores afirmaciones  :nos:

(http://www.zootecniadomestica.com/wp-content/uploads/2020/05/arduino-modulo-terrario-exterior-04RET.jpg)


Con todo, creo que aprovecharé para rehacerlo entero cuando lleguen los relojes RTC... Pasito a pasito!
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 22-Mayo-2020, 13:53
Pues si que estaba puñetero de encontrar  :nos:

declare mal los void puse void TEMPERATURA{} y tiene que ser void TEMPERATURA(){}, a mayores, he cambiado los pines por #define así no hay que asignarles un tipo de variable que también daba error.

Al final del void TEMPERATURA faltaba también un { que es el que hacia fallar a setup y loop. Te lo dejo arreglado, en principio en mi Arduino IDE 1.8.12 y placa Uno funcionaria perfectamente, aunque no esta testado en placa ya que no tengo la Uno.

Cuéntame si funciona así me quedo tranquilo

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   INCLUDES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada


//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   PINES                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#define SENSORC 2                          //sensor DHT22 CLIMA
#define SENSORN 9                          //sensor DHT22 NIDO
#define SENSORLDR 0                        //sensor LDR
#define LEDFC 4                            //LED indicador frío CLIMA
#define LEDCC 3                            //LED indicador calor CLIMA
#define LEDFN 11                           //LED indicador frío NIDO
#define LEDCN 10                           //LED indicador calor NIDO
#define LEDLDR 7                           //LED indicador LDR iluminación Gral.
#define RELECC 22                           //Relé alta calor CLIMA
#define RELEFC 24                           //Relé baja frío CLIMA
#define RELELDR 26                          //Relé LDR iluminación Gral.
#define RELECN 28                          //Relé alta calor NIDO
#define RELEFN 30                          //Relé baja frío NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  VARIABLES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

float TEMPERATURAC;                       //variable temperatura CLIMA
float TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CONFIGURACION                                  ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

uint64_t tiempodelectura = 0;
int TempNID = 22;  /// Temperatura que querremos en el Nido
int TempINV = 23;  /// Temperatura que querremos en el Invernadero
#define SENSORES 300000 // 5 Minutes

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  SENSORES                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

 void LEER_SENSORES(){
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO
    Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
  Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 

  }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CREPUSCULO                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

  void CREPUSCULO(){
                                          //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
       Serial.println("LUZ:On");
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");   
   }
 
  }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                               TEMPERATURA                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void TEMPERATURA(){
  if(TEMPERATURAC < TempINV){
   
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
  }else{
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }   
 
  if(TEMPERATURAC > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
  }else{
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  }
   
  if(TEMPERATURAN < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
  }else{
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }   
 
  if(TEMPERATURAN > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
  }else{
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  } 
}
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                     SETUP                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝


void setup(){
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida(OJO!pinA1!)
                                          //NOTA: Entradas analógicas asignan por defect
 
 }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                    LOOP                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void loop(){                             
         
    uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
      if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
     }
     CREPUSCULO();
     TEMPERATURA();
   
   }
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 22-Mayo-2020, 15:06
Ole tú!!!! Ahora no puedo meterme a fondo pero:

-Compilado con 0 errores!

-Los termostatos parecen funcionar correctamente.

-El crepuscular funciona perfectamente.

-El temporizado funciona, lo he cambiado a 3000 (3seg.) para poder comprobarlo (Ahora no tengo tiempo)

-No puedo monitorizar los resultados ni el funcionamiento de los termostatos porque el monitor serie está disparado y tan solo aparece escrita la línea de la "Luz" (No le da tiempo a escribir el resto, creo) pero variando los SET de temperatura el comportamiento parece coherente. Ya miraré de temporizar el monitor serie.

El ciclo va a todo trapo, muuuucho más rápido! Perfecto!

Muchas gracias otra vez. Si esta noche puedo, me pongo. Sino ya mañana. Eres un crack!  :dedit:
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 22-Mayo-2020, 18:39
Nada hombre es un placer, lo que si podrías hacer es modificar el serial.print por serial.printf creo que quedara mas limpio y ahorraras algunos mb.
Tienes que cambiar todos los Serial.print de el void TEMPERATURA por esto.


  Serial.printf("<<<  CLIMA  >>>      TEMPERATURA : %u ºC     HUMEDAD : %u %", TEMPERATURAC, HUMEDADC);
  Serial.printf("<<<  NIDO   >>>      TEMPERATURA : %u ºC     HUMEDAD : %u %", TEMPERATURAN, HUMEDADN);

Así en vez de 10 lineas tienes solo 2

Ya me contaras cuando lo pongas que tal funciona y cuando le pongas a eso el LCD muy buen proyecto que va tomando forma
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 25-Mayo-2020, 12:41
Buenassss....

Perdona el retraso pero he tenido un fin de semana por fin movidito, je.

Le he estado echando unas horas y algo he conseguido. Voy a empezar por lo bueno: Tengo tu sketch instalado funcionando a toda velocidad ya con la LCD. Te pongo aquí el código actual pero no le hagas caso aún, ahora te explico:


Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   INCLUDES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   PINES                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#define SENSORC 2                          //sensor DHT22 CLIMA
#define SENSORN 9                          //sensor DHT22 NIDO
#define SENSORLDR 0                        //sensor LDR
#define LEDFC 4                            //LED indicador frío CLIMA
#define LEDCC 3                            //LED indicador calor CLIMA
#define LEDFN 11                           //LED indicador frío NIDO
#define LEDCN 10                           //LED indicador calor NIDO
#define LEDLDR 7                           //LED indicador LDR iluminación Gral.
#define LEDABIER 5                         //LED indicador puerta ABIERTA
#define LEDCERRA 6                         //LED indicador puerta CERRADA
#define RELECC 22                          //Relé alta calor CLIMA
#define RELEFC 24                          //Relé baja frío CLIMA
#define RELELDR 26                         //Relé LDR iluminación Gral.
#define RELECN 28                          //Relé alta calor NIDO
#define RELEFN 30                          //Relé baja frío NIDO
#define RELEABRIR 34                       //Relé abrir puerta
#define RELECERRAR 36                      //Relé cerrar puerta

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  VARIABLES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

float TEMPERATURAC;                       //variable temperatura CLIMA
float TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO


DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CONFIGURACION                                  ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

uint64_t tiempodelectura = 0;
int TempNID = 23;  /// Temperatura que querremos en el Nido
int TempINV = 24;  /// Temperatura que querremos en el Invernadero
#define SENSORES 30000 //


//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  SENSORES                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

 void LEER_SENSORES(){
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO

 
 
   Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
   Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 
   
  }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CREPUSCULO                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

  void CREPUSCULO(){
                                              //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
    Serial.println("LUZ:On");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:On");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");
   
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:Of");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");   
   }
 
  }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                               TEMPERATURA                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void TEMPERATURA(){
  if(TEMPERATURAC < TempINV){
   
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
  }else{
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }   
 
  if(TEMPERATURAC > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
  }else{
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  }
   
  if(TEMPERATURAN < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
  }else{
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }   
 
  if(TEMPERATURAN > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
  }else{
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  } 
}

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                            APERTURA AUTOMATICA                                ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝
                                            //MÓDULO APERTURA/CIERRE PUERTAS
 void APERTURA(){                           //PELIGRO!!!Configurar retardo seguridad relés!!!             
                                            //PELIGRO!!!Temporizar inversión maniobra!!!
  if(dht1.readTemperature() - 2 < TempINV){ //Este módulo NO FUNCIONA ver abajo:                         
    digitalWrite(LEDCERRA, HIGH);           //OK
    digitalWrite(RELECERRAR, LOW);          //RELECERRAR NO ACTÚA
    Serial.println("PUERTA CERRADA");       //OK
    lcd.setCursor(0, 3);
    lcd.print("PUERTA CERRADA");            //OK
  }else{                                    //Preg: Faltará tensión por USB en Arduino?
    digitalWrite(LEDCERRA, LOW);
    digitalWrite(RELECERRAR, HIGH);
  }   
 
  if(dht1.readTemperature() + 2 > TempINV){                              //
    digitalWrite(LEDABIER, HIGH);           //LEDABIER muy poca intensidad!
    digitalWrite(RELEABRIR, LOW);           //RELECERRAR NO ACTÚA
    Serial.println("PUERTA ABIERTA");       //OK
    lcd.setCursor(0, 3);
    lcd.print("PUERTA ABIERTA");
  }else{
    digitalWrite(LEDABIER, LOW);
    digitalWrite(RELEABRIR, HIGH);
  }
  delay(500);                               ///QUITAR para usar millis!!!!!!!!
 }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                     SETUP                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝


void setup(){

  lcd.setBacklightPin(3,POSITIVE);        //
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);
  lcd.clear();
 
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
 
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
 
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida(OJO!pinA1!)
                                          //NOTA: Entradas analógicas asignan por defect
 
 }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                    LOOP                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void loop(){

   lcd.setCursor(0, 0);                    //Posicionando cursor 1ª línea
   lcd.print("CLIMA ");                    //Imprimir CLIMA
   lcd.print("T:");                        //Imprimir T:
   lcd.print(TEMPERATURAC, 1);             //asignar a impresión variable TªCLIMA
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADC);                    //asignar a impresión variable Hum.CLIMA
   lcd.setCursor(0, 1);                    //Posicionando cursor 2ª línea
   lcd.print("NIDO  ");                    //imprimir NIDO
   lcd.print("T:");                        //imprimir T:
   lcd.print(TEMPERATURAN, 1);             //asignar a impresión variable TªNIDO
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADN);                    //asignar a impresión variable Hum.NIDO
         
    uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
      if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
     }

     CREPUSCULO();                                   
         
     TEMPERATURA();


Va a tanta velocidad que la LCD vibraba con lo que he intentado aplicar el millis de nuevo sin resultado aprovechando que debo retrasar la maniobra de LDR para no fundir el foco HID... Varias horas intentando configurarlo copiando el ejemplo que me diste pero nada, lo mío no es programar, está claro. Provisionalmente le he puesto un delay de 500.  :mmm:

Te explico, tengo que añadir un tercer void termostato basado en la misma sonda CLIMA (DHT1) para regular la apertura-cierre de puertas. He copiado el mismo sketch del termostato CLIMA y le he añadido una función matemática simple. Se trata de que cuando la temperatura de lectura de sensor sobrepase 2ºC a la temperatura de ajuste, la puerta se abra. Cuando la temperatura de lectura se encuentre 2ºC por debajo del ajuste, se cierre. Todo esto sin entrar en temporizados, claro. Por tanto, un cuarto VOID al que llamo APERTURA.

El caso es que esta parte ya funcionaba en mi sketch original aunque todavía tenía un conflicto porque se solapaban los leds de ABIERTA y CERRADA en el tramo de temperatura intermedio.

Te pongo aquí la parte porque el código ya es un tocho, con los problemas que ahora presenta ya inserto en tu sketch:


Código: [Seleccionar]
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                            APERTURA AUTOMATICA                                ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝
                                            //MÓDULO APERTURA/CIERRE PUERTAS
 void APERTURA(){                           //PELIGRO!!!Configurar retardo seguridad relés!!!             
                                            //PELIGRO!!!Temporizar inversión maniobra!!!
  if(dht1.readTemperature() - 2 < TempINV){ //Este módulo NO FUNCIONA ver abajo:                         
    digitalWrite(LEDCERRA, HIGH);           //OK
    digitalWrite(RELECERRAR, LOW);          //RELECERRAR NO ACTÚA
    Serial.println("PUERTA CERRADA");       //OK
    lcd.setCursor(0, 3);
    lcd.print("PUERTA CERRADA");            //OK
  }else{                                    //Preg: Faltará tensión por USB en Arduino?
    digitalWrite(LEDCERRA, LOW);
    digitalWrite(RELECERRAR, HIGH);
  }   
 
  if(dht1.readTemperature() + 2 > TempINV){                              //
    digitalWrite(LEDABIER, HIGH);           //LEDABIER muy poca intensidad!
    digitalWrite(RELEABRIR, LOW);           //RELECERRAR NO ACTÚA
    Serial.println("PUERTA ABIERTA");       //OK
    lcd.setCursor(0, 3);
    lcd.print("PUERTA ABIERTA");
  }else{
    digitalWrite(LEDABIER, LOW);
    digitalWrite(RELEABRIR, HIGH);
  }
  delay(500);                               ///QUITAR para usar millis!!!!!!!!
 }


Debo decir que con mi programa inicial no había caída de tensión el los leds de la puerta y los relés actuaban aunque los leds se superponían en el tramo de temperaturas intermedio (Histéresis), con lo que debería descartar que el problema sea falta de amperaje en la alimentación por USB. Es de locos!!!!

Resumiendo ya, tengo que buscarme la vida para:

-Retrasar el encendido-apagado del relé de la LDR (VOID CREPÚSCULO) y lo tengo que conseguir yo solito, porque debo:

-Retrasar la maniobra apertura-cierre de puertas (VOID APERTURA)

-Temporizar tanto apertura como cierre en maniobras de 1 o 2 segundos.

El caso es que si pasan los días y no lo consigo, me plantearé suspender el asunto temporalmente y ponerme con otros sketch mucho más simples a modo de tutorial hasta dominarlo.

Por otro lado, en junio me llega el RTC3231 y quizás de no haberme aclarado con el asunto del tiempo pruebe a usar el reloj como temporizador, tal vez alguna librería lo simplifique (O quizás sea el mismo berenjenal, ni idea). Tendré que investigar por ahí ya como último recurso.

Ya para acabar, cuando todo esto esté controlado, aprenderemos eso de las "interrupciones" para instalar la sonda de lluvia que cerrará inmediatamente las puertas.
También me pondré con el sensor UVa-UVb que a priori no creo que plantee mucha historia y si todavía me han quedado ganas y no me he retirado en un asilo, un sensor de presión (Peso) en la bandeja del nido que detecte que el bicho o bichos estén fuera e interrumpa el suministro de calefacción-ventilación en el nido  :ght:

Un saludo!

Ah! EDITO: No he probado todavía la instrucción que me diste para sustituir los serial.print porque voy a tratar de incluir la temperatura de ajuste en las mismas líneas.
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 25-Mayo-2020, 21:43
Como dijo Jack el Destripador..... vamos por partes: (pq hay muchas cosas que no entiendo jajajaja)

LCD

El Lcd te vibra pq tienes puesto escribir las temperaturas en el loop, ya te dije, que el loop lo ejecuta cada milisegundo por lo cual cada milisegundo,basicamente, le estas diciendo que vuelva a escribir todo cada milisegundo... asi que normal que te vibre jajaja. Aprovecha el mismo void de LEER SENSORES y pones ahi lo de escribir la lcd otra cosa que puedes hacer es hacer una cariable que guarde la temperatura y si la temperatura ha cambiado ejecuta la orden de escribir en la pantalla sino ha cambiado no lo hace.

LED DUPLICADOS

Analizando el codigo se me ocurre que en el void TEMPERATURA hay algo que esta mal y creo que ese es el problema de los reles y los leds, si te fijas, le dijimos que si la temperatura era menor que la variable TEMPINV encendiera un led y sino otro... esto es lo que da fallo pq si no es menor ....sera mayor a pelotas y eso ya esta mas abajo programado
Quedaria asi.

Código: [Seleccionar]
void TEMPERATURA(){
  if(TEMPERATURAC < TempINV){ 
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  }
  if(TEMPERATURAC > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }
  if(TEMPERATURAN < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  }
  if(TEMPERATURAN > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }
}


APERTURA

Es normal que no funcione por dos motivos, El primero y mas fundamental es que has programado el void apertura, pero no lo has declarado en el loop asi que no se ejecuta y el segundo es que hay un pequeño error de sintaxis.

quedaria asi

Código: [Seleccionar]
void APERTURA(){                                       
                                         
  if((TEMPERATURAC - 2) < TempINV){                       
    digitalWrite(LEDCERRA, HIGH);           
    digitalWrite(RELECERRAR, LOW);         
    Serial.println("PUERTA CERRADA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA CERRADA");           
  }
  if((TEMPERATURAC + 2) > TempINV){                   
    digitalWrite(LEDABIER, HIGH);         
    digitalWrite(RELEABRIR, LOW);         
    Serial.println("PUERTA ABIERTA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA ABIERTA");
  }
 }

luego en el loop usariamos los millis primero creamos un define como el de sensores en nuestro apartado de configuracion y luego en el loop otro milli

Código: [Seleccionar]
#define APERTURAS 30000 //
uint64_t tiempodelectura2 = 0;

  if((now - tiempodelectura2) > APERTURAS) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura2 = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     APERTURA();                                    /// ejecutamos la lectura de sensores
     }


Asi quedaria el sketch entero...dime si funciona todo ok o lo que sea modificamos. Recuerda que TEMPERATURAC es una Variable Global, es decir, puedes invocarla desde cualquier punto del sketch, asi que, la lee cuando le hemos dicho que la lea y la guarda para ser usada cuando queramos.

Animo y no desesperes que vas progresando muy rapido, a veces los arboles no nos dejan ver el bosque...no seras el primero que borra su sketch de 500 lineas y empieza desde cero todo jajajaja lo digo por experiencia. Para que te hagas una idea el sketch que tengo en la luminaria, solo controla los leds del acuario.... tiene 1200 lineas de codigo  :alas:  este aun va por las 312 y hace mas cosas que el otro de 1200 asi que... ANIMOOOOOO :heart:

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   INCLUDES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   PINES                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#define SENSORC 2                          //sensor DHT22 CLIMA
#define SENSORN 9                          //sensor DHT22 NIDO
#define SENSORLDR 0                        //sensor LDR
#define LEDFC 4                            //LED indicador frío CLIMA
#define LEDCC 3                            //LED indicador calor CLIMA
#define LEDFN 11                           //LED indicador frío NIDO
#define LEDCN 10                           //LED indicador calor NIDO
#define LEDLDR 7                           //LED indicador LDR iluminación Gral.
#define LEDABIER 5                         //LED indicador puerta ABIERTA
#define LEDCERRA 6                         //LED indicador puerta CERRADA
#define RELECC 22                          //Relé alta calor CLIMA
#define RELEFC 24                          //Relé baja frío CLIMA
#define RELELDR 26                         //Relé LDR iluminación Gral.
#define RELECN 28                          //Relé alta calor NIDO
#define RELEFN 30                          //Relé baja frío NIDO
#define RELEABRIR 34                       //Relé abrir puerta
#define RELECERRAR 36                      //Relé cerrar puerta

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  VARIABLES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

float TEMPERATURAC;                       //variable temperatura CLIMA
float TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
int TEMPNOW = 0;

DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CONFIGURACION                                  ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

uint64_t tiempodelectura = 0;
uint64_t tiempodelectura2 = 0;
int TempNID = 23;  /// Temperatura que querremos en el Nido
int TempINV = 24;  /// Temperatura que querremos en el Invernadero
#define SENSORES 30000 //
#define APERTURAS 30000 //


//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  SENSORES                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

 void LEER_SENSORES(){
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO

 
 
   Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
   Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 

   if(TEMPERATURAC != TEMPNOW){
    lcd.setCursor(0, 0);                    //Posicionando cursor 1ª línea
   lcd.print("CLIMA ");                    //Imprimir CLIMA
   lcd.print("T:");                        //Imprimir T:
   lcd.print(TEMPERATURAC, 1);             //asignar a impresión variable TªCLIMA
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADC);                    //asignar a impresión variable Hum.CLIMA
   lcd.setCursor(0, 1);                    //Posicionando cursor 2ª línea
   lcd.print("NIDO  ");                    //imprimir NIDO
   lcd.print("T:");                        //imprimir T:
   lcd.print(TEMPERATURAN, 1);             //asignar a impresión variable TªNIDO
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADN);                    //asignar a impresión variable Hum.NIDO
   TEMPNOW = TEMPERATURAC;
   }

   
  }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CREPUSCULO                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

  void CREPUSCULO(){
                                              //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
    Serial.println("LUZ:On");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:On");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");
   
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:Of");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");   
   }
 
  }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                               TEMPERATURA                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void TEMPERATURA(){
  if((TEMPERATURAC - 1) < TempINV){ 
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  }
  if(TEMPERATURAC + 1) > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }
  if(TEMPERATURAN - 1) < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  }
  if(TEMPERATURAN + 1) > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }
}

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                            APERTURA AUTOMATICA                                ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝
                                           
 void APERTURA(){                                       
                                         
  if((TEMPERATURAC - 2) < TempINV){                       
    digitalWrite(LEDCERRA, HIGH);           
    digitalWrite(RELECERRAR, LOW);         
    Serial.println("PUERTA CERRADA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA CERRADA");           
  }
  if((TEMPERATURAC + 2) > TempINV){                   
    digitalWrite(LEDABIER, HIGH);         
    digitalWrite(RELEABRIR, LOW);         
    Serial.println("PUERTA ABIERTA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA ABIERTA");
  }
 }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                     SETUP                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝


void setup(){

  lcd.setBacklightPin(3,POSITIVE);        //
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);
  lcd.clear();
 
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
 
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
 
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida(OJO!pinA1!)
                                          //NOTA: Entradas analógicas asignan por defect
 
 }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                    LOOP                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void loop(){


         
    uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
    if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
     }
    if((now - tiempodelectura2) > APERTURA) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura2 = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     APERTURA();                                    /// ejecutamos la lectura de sensores
     }
     CREPUSCULO();                                   
         
     TEMPERATURA();
}
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 27-Mayo-2020, 08:12
Buenos días Korneto! Disculpa el retraso.

Antes de nada, agradecer de nuevo tu ayuda una vez más y ya van unas cuantas. No te espantes por todo este ladrillo pero es que el asunto tiene su miga...

Estuve un buen rato repasando las modificaciones que habías hecho por aquello de entenderlo incluso antes de probarlo. Entre otras cosas pude ver la pifia que había hecho con los millis en el voidCREPUSCULO, je...  :whi:

Me he descojonado con lo de los lcdprint bailando samba en el loop! Pues menos mal que los has insertado tú en el voidSENSORES porque lo has hecho mediante un IF (Yo no lo hubiera pillado ni de lejos)

Entiendo que has creado la variable TEMPNOW=TEMPERATURAC para poder negarla mediante el IF. De ese modo el programa se ve obligado a revisar la temp. Y tan solo cuando es false, reescribir en display. Uf! Muy ingenioso. Intenté algo parecido que vi en un tuto que usaba “ESTADO” y luego lo “ponía en duda” en base a true-false.

No sé que copia del sketch te puse en el post anterior, pero en el que tenía trabajando en casa tenía la llamada en voidloop a APERTURA en último lugar, sospecho que al hacer copia faltó esto y el corchete, dos últimas líneas... ni idea.

Después compilé ya el nuevo programa y perfecto. Tan solo un problema de compilación al faltar unos paréntesis en la función suma-resta de los termostatos. Al ser el único error, reconocerlo fue inmediato.

-Termostatos CLIMA y NIDO: OK

-CREPUSCULO: OK

-APERTURA: No funciona de hecho, es un caos. Los relés no actúan (Ninguno de los dos) y los led hacen lo que les parece. Tal y como me pasaba hace dos días, el led de puerta abierta se enciende tan solo a medias: Problema de hardware?

Observa esta foto: He cargado el sketch antiguo en el que de forma desordenada  (Sin hacer los void separadamente para llamarlos en el loop) ya andaba la cosa aunque mal pues encendían los dos led de APERTURA a la vez pero los relés actuaban:


(http://www.zootecniadomestica.com/wp-content/uploads/2020/05/arduino-sketch-viejo-hardware-ok-RET.jpg)


Este era el dichoso sketch que ya viste y después corregiste, bueno reconstruiste sin la parte de APERTURA pues no la conocías. Lo vuelvo a poner aquí porque esto ya se complica :

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido


#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);


int SENSORC = 2;                          //sensor DHT22 CLIMA
int SENSORN = 9;                          //sensor DHT22 NIDO
int SENSORLDR = 0;                        //sensor LDR
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
int LEDFC = 4;                            //LED indicador frío CLIMA
int LEDCC = 3;                            //LED indicador calor CLIMA
int LEDFN = 11;                           //LED indicador frío NIDO
int LEDCN = 10;                           //LED indicador calor NIDO
int LEDLDR = 7;                           //LED indicador LDR iluminación Gral.
int LEDABIER = 5;
int LEDCERRA = 6;
int RELECC = 22;                          //Relé alta calor CLIMA
int RELEFC = 24;                          //Relé baja frío CLIMA
int RELELDR = 26;                         //Relé LDR iluminación Gral.
int RELECN = 28;                          //Relé alta calor NIDO
int RELEFN = 30;                          //Relé baja frío NIDO
int RELEABRIR = 34;                       //Relé abrir puerta(PENDIENTE)
int RELECERRAR = 36;                      //Relé cerrar puerta(PENDIENTE)
                                          //RELÉ LIBRE: Relé en PIN 32

int ABRIR;
int CERRAR;
                                         
float TEMPERATURAC;                       //lectura temperatura CLIMA
float TEMPERATURAN;                       //lectura temperatura NIDO

/////////////////////////                                         
float SETMINC = 20.0;  //                 //SET: ajuste temp mínima clima                         
float SETMAXC = 20.0;  //                 //SET: ajuste temp máxima clima
float SETMINN = 24.0;  //                 //SET: ajuste temp mínima nido
float SETMAXN = 30.0;  //                 //SET: ajuste temp máxima nido
/////////////////////////
                                         

DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

void setup(){

  lcd.setBacklightPin(3,POSITIVE);        //
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);
  lcd.clear();
 
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
 
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(LEDLDR, LOW);              //LED LDR (luz) señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal alta(Log,Inv)
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal alta(Log,Inv)
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta(")
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal alta(Log,Inv)
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal alta(Log,Inv)
  digitalWrite(LEDABIER, LOW);            //LED puerta ABIERTA señal baja
  digitalWrite(LEDCERRA, LOW);            //LED puerta CERRADA señal baja
  digitalWrite(RELEABRIR, HIGH);          //relé ABRIR puerta señal alta(Log,Inv)
  digitalWrite(RELECERRAR, HIGH);         //relé CERRAR puerta señal alta(Log,Inv)
 
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(LEDABIER, OUTPUT);              //pin LED puerta ABIERTA es una salida
  pinMode(LEDCERRA, OUTPUT);              //pin LED puerta CERRADA es una salida
  pinMode(RELEABRIR, OUTPUT);             //pin relé en fase ABRIR es una salida
  pinMode(RELECERRAR, OUTPUT);            //pin relé en fase CERRAR es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida
}                                         //NOTA: Entradas analógicas asignan por defecto
void loop(){

  lcd.setCursor(0, 0);                    //Posicionando cursor 1ª línea
  lcd.print("CLIMA ");                    //Imprimir CLIMA
  lcd.print("T:");                        //Imprimir T:
  lcd.print(TEMPERATURAC, 1);             //asignar a impresión variable TªCLIMA
  lcd.print(" HR:");                      //imprimir HR:
  lcd.print(HUMEDADC);                    //asignar a impresión variable Hum.CLIMA
  lcd.setCursor(0, 1);                    //Posicionando cursor 2ª línea
  lcd.print("NIDO  ");                    //imprimir NIDO
  lcd.print("T:");                        //imprimir T:
  lcd.print(TEMPERATURAN, 1);             //asignar a impresión variable TªNIDO
  lcd.print(" HR:");                      //imprimir HR:
  lcd.print(HUMEDADN);                    //asignar a impresión variable Hum.NIDO
                             
                                          //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO

  //////////////////////////////////////////////////
  ABRIR = dht1.readTemperature() + 2 > SETMAXC;   //
  CERRAR = dht1.readTemperature() - 2 < SETMINC;  //
  //////////////////////////////////////////////////
 
                                          //MONITOR SERIE
  Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA
  Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
  Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
  Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
  Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
  Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA 
  delay(500);                             //lapso demora 500 miliseg.(1/2 segundo)
 
                                          //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
  }
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
    Serial.print("LUZ:On");
    Serial.print(" UVa:__");
    Serial.println(" UVb:__");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:On");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");
     
   }else{                                 //sino...
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.print("LUZ:Off");
    Serial.print(" UVa:__");
    Serial.println(" UVb:__");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:Of");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");   
  }                                       //ATENCIÓN: Relés chinos: lógica inversa!
 delay(500);                              //lapso demora 500 miliseg.(1/2 segundo)
 
                                          //MÓDULO TERMOSTATO CLIMA GRAL. INVERNADERO
  if(TEMPERATURAC < SETMINC){             //Activa calefa clima
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
  }else{
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }   
 
  if(TEMPERATURAC > SETMAXC){             //Activa ventilación clima
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
  }else{
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  } 
 
  delay(500);
                                          //MÓDULO TERMOSTATO CLIMA NIDO HIBERNÁCULO
  if(TEMPERATURAN < SETMINN){             //Activa calefa nido
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
  }else{
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }   
 
  if(TEMPERATURAN > SETMAXN){             //Activa ventilación nido
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
  }else{
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  } 
 
  delay(500);
                                          //MÓDULO APERTURA/CIERRE PUERTAS
                                          //PELIGRO!!!Configurar retardo seguridad relés!!!
  if(CERRAR){                             //
    digitalWrite(LEDCERRA, HIGH);
    digitalWrite(RELECERRAR, LOW);
    Serial.println("PUERTA CERRADA");
    lcd.setCursor(0, 3);
    lcd.print("PUERTA CERRADA");
  }else{
    digitalWrite(LEDCERRA, LOW);
    digitalWrite(RELECERRAR, HIGH);
  }   
 
  if(ABRIR){                              //
    digitalWrite(LEDABIER, HIGH);
    digitalWrite(RELEABRIR, LOW);
    Serial.println("PUERTA ABIERTA");
    lcd.setCursor(0, 3);
    lcd.print("PUERTA ABIERTA");
  }else{
    digitalWrite(LEDABIER, LOW);
    digitalWrite(RELEABRIR, HIGH);
  } 
 
  delay(500);
}



Y esta foto es con el último sketch mejorado por ti (Versión actual). Voids declarados previamente y llamados desde el loop. Ya contiene el void APERTURA y su retardo por millis. Ambas fotos hechas esta mañana para intentar descartar un problema de hardware:

(http://www.zootecniadomestica.com/wp-content/uploads/2020/05/arduino-sketch-nuevo-hardware-RET.jpg)

Donde: 1> Observa que ninguno de los dos relés de APERTURA trabajan.
           2> El led rojo no debería encenderse y lo hace pero a medias: Corrientes parásitas???  :und:

Si no encuentras nada raro en esta última versión del programa no me quedará otra que:

-Sustituir alimentación USB por fuente externa de 1A mín. (Tengo una ATX de 20A nueva y aburrida. La burra grande, ande o no ande...)

-Descartar haberme cargado el Arduino MEGA rehaciendo todo el hard. (Raro sería, el viejo sketch anda con los mismos pines)

-Ya he descartado un fallo de protoboard pero igualmente la cambiaré (Tengo dos más) y si hace falta iré soldando los componentes porque esto de los cables Dupont es un inconmensurable truño.

Estoy casi casi seguro de que el sketch funciona bien (Va como un tiro) aunque tal vez no se haya probado en condiciones (Hard). De hecho, APERTURA viene a ser lo mismo que los otros dos termostatos eso si, con un retardo en millis. Descuida que no nos quedaremos sin saber qué pasa con la cacharrería, me llevo algo mejor con el hardware que con el software  :hap:

Si puedes por favor, te agradecería que con toda la calma del mundo revises esta última versión. NO TENGO NINGUNA PRISA (Hasta que llegue el invierno y tampoco, ya tengo un controlador analógico por estrenar) de hecho, si quieres que nos tomemos unas vacaciones pues cojonudo.

Un saludo crack y gracias por todas las molestias!



Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: korneto en 27-Mayo-2020, 09:00
Buenos dias Ramon

Vacaciones?? que vaaaa jajajaja llevo 2 meses en ERTE asi que es como unas minivacaciones.

TEMPNOW

Basicamente hemos declarado una variable vacia como TEMPNOW. Al pasar arduino por esa linea le dice que si la temperatura actual es diferente a TEMPNOW escriba en la pantalla y declare TEMPNOW con el valor de la temperatura actual, asi solo se escribe de nuevo si la temperatura actual cambia. Es un recurso muy util para un sin fin de cosas.

APERTURA

Fallo mio , jajajaja, si te fijas al principio declare la variable #define APERTURAS 30000 pero si vas al loop veras que algo falla....   if((now - tiempodelectura2) > APERTURA) { ... le falta la S esto lo hice para que el nombre APERTURA no coincida con el del loop, vamos seria añadirle la S al final.

TRUCO DE LOS ERRORES

Te voy a contar como hago yo cada vez que creo algo nuevo en el sketch, como ya te dije yo he ido aprendiendo a mi manera yo solo asi que el truco es cosecha propia.

Crear un nuevo void temporizado

En el loop

 if((now - tiempodelectura3) > LOQUESEA) {   
          tiempodelectura3 = now;                 
            Serial.print("FUNCIONA");                         
     }

Subo el sketch y miro si en el monitor serie me pone FUNCIONA si es SI sigo si es NO repaso ese poquito de codigo

SIGUIENTE PASO

void LOQUESEA(){

Serial.print("FUNCIONA");
}

En el loop

 if((now - tiempodelectura3) > LOQUESEA) {   
          tiempodelectura3 = now;                 
          LOQUESEA();                       
     }

Vuelvo a subir el codigo y vuelvo a mirar si sale FUNCIONA y asi es como iba poco a poco creando el nuevo codigo, tardas mas , pero es infalible. Actualmente tambien lo uso pero mucho menos, solo cuando no doy encontrado un error en alguna parte entonces lo comento todo y voy poco a poco en esa parte.

De todas maneras, faltaban tambien algunos ) en el sketch  :nos:

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG Zootecnia Doméstica  04/05/2020  V.1                    //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   INCLUDES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   PINES                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#define SENSORC 2                          //sensor DHT22 CLIMA
#define SENSORN 9                          //sensor DHT22 NIDO
#define SENSORLDR 0                        //sensor LDR
#define LEDFC 4                            //LED indicador frío CLIMA
#define LEDCC 3                            //LED indicador calor CLIMA
#define LEDFN 11                           //LED indicador frío NIDO
#define LEDCN 10                           //LED indicador calor NIDO
#define LEDLDR 7                           //LED indicador LDR iluminación Gral.
#define LEDABIER 5                         //LED indicador puerta ABIERTA
#define LEDCERRA 6                         //LED indicador puerta CERRADA
#define RELECC 22                          //Relé alta calor CLIMA
#define RELEFC 24                          //Relé baja frío CLIMA
#define RELELDR 26                         //Relé LDR iluminación Gral.
#define RELECN 28                          //Relé alta calor NIDO
#define RELEFN 30                          //Relé baja frío NIDO
#define RELEABRIR 34                       //Relé abrir puerta
#define RELECERRAR 36                      //Relé cerrar puerta

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  VARIABLES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

float TEMPERATURAC;                       //variable temperatura CLIMA
float TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
int TEMPNOW = 0;

DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CONFIGURACION                                  ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

uint64_t tiempodelectura = 0;
uint64_t tiempodelectura2 = 0;
int TempNID = 23;  /// Temperatura que querremos en el Nido
int TempINV = 24;  /// Temperatura que querremos en el Invernadero
#define SENSORES 30000 //
#define APERTURAS 30000 //


//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  SENSORES                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

 void LEER_SENSORES(){
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO

 
 
   Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
   Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 

   if(TEMPERATURAC != TEMPNOW){
    lcd.setCursor(0, 0);                    //Posicionando cursor 1ª línea
   lcd.print("CLIMA ");                    //Imprimir CLIMA
   lcd.print("T:");                        //Imprimir T:
   lcd.print(TEMPERATURAC, 1);             //asignar a impresión variable TªCLIMA
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADC);                    //asignar a impresión variable Hum.CLIMA
   lcd.setCursor(0, 1);                    //Posicionando cursor 2ª línea
   lcd.print("NIDO  ");                    //imprimir NIDO
   lcd.print("T:");                        //imprimir T:
   lcd.print(TEMPERATURAN, 1);             //asignar a impresión variable TªNIDO
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADN);                    //asignar a impresión variable Hum.NIDO
   TEMPNOW = TEMPERATURAC;
   }

   
  }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CREPUSCULO                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

  void CREPUSCULO(){
                                              //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
    Serial.println("LUZ:On");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:On");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");
   
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:Of");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");   
   }
 
  }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                               TEMPERATURA                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void TEMPERATURA(){
  if((TEMPERATURAC - 1) < TempINV){ 
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  }
  if((TEMPERATURAC + 1) > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }
  if((TEMPERATURAN - 1) < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  }
  if((TEMPERATURAN + 1) > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }
}

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                            APERTURA AUTOMATICA                                ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝
                                           
 void APERTURA(){                                       
                                         
  if((TEMPERATURAC - 2) < TempINV){                       
    digitalWrite(LEDCERRA, HIGH);           
    digitalWrite(RELECERRAR, LOW);         
    Serial.println("PUERTA CERRADA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA CERRADA");           
  }
  if((TEMPERATURAC + 2) > TempINV){                   
    digitalWrite(LEDABIER, HIGH);         
    digitalWrite(RELEABRIR, LOW);         
    Serial.println("PUERTA ABIERTA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA ABIERTA");
  }
 }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                     SETUP                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝


void setup(){

  lcd.setBacklightPin(3,POSITIVE);        //
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);
  lcd.clear();
 
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
 
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
 
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida(OJO!pinA1!)
                                          //NOTA: Entradas analógicas asignan por defect
 
 }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                    LOOP                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void loop(){


         
    uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
    if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
     }
    if((now - tiempodelectura2) > APERTURAS) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura2 = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     APERTURA();                                    /// ejecutamos la lectura de sensores
     }
     CREPUSCULO();                                   
         
     TEMPERATURA();
}

Ahi esta corregido, aun asi creo que nos puede dar algun problema puesto que TEMPERATURAC es un float y le estamos restando un int, pero vamos a ver si suena la campana asi y sino lo cambiamos
Título: Re:Terrario exterior para Pogona, todo el año?
Publicado por: Ramon en 27-Mayo-2020, 13:44
Jooooder, esto me recuerda a mi infancia hace muuuchos años. Yo te propongo vacaciones y tu me respondes que de eso nada. Y encima me pones deberes!!!  :ght:


Creo que con tu método paso a paso esta vez lo tendría que pillar, ya va siendo hora. Lo probaré hasta la saciedad a ver si así...

(Tengo una moscarda por aquí dando por saco, espera...         ...se escapó.)

He cargado el programa y tachán! El problema persiste...

He cambiado tanto el LED como la resistencia y los dos jumpers por otros componentes nuevos. Nanai...

He sustituido las variables float por int. Compila sin problemas y cuando lo cargo como es natural, pierdo los decimales de las temperaturas en la LCD pero el problema sigue.

El problema:

1-Los relés correspondientes al actuador lineal RELEABRIR (pin 34) y RELECERRAR (pin 36) declarados ambos como.... mierda, espera!!!!

   Relés ABRIR/CERRAR sin declarar como salida!
   Relés ABRIR/CERRAR sin declarar como HIGH! (Lógica inversa china)

   He o hemos debido traspapelar archivos previos y posteriores a la asignación de voidAPERTURA. Hago prueba... Los relés ya funcionan pero se superponen en las temperaturas próximas a TempINV. Bueno, a menos hemos vuelto al error inicial!

Vuelvo a cambiar float por int... y voy probando en TempINV diversos valores próximos a la lectura del DHT1:

TempINV= 24 / temperatura lectura DHT1= 23. Los dos relés encendidos a la vez pese a que tendrían que actuar uno a -2ºC y el otro a +2ºC respecto a TempINV!


2-Los leds encargados de avisar el estado puerta ABIERTA/CERRADA trabajan a baja tensión (Poca luz) y también están encendidos a la vez.


3-En la LCD imprime PUERTA ABIERTA aún correspondiendo CERRADA

Esto vuelve a oler a hardware ya sea por falta de amperaje (Lo cual no tiene sentido, el otro sketch antiguo lo encendía todo y podía) o alguna corriente parásita. Me estoy volviendo loco  :tongo:

(Ahora sí, me acabo de cargar la moscarda...  :ght:)

Aprovecho para ponerte el sketch con las correcciones de añadir los relés como salida y señal HIGH y el cambio de float por int:

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////
//                                                                 //
//       CONTROLADOR BIZONAL INVERNADERO PARA REPTILES   V.1       //
//                                                                 //
//     -Control clima general:Termostato 2 relé (alta/baja)        //
//     -Control hibernáculo(nido):Termostato 2 relé ( " )          //
//     -Medición humedad relativa (HR) invernadero y nido          //
//     -Interruptor crepuscular alumbrado general (diurno)         //
//     -Control continuo rendimiento lámpara/tubo UVa/UVb          //
//     -Control horario/estacional de parámetros (Temps./luz)      //
//     -Apertura/cierre progresivo techo invernadero               //
//     -Sensor lluvia cierre total techo invernadero               //
//     -Sensor presencia en hibernáculo (eficiencia energética)    //
//                                                                 //
//     RCG y Korneto para Zootecnia Doméstica  04/05/2020  V.1     //
//                                                                 //
/////////////////////////////////////////////////////////////////////


//Glosario, terminaciones en:
//  ...C: Relativas a Clima invernadero (general)       
//  ...N:    "   a clima Nido (hibernáculo)
//  ..FC:    "   a Frío Clima general
//  ..FN:    "   a Frío Nido
//  ..CC:    "   a Calor Clima
//  ..CN:    "   a Calor Nido

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   INCLUDES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#include <DHT.h>                          //librería DHT
#include <DHT_U.h>                        //librería DHT unificada

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                   PINES                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

#define SENSORC 2                          //sensor DHT22 CLIMA
#define SENSORN 9                          //sensor DHT22 NIDO
#define SENSORLDR 0                        //sensor LDR
#define LEDFC 4                            //LED indicador frío CLIMA
#define LEDCC 3                            //LED indicador calor CLIMA
#define LEDFN 11                           //LED indicador frío NIDO
#define LEDCN 10                           //LED indicador calor NIDO
#define LEDLDR 7                           //LED indicador LDR iluminación Gral.
#define LEDABIER 5                         //LED indicador puerta ABIERTA
#define LEDCERRA 6                         //LED indicador puerta CERRADA
#define RELECC 22                          //Relé alta calor CLIMA
#define RELEFC 24                          //Relé baja frío CLIMA
#define RELELDR 26                         //Relé LDR iluminación Gral.
#define RELECN 28                          //Relé alta calor NIDO
#define RELEFN 30                          //Relé baja frío NIDO
#define RELEABRIR 34                       //Relé abrir puerta
#define RELECERRAR 36                      //Relé cerrar puerta

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  VARIABLES                                    ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

int TEMPERATURAC;                       //variable temperatura CLIMA
int TEMPERATURAN;                       //variable temperatura NIDO
int HUMEDADC;                             //variable humedad CLIMA
int HUMEDADN;                             //variable humedad NIDO
int TEMPNOW = 0;

DHT dht1(SENSORC, DHT22);                 //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22);                 //Asignación sensor NIDO

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CONFIGURACION                                  ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

uint64_t tiempodelectura = 0;
uint64_t tiempodelectura2 = 0;
int TempNID = 23;  /// Temperatura que querremos en el Nido
int TempINV = 24;  /// Temperatura que querremos en el Invernadero
#define SENSORES 30000 //
#define APERTURAS 30000 //


//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                  SENSORES                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

 void LEER_SENSORES(){
                                            //VARIABLES
  TEMPERATURAC = dht1.readTemperature();  //asignación variable lectura Temp. DHTCLIMA
  HUMEDADC = dht1.readHumidity();         //asignación variable lectura Humed. DHTCLIMA
  TEMPERATURAN = dht2.readTemperature();  //asignación variable lectura Temp. DHTNIDO
  HUMEDADN = dht2.readHumidity();         //asignación variable lectura Humed. DHTNIDO

 
 
   Serial.print("CLIMA ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAC, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADC);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea?
   Serial.print("NIDO  ");                 //imprimir Monitor serie. Sin valor
   Serial.print("Tª:");                    //imprimir Monitor serie. Con valor TªCLIMA
   Serial.print(TEMPERATURAN, 1);          //asignar a impresión variable TªCLIMA
   Serial.print(" HR:");                   //imprimir Monitor serie. Con valor Hum.CLIMA
   Serial.println(HUMEDADN);               //asignar a impresión variable Hum.CLIMA y ¿(ln)fin línea? 

   if(TEMPERATURAC != TEMPNOW){
    lcd.setCursor(0, 0);                    //Posicionando cursor 1ª línea
   lcd.print("CLIMA ");                    //Imprimir CLIMA
   lcd.print("T:");                        //Imprimir T:
   lcd.print(TEMPERATURAC, 1);             //asignar a impresión variable TªCLIMA
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADC);                    //asignar a impresión variable Hum.CLIMA
   lcd.setCursor(0, 1);                    //Posicionando cursor 2ª línea
   lcd.print("NIDO  ");                    //imprimir NIDO
   lcd.print("T:");                        //imprimir T:
   lcd.print(TEMPERATURAN, 1);             //asignar a impresión variable TªNIDO
   lcd.print(" HR:");                      //imprimir HR:
   lcd.print(HUMEDADN);                    //asignar a impresión variable Hum.NIDO
   TEMPNOW = TEMPERATURAC;
   }

   
  }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                CREPUSCULO                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

  void CREPUSCULO(){
                                              //INTERRUPTOR CREPUSCULAR
   if(analogRead(SENSORLDR) < 200){       //si... lectura sensor LDR inferior a...
    digitalWrite(LEDLDR, HIGH);           //...entonces LED LDR señal alta
    digitalWrite(RELELDR, LOW);           //...entonces relé LDR Ilum.Gral. señal baja
    Serial.println("LUZ:On");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:On");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");
   
   }else{                                 //sino... 
    digitalWrite(LEDLDR, LOW);            //...LED LDR señal baja 
    digitalWrite(RELELDR, HIGH);          //relé LDR Ilum.Gral. señal alta
    Serial.println("LUZ:Off");
    lcd.setCursor(0, 2);
    lcd.print("LUZ:Of");
    lcd.print(" UVa:__");
    lcd.print(" UVb:__");   
   }
 
  }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                               TEMPERATURA                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void TEMPERATURA(){
  if((TEMPERATURAC - 1) < TempINV){ 
    digitalWrite(LEDCC, HIGH);
    digitalWrite(RELECC, LOW);
    digitalWrite(LEDFC, LOW);
    digitalWrite(RELEFC, HIGH);
  }
  if((TEMPERATURAC + 1) > TempINV){
    digitalWrite(LEDFC, HIGH);
    digitalWrite(RELEFC, LOW);
    digitalWrite(LEDCC, LOW);
    digitalWrite(RELECC, HIGH);
  }
  if((TEMPERATURAN - 1) < TempNID){
    digitalWrite(LEDCN, HIGH);
    digitalWrite(RELECN, LOW);
    digitalWrite(LEDFN, LOW);
    digitalWrite(RELEFN, HIGH);
  }
  if((TEMPERATURAN + 1) > TempNID){
    digitalWrite(LEDFN, HIGH);
    digitalWrite(RELEFN, LOW);
    digitalWrite(LEDCN, LOW);
    digitalWrite(RELECN, HIGH);
  }
}

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                            APERTURA AUTOMATICA                                ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝
                                           
 void APERTURA(){                                       
                                         
  if((TEMPERATURAC - 2) < TempINV){                       
    digitalWrite(LEDCERRA, HIGH);           
    digitalWrite(RELECERRAR, LOW);         
    Serial.println("PUERTA CERRADA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA CERRADA");           
  }
  if((TEMPERATURAC + 2) > TempINV){                   
    digitalWrite(LEDABIER, HIGH);         
    digitalWrite(RELEABRIR, LOW);         
    Serial.println("PUERTA ABIERTA");       
    lcd.setCursor(0, 3);
    lcd.print("PUERTA ABIERTA");
  }
 }
 
//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                     SETUP                                     ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝


void setup(){

  lcd.setBacklightPin(3,POSITIVE);        //
  lcd.setBacklight(HIGH);
  lcd.begin(20, 4);
  lcd.clear();
 
  Serial.begin(9600);                     //inicializando monitor serie
  dht1.begin();                           //inicializando sonda DHT1(CLIMA)
  dht2.begin();                           //inicializando sonda DHT2(NIDO)
 
  digitalWrite(LEDCC, LOW);               //LED calor CLIMA señal baja
  digitalWrite(LEDFC, LOW);               //LED frío CLIMA señal baja
  digitalWrite(RELECC, HIGH);             //relé calor CLIMA señal baja
  digitalWrite(RELEFC, HIGH);             //relé frío CLIMA señal baja
  digitalWrite(RELELDR, HIGH);            //relé LDR iluminación Gral.señal alta
  digitalWrite(LEDCN, LOW);               //LED calor NIDO señal baja
  digitalWrite(LEDFN, LOW);               //LED frío NIDO señal baja
  digitalWrite(RELECN, HIGH);             //relé calor NIDO señal baja
  digitalWrite(RELEFN, HIGH);             //relé frío NIDO señal baja
  digitalWrite(RELEABRIR, HIGH);
  digitalWrite(RELECERRAR, HIGH);
 
  pinMode(LEDCC, OUTPUT);                 //pin LED calor CLIMA es una salida
  pinMode(LEDFC, OUTPUT);                 //pin LED frío CLIMA es una salida
  pinMode(LEDLDR, OUTPUT);                //pin LED LDR Ilumin. Gral. es una salida
  pinMode(RELECC, OUTPUT);                //pin relé calor CLIMA es una salida
  pinMode(RELEFC, OUTPUT);                //pin relé frío CLIMA es una salida
  pinMode(RELELDR, OUTPUT);               //pin relé LDR Ilumin. Gral. es una salida
  pinMode(LEDCN, OUTPUT);                 //pin LED calor NIDO es una salida
  pinMode(LEDFN, OUTPUT);                 //pin LED frío NIDO es una salida
  pinMode(RELECN, OUTPUT);                //pin relé calor NIDO es una salida
  pinMode(RELEFN, OUTPUT);                //pin relé frío NIDO es una salida
  pinMode(RELEABRIR, OUTPUT);
  pinMode(RELECERRAR, OUTPUT);
                                          //NOTA: Entradas analógicas asignan por defect
 
 }

//╔══════════════════════════════════════════════╗
//║                                                                               ║
//║                                                                               ║
//║                                    LOOP                                       ║
//║                                                                               ║
//║                                                                               ║
//╚══════════════════════════════════════════════╝

void loop(){


         
    uint64_t now = millis();  /// declaramos la variable now con los millis actuales
     
    if((now - tiempodelectura) > SENSORES) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     LEER_SENSORES();                                    /// ejecutamos la lectura de sensores
     }
    if((now - tiempodelectura2) > APERTURAS) {    /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
          tiempodelectura2 = now;                   /// cambiamos la variable tiempo de lectura por now que son los millis actuales
     APERTURA();                                    /// ejecutamos la lectura de sensores
     }
     CREPUSCULO();                                   
         
     TEMPERATURA();
}