Automatización de un terrario

hola buen día, soy nuevo en el foro y gracias al mismo ya he podido resolver algunas de las dudas que he tenido con el proyecto que estoy realizando, les explico ; estoy utilizando un arduino uno , un modulo rtc, un sensor de temperatura y humedad así como un modulo de 4 reveladores para automatizar un terrario, la idea es que el sensor de temperatura y humedad me activen tanto un calentador como un atomizado cuando los parámetros bajen de lo establecido como mínimo, eso ya lo logre :slight_smile: lo que me falta es que mi foco de luz de día se active y se apague a la hora establecida, ya he probado cambiando el nombre a los pines y las instrucciones pero aun así se mantiene encendido aunque recorra la hora para revisar que se apague.

aquí dejo el código:

#include <LiquidCrystal_I2C.h>


#include <Wire.h>
#include <DHT.h>
#include <DHT_U.h>




LiquidCrystal_I2C lcd (0x27,16,2);//ale con esta direccion  puedes usar (0x3f,16,2)||(0x20,16,2)
#include "Sodaq_DS3231.h"
char DiaSemana[][4] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
   // La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga
   // Ejemplo 2018 noviembre 11, 08:00:00  dia 6-Sabado (0=Dom, 1=Lun, 2=Mar, 3=Mie, 4=Jue, 5=Vie, 6=Sab)
   // DateTime dt(2019, 04, 18, 03, 23, 0, 4);

   int SENSOR = 2;
int TEMPERATURA;
int HUMEDAD;
int luz3 = 3;
int lluvia4 = 4;
int calor5 = 5; 
int jum6 = 6;

DHT dht (SENSOR, DHT11);

void setup() {
 
 
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
 dht.begin();
rtc.begin(); 
Wire.begin();
lcd.begin(16,2);
Serial.begin(9600);
lcd.backlight();
lcd.setCursor (3,0);
lcd.print ("ROMNI  9000");
 lcd.setCursor (0,1);
lcd.print ("INDUSTRIAS BALTA");
delay(5000);
lcd.clear();
  // La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga 
   //rtc.setDateTime(dt);
}

void loop() {
 DateTime now = rtc.now();
 TEMPERATURA = dht.readTemperature();
   HUMEDAD = dht.readHumidity();
lcd.setCursor(0,0);
   lcd.print("TEMP: ");
lcd.print(TEMPERATURA);
lcd.setCursor(0,1);
lcd.print("HU/R: ");
lcd.print(HUMEDAD);



   

  
 
   Serial.print("TEMP: ");
   Serial.print(TEMPERATURA);
   Serial.print("HUM: ");
Serial.println(HUMEDAD);
   delay(1000);
 
int hora    =now.hour();
int minuto  =now.minute();
int segundo = now.second();
  if(hora >=10 && hora <20 ){
  digitalWrite(luz3,HIGH);
  }
  else {
  digitalWrite(luz3,LOW);}
  if(minuto >=26 && minuto <27 ){
   digitalWrite(4,true);}

   else {digitalWrite(4,false);}
   
   if(TEMPERATURA >=27){
  digitalWrite(calor5,HIGH);}
  
  else {
  digitalWrite(calor5,LOW);}
  
  
   if(HUMEDAD >=60){
  digitalWrite(jum6,HIGH);
  }
  else {
  digitalWrite(jum6,LOW);
  }
   
    }

codigo.txt (2.1 KB)

El código no debe estar como adjunto, sino en el propio mensaje entre las etiquetas code (en el menú a la izquierda de la B), así nos facilitas leer tu código sin descargarlo.

Respecto a tu pregunta, quieres prender apagar el foco a un horario fijo ? porque no usas un sensor de luz (fotoresistencia LDR) ?

gracias por el dato del código amigo kike_GL ya lo modifique :slight_smile:

No veo que incluyas la libreria RTClib.h para que poner rtc.begin(); ?

Similar comentario con la variable now, no existe el tipo de dato DateTime ni los metodos: now(), hour(), minute(), second(), etc

intente introducir la librería rtclib.n sin embargo al momento de compilar me marca un error en la compilación, no se porque me aparecerá esto ya que si incluyo esta librería en otro código si me funciona.

No veo que incluyas la libreria RTClib.h para que poner rtc.begin(); ?

Si esta incluido

#include "Sodaq_DS3231.h"

trozelva, si estas usando un RELE recuerda que la conexión habitual del rele al arduino hace que un LOW lo Active y un HIGH lo desactive, a la inversa de lo que esperas.

Verifica eso

hola buenas tardes, 2 días atrás realice un post donde pedía ayuda con un código para un controlador de que estoy realizando para un terrario, he modificado mi código, cambien las salidas sin embargo sigo con el mismo problema el cual es que mi rele asignado a la tarea de encender un foco de luz de día no se apaga nunca, ya he cambiado mi libreria, y he reconfigurado el codigo, el cual no me arroja ningun error al compilarlo ni subirlo al arduino , solo no obedece el apagar mi rele, incusive un rele que tengo de sobra a pesar de no estar en el codigo se enciende y permanece encendido, si me pudieran ayudar para saber que es lo que estoy haciendo mal se los agradeceria mucho.

saludos

#include <DHT.h>
#include <DHT_U.h>
#include <RTClib.h>
#include <Wire.h>
 
LiquidCrystal_I2C lcd (0x27,16,2);

RTC_DS1307 RTC;

bool Amanecer = true;
bool atardecer= true;


int SENSOR =2;
int TEMPERATURA;
int HUMEDAD;
int DIA =9;
int LLUVIA = 4;
int CALEFACCION = 5;
int ROCIO = 6;

DHT dht (SENSOR, DHT11);

void setup(){
 pinMode(9,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
 Serial.begin(9600);
 if(! RTC.begin()){
  Serial.print("Modulo no encontrado !");
  while (1);}
  RTC.adjust(DateTime(__DATE__,__TIME__));
   dht.begin();
// rtc.begin(); 
 Wire.begin();
 lcd.begin(16,2);
 Serial.begin(9600);
lcd.backlight();
 lcd.setCursor (3,0);
 lcd.print ("ROMNI  9000");
  lcd.setCursor (0,1);
 lcd.print ("INDUSTRIAS BALTA");
 delay(5000);
 lcd.clear();
}
void loop(){
DateTime fecha = RTC.now();
TEMPERATURA = dht.readTemperature();
HUMEDAD = dht.readHumidity();

lcd.setCursor(0,0);
lcd.print("TEMP: ");
lcd.print(TEMPERATURA);
lcd.setCursor(0,1);
lcd.print("HU/R: ");
lcd.print(HUMEDAD);

Serial.print("TEMP: ");
    Serial.print(TEMPERATURA);
    Serial.print("HUM: ");
 Serial.println(HUMEDAD);
    delay(1000);
  


if (fecha.hour()==14 && fecha. minute ()==40){
  if(Amanecer ==true){
    digitalWrite(DIA,HIGH);
    lcd.setCursor(10,0);
lcd.print("DIA");
Amanecer = false;
  }}

if (fecha.hour()==14 && fecha. minute()==41){
  if(atardecer == true){
    digitalWrite(DIA,LOW);
    atardecer = false;}}

    if (fecha.hour()==2 && fecha.minute()==39){
      Amanecer = true;
      atardecer = true;
    }
    
    if(TEMPERATURA >=27){
   digitalWrite(CALEFACCION,HIGH);}
   
   else {
   digitalWrite(CALEFACCION,LOW);}
   
   
    if(HUMEDAD >=60){
   digitalWrite(ROCIO,HIGH);
   }
   else {
   digitalWrite(ROCIO,LOW);
   }
    
     }

Para que son esas variables Amanecer y atardecer ?

if (fecha.hour() == 2 && fecha.minute() == 39){
    Amanecer = true;
    atardecer = true;
}

Veo que tu rele esta en pin 9. Que tipo es y como esta conectado ?

las variables amanecer y atardecer son el inicio del periodo de luz, y el apagado, el pin 9 esta conectado a un modulo de 4 rele en el in4

Como verás he unido el hilo del terrario con este porque no se permite tener dos hilos abiertos del mismo tema.
Si me dices.. que no encontrabas tu hilo, se debe a que le cambie el nombre y porque se lo cambié? Porque tu titulo es lo que se considera un titulo INUTIL

Ayuda con mi código

Qué crees que siginifica Ayuda con mi código cuando hablas de automatizar un terrario? Pues usa este título.
Ahora si ya tienes un hilo abierto no puedes abrir otro.
La verdad me sorprende día a día la comodidad de la gente.
Pierde un hilo y no puede leer 3 o 4 títulos que no reconoce su propio nick!!

Lee las Normas del foro.

Respecto de tu problema, ya te han indicado como hacerlo asi que no daré mi opinión que es similar a la de Kike_gl pero con otro enfoque muy similar.

trozelva:
el pin 9 esta conectado a un modulo de 4 rele en el in4

Eso modulo tiene lo logica invertida. Un LOW acciona el rele y un HIGH lo apaga.