Configuración del Módulo RTC

Estoy haciendo un sistema de riego automático con el módulo rtc, un lcd y un módulo relé, todo va bien, pero al programar cuándo se enciende el relé, no sé como configurar los días, (la hora y los minutos si).
Aquí mi código:

#include <Wire.h> 
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
# define Rele 3
int tonePin = 10;

LiquidCrystal_I2C lcd(0x27,16,2);
RTC_DS1307 RTC;



void setup () {

   pinMode(Rele, OUTPUT);



lcd.init();
lcd.backlight();
lcd.clear();


Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicaci¢n con el RTC






Serial.begin(9600); // Establece la velocidad de datos del puerto serie
 lcd.init();
 lcd.backlight();
  lcd.clear();
  
}





void loop(){
  

 


DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
   

Serial.print(now.day(), DEC); // Dia
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.year(), DEC); // A§o
Serial.print(' ');
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');

Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.println();
lcd.setCursor(0,0);
lcd.print("Fecha: ");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.print("");
lcd.setCursor(0,1);
lcd.print("Hora: ");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
delay(1000); // La informaci¢n se actualiza cada 1 seg.
lcd.setCursor(0,0);
lcd.print("               ");
lcd.setCursor(0,1);
lcd.print("               ");



{
  digitalWrite(Rele, HIGH);
 DateTime fecha = RTC.now();				// funcion que devuelve fecha y horario en formato
							// DateTime y asigna a variable fecha
 if ( fecha.hour() == 23 && fecha.minute() == 30 ){	// si hora = 23 y minutos = 30


 
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("    Regado En");
 lcd.setCursor(0,1);
 lcd.print("   Proceso...");
 
    delay(1000);
    digitalWrite(Rele, LOW);				// activa modulo de rele con nivel alto
    delay(10000);
      
    }							
  }
 





 }





No estoy seguro si entiendo...
¿Quieres determinar el día de la semana?
¿Por ej. encender todos los domingos a las 23:30?

Puedes hacer algo así

if (fecha.dayOfTheWeek() == 0 && fecha.hour() == 23 && fecha.minute() == 30 ){	// si hora = 23 y minutos = 30
// dayOfTheWeek() devuelve 0 = dom, 1 = lun ... 6 = sáb.

vale, y para mostrar el día en el lcd ?

Declaras un array con el nombre de los días y lees el item que corresponda con el valor que devuelve dayOfTheWeek(), luego lo muestras en la LCD .

Ese comando aunque esta bien tiene el inconviente que activará lo que deba accionar en cada loop lo cual es una mala práctica.
Usa una variable o flag para que una vez que se accione no permita que vuelva a hacerlo.
Un flag es una variable booleana algo como

bool flag = false; // la defino inicialmente en falso
......
// luego en tu código cuando se cumpla

if (!flag) {
    if (fecha.dayOfTheWeek() == 0 && fecha.hour() == 23 && fecha.minute() == 30 ) {
      // acionas el rele.
      flag = true; // indicas que se ha accionado.
                          // por lo tanto ya no entrará nuevamente a este loop
    }
} 

Lo que se suele hacer es que cuando apagas el rele entonces reactivas el flag poniendolo nuevamente en false.

Y cómo quedaría la línea del código?

Fijate en el primer ejemplo

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