A 26-04-20. Seguimos confinados 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…:
Seguiremos actualizando. Cuando a los que no tenemos curro nos dejen salir...
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 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:
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.
Ahora vuelvo...
Hala, ya he vuelto y sigo con mis paridas...
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)
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)
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. En cuanto a memoria interna, todavía ando razonablemente bien pese a lo rudimentario del sketch (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 o añadir cualquier cosa, subo el código:
Código:
/////////////////////////////////////////////////////////////////////
// //
// 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);
}
Agradeceré todo consejo, es mi primer contacto con Arduino y ando como un guppy en Malawi...
Hala, un saludo!