Problema control T°

Buenas soy nuevo en este tema de Arduino y he hecho mi propio programa que por cierto funcionaba bien con un solo rele, el problema comenzó cuando incorpore 3 más, la acción que debería ocurrir al bajar o pasar ciertos márgenes de Temperatura no ocurre y los reles parpadean rápidanente como se ve en el vídeo, acá dejo el codigo estaría muy agradecido si alguien tiene tiempo para ayudarme

#include <DHT.h> 
#include <Wire.h> 
#include <LCDIC2.h>
#include <LiquidCrystal_I2C.h> //adicion librerias

#define DHTPIN 4 // entrada conexion dht22

#define DHTTYPE DHT22 // especifico tipo de sensor 

DHT dht(DHTPIN, DHTTYPE);  

LiquidCrystal_I2C lcd(0x27, 16, 2); // led I2C  0x27, 16 

//Variables int 

int Sensorsuelo = A0; 
float hum; // humidity valor
float temp; // temperature valor
int venti = 2;
int humid = 3;
int manta = 5;

void setup() { 
    
pinMode(venti,OUTPUT); // Ventilador
pinMode(humid,OUTPUT); // humidifador 
pinMode(manta,OUTPUT); // manta termica

digitalWrite(venti,LOW);
digitalWrite(humid,LOW);
digitalWrite(manta,LOW);

lcd.init(); // inicio lcd
lcd.backlight(); 
lcd.setCursor(0, 0); // mueve cursor 0,0
lcd.print("MAGIC");
(9600);
delay;(4000); 
dht.begin();
lcd.begin(16,2); 
lcd.init(); // inicio lcd
lcd.setCursor(0, 0);
lcd.print( "magic:");
lcd.setCursor(0, 1);
lcd.print("Cris.floating.root");
 delay;(3000);

lcd.backlight(); 
} 

void loop() { 

    
    delay(9000);
    
    //leer datos y establecerlos en hum,temp,humsuelo

hum = dht.readHumidity(); 
temp = dht.readTemperature(); 
int hums = analogRead(Sensorsuelo);
    
    
if(temp>29){
        digitalWrite(venti,HIGH);
        digitalWrite(humid,HIGH);
        digitalWrite(manta,LOW);
        delay(20000);
        digitalWrite(venti,LOW);
        digitalWrite(humid,LOW);
        digitalWrite(manta,LOW);
        
    }
    else{
        digitalWrite(venti,LOW);
        digitalWrite(humid,LOW);
        digitalWrite(manta,LOW);
        }
    
    if (temp<27){
        digitalWrite(venti,LOW);
        digitalWrite(humid,LOW);
        digitalWrite(manta,HIGH);
       
    }
    
    else{
        digitalWrite(venti,LOW);
        digitalWrite(humid,LOW);
        digitalWrite(manta,LOW);
      
        
    }
    
    
    //monitor serial

Serial.print("Humidity: "); 
Serial.print(hum); 
Serial.print(" %, Temp: "); Serial.print(temp); 
Serial.println(" Celsius"); 

    
//monitot lcd

lcd.setCursor(0,0); 
lcd.print("HR: "); 
lcd.print(hum); 
lcd.print("%"); 
lcd.setCursor(0,1); 
lcd.print("T:"); 
lcd.print(temp); 
lcd.println(" C");
lcd.setCursor(8,1);
lcd.print("HS:"); 
lcd.print(hums);

    
    
  

delay(30000); //Delay 3min 
   }

Esto ni con 1 rele te puede funcionar

lcd.print("MAGIC");
(9600);   // <===== Que es esto?
delay;(4000); // <===== Y esto?

Y aprende a programar sin usar delay(), salvo en el setup
Pero cada vez que tu código encuentra un delay() no hace mas que eso, demorar sin hacer anda por el tiempo que le indicas.
Mira en Documentación como se usa millis().

Sigo mirando tu código
Corrige esta parte del loop

void loop() { 
	//delay(9000);

	//leer datos y establecerlos en hum,temp,humsuelo
	hum = dht.readHumidity(); 
	temp = dht.readTemperature(); 
	int hums = analogRead(Sensorsuelo);

	if (temp > 29){
		digitalWrite(venti,HIGH);
		digitalWrite(humid,HIGH);
		digitalWrite(manta,LOW);
		delay(20000);
		digitalWrite(venti,LOW);
		digitalWrite(humid,LOW);
		digitalWrite(manta,LOW);
	}
	if (temp < 27){
		digitalWrite(venti,LOW);
		digitalWrite(humid,LOW);
		digitalWrite(manta,HIGH);
	}
	else {
		digitalWrite(venti,LOW);
		digitalWrite(humid,LOW);
		digitalWrite(manta,LOW);
	}

	//monitor serial
	Serial.print("Humidity: "); 
	Serial.print(hum); 
	Serial.print(" %, Temp: "); Serial.print(temp); 
	Serial.println(" Celsius"); 


	//monitot lcd
	lcd.setCursor(0,0); 
	lcd.print("HR: "); 
	lcd.print(hum); 
	lcd.print("%"); 
	lcd.setCursor(0,1); 
	lcd.print("T:"); 
	lcd.print(temp); 
	lcd.println(" C");
	lcd.setCursor(8,1);
	lcd.print("HS:"); 
	lcd.print(hums);
	delay(30000); //Delay 3min 
}

Tu error es el siguiente.
Cada condición hace determinada acción con los reles si es True y otra cuando no lo es,
La primera si es > 29 acciona los reles

		digitalWrite(venti,HIGH);
		digitalWrite(humid,HIGH);
		digitalWrite(manta,LOW);

pero si no, los apaga a los 3
Luego viene la consulta si es < 27 y haces esto

		digitalWrite(venti,LOW);
		digitalWrite(humid,LOW);
		digitalWrite(manta,HIGH);

y de nuevo apagas todo si no lo es.
Lo que no te diste cuenta que el no mayor a 29 es cualquier temp = 29 para abajo apagando todos los reles.
El no menor 27 es >= 27 hasta 29 (que viene de la consulta anterior) y de nuevo apaga todo.
Veamos si ahora el código se comporta como deseas.

Modifique el programa para simplificar , y descarte por el momento 3 rele pero claro me gustaría llegar al punto de controlar clima y 4rele para control y claro regule bien la lectura delay .. quizás la sentencia if no es la indicada para mí propósito que es Mantener humbrales de temperatura. Mayor 24 y menor 28.

Pero acaso lo que te he sugerido no funciona como pretendes?

           if (temp > 29){
		digitalWrite(venti,HIGH);
		digitalWrite(humid,HIGH);
		digitalWrite(manta,LOW);
		delay(20000);
		digitalWrite(venti,LOW);
		digitalWrite(humid,LOW);
		digitalWrite(manta,LOW);
	}
	if (temp < 27){
		digitalWrite(venti,LOW);
		digitalWrite(humid,LOW);
		digitalWrite(manta,HIGH);
	}
	else {
		digitalWrite(venti,LOW);
		digitalWrite(humid,LOW);
		digitalWrite(manta,LOW);
	}

Este código HACE lo que deseas. Si es > 29 prende

   digitalWrite(venti,HIGH);
   digitalWrite(humid,HIGH);
   digitalWrite(manta,LOW);

y luego de 20 seg los apaga pero mientras no hace nada por culpa del delay(20000).

Si es < 27

   digitalWrite(venti,LOW);
   digitalWrite(humid,LOW);
   digitalWrite(manta,HIGH);

y de lo contrario todo en LOW.
No es lo que quieres?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.