Rtc para dia y noche

Buenas tardes a todos! Modifique mi codigo asistiendome con chatgpt. La logica del codigo tendria que ser la siguiente: que lea temperatura y humedad y en base a los parametros que le seteo prenda o apague los distintos dispositivos que correspondan. Ademas al agregarle el RTC quiero que diferencie entre dia y noche, asi puedo setear parametros distintos para ambas situaciones. Y me muestre la temperatura y humedad en la pantalla led constantemente.

Queria que me den su opinion y/o correcion para el codigo.

#include <DHT.h>
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
DS3231 rtc;

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Dirección I2C, columnas y filas del LCD

// Valores de temperatura y humedad mínimos y máximos para el día y la noche
float tempMinDia = 24.0;  // Temperatura mínima durante el día
float tempMaxDia = 26.0;  // Temperatura máxima durante el día
float humMinDia = 55.0;   // Humedad mínima durante el día
float humMaxDia = 70.0;   // Humedad máxima durante el día

float tempMinNoche = 20.0;  // Temperatura mínima durante la noche
float tempMaxNoche = 24.0;  // Temperatura máxima durante la noche
float humMinNoche = 50.0;   // Humedad mínima durante la noche
float humMaxNoche = 65.0;   // Humedad máxima durante la noche

// Define el intervalo de tiempo para la lectura de sensores (9 segundos)
unsigned long previousMillis = 0;
const unsigned long interval = 9000; // Intervalo de 9 segundos

// Define el intervalo de tiempo para el día
int horaDiaInicio = 7;    // Hora de inicio del día (7:00 AM)
int horaDiaFin = 20;      // Hora de finalización del día (8:00 PM)

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
  setupRelay();
  rtc.begin();
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // Ajusta la hora y la fecha una vez
}

void loop() {
  DateTime now = rtc.now();
  int currentHour = now.hour();

  // Comprueba si es de día o de noche
  if (currentHour >= horaDiaInicio && currentHour < horaDiaFin) {
    // Valores diurnos
    controlDevices(tempMinDia, tempMaxDia, humMinDia, humMaxDia);
  } else {
    // Valores nocturnos
    controlDevices(tempMinNoche, tempMaxNoche, humMinNoche, humMaxNoche);
  }
  // Realiza la lectura de sensores y control de dispositivos
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();
    controlDevices(temperature, temperature, humidity, humidity); 
    showTemperatureAndHumidity(temperature, humidity);
  }
}

void setupRelay() {
  pinMode(8, OUTPUT); // Pin IN1 (caloventor)
  pinMode(9, OUTPUT); // Pin IN4 (extractor)
  pinMode(10, OUTPUT); // Pin IN6 (humificador)
  pinMode(11, OUTPUT); // Pin IN8 (intractor)
}

void controlDevices(float minTemp, float maxTemp, float minHumidity, float maxHumidity) {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  Serial.print("Temperature: ");
  Serial.println(temperature);

  Serial.print("Humidity: ");
  Serial.println(humidity);

  // Controlar caloventor
  if (temperature < minTemp) {
    Serial.println("Encendiendo caloventor");
    digitalWrite(8, LOW);
  } else if (temperature > maxTemp) {
    Serial.println("Apagando caloventor");
    digitalWrite(8, HIGH);
  }

  // Controlar extractor
  if (temperature > maxTemp) {
    Serial.println("Encendiendo extractor");
    digitalWrite(9, LOW);
  } else {
    Serial.println("Apagando extractor");
    digitalWrite(9, HIGH);
  }

  // Controlar humificador
  if (humidity < minHumidity) {
    Serial.println("Encendiendo humificador");
    digitalWrite(10, LOW);
  } else {
    Serial.println("Apagando humificador");
    digitalWrite(10, HIGH);
  }

  // Controlar intractor
  if (humidity > maxHumidity) {
    Serial.println("Encendiendo intractor");
    digitalWrite(11, LOW);
  } else {
    Serial.println("Apagando intractor");
    digitalWrite(11, HIGH);
  }
}

void showTemperatureAndHumidity(float temp, float hum) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print(hum);
}

cada vez que el Arduino se reinicie o se resetee esta instrucción le va a poner al RTC la hora en que el programa fue compilado.

Debes subir al programa a la placa, y después comentar la instruccion y volver a subir el programa de modo que no se vuelva a ejecutar.

—-

Esto no tiene sentido. Hay que hacer algunos cambios aquí.

Estimado @Rionoh, ¿Un RTC para saber si es de día o de noche ?, recuerda que la longitud de los días cambian a lo largo de las estaciones. ¿Vas ha estar cambiando y compilando:

int horaDiaInicio = 7;  
int horaDiaFin = 20;  

cada un puñado de días?.
Piensa mejor en una LDR que te detecte automáticamente la luz diurna cuando llegue.

Perfecto! voy a hacer eso.

Ahi lo cambie: que dices?

  // Realiza la lectura de sensores y control de dispositivos
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();
    controlDevices(temperature, humidity);
    showTemperatureAndHumidity(temperature, humidity);

Si! porque no llega luz natural donde lo tengo armado. Voy a cambiarle manualmente con el cambio de estaciones

Tienes internet en el lugar que mencionas?

Asi sin el resto del loop no lo veo claro.

En fin que se le va ha hacer. he toqueteado un poco tu código. He cambiado la librería del RTC porque esa no me gusta, (manías que tiene uno) y daba un error al compilar, he modificado el conteo por millis a uno un poco mas exacto. Los "if" de la función "controlDevices" no los he mirado revísalos tu que sabes lo que hacen. Estúdialo, pruébalo y me cuentas.

#include <DHT.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Dirección I2C, columnas y filas del LCD

// Valores de temperatura y humedad mínimos y máximos para el día y la noche
float tempMinDia = 24.0;  // Temperatura mínima durante el día
float tempMaxDia = 26.0;  // Temperatura máxima durante el día
float humMinDia = 55.0;   // Humedad mínima durante el día
float humMaxDia = 70.0;   // Humedad máxima durante el día

float tempMinNoche = 20.0;  // Temperatura mínima durante la noche
float tempMaxNoche = 24.0;  // Temperatura máxima durante la noche
float humMinNoche = 50.0;   // Humedad mínima durante la noche
float humMaxNoche = 65.0;   // Humedad máxima durante la noche

float temperature, humidity;

// Define el intervalo de tiempo para la lectura de sensores (9 segundos)
unsigned long proximo_M;
const unsigned long interval = 9000; // Intervalo de 9 segundos

// Define el intervalo de tiempo para el día
int horaDiaInicio = 7;    // Hora de inicio del día (7:00 AM)
int horaDiaFin = 20;      // Hora de finalización del día (8:00 PM)

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
  pinMode(8, OUTPUT); // Pin IN1 (caloventor)
  pinMode(9, OUTPUT); // Pin IN4 (extractor)
  pinMode(10, OUTPUT); // Pin IN6 (humificador)
  pinMode(11, OUTPUT); // Pin IN8 (intractor)

  // Inicializacion del reloj.
  if (!rtc.begin()) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("   No-Rtc");
    lcd.setCursor(0, 1);
    lcd.print("Revisa conexion");
    Serial.println("No-Rtc");
    Serial.println("Revisa conexion");
    while (1);
  }
  if (rtc.lostPower()) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("   No-Bateria");
    lcd.setCursor(0, 1);
    lcd.print("Cambia bateria");
    Serial.println("No-Bateria");
    Serial.println("Cambia bateria");
    delay (3000);
  }
  //no se necesita la salida de  32K del RTC, la desabilitamos.
  rtc.disable32K();

  // Ajusta la hora y la fecha una vez
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  // Primera marca de tiempo
  proximo_M = millis () + interval;
}


void loop() {
  // imprime la lectura de sensores cada 250 mseg.
  delay (250);
  lecturas ();

  // Realiza la lectura de sensores y control de dispositivos cada interval seg.

  if (millis() >=  proximo_M) {

    //Actualiza nueva marca de tiempo
    proximo_M += interval;

    // Comprueba si es de día o de noche
    DateTime now = rtc.now();
    int currentHour = now.hour();

    if (currentHour >= horaDiaInicio && currentHour < horaDiaFin) {
      // Valores diurnos
      controlDevices(tempMinDia, tempMaxDia, humMinDia, humMaxDia);
    } else {
      // Valores nocturnos
      controlDevices(tempMinNoche, tempMaxNoche, humMinNoche, humMaxNoche);
    }
  }
}

void lecturas () {
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();
  showTemperatureAndHumidity(temperature, humidity);
}


void controlDevices(float minTemp, float maxTemp, float minHumidity, float maxHumidity) {
  lecturas ();

  // Controlar caloventor
  if (temperature < minTemp) {
    Serial.println("Encendiendo caloventor");
    digitalWrite(8, LOW);
  } else if (temperature > maxTemp) {
    Serial.println("Apagando caloventor");
    digitalWrite(8, HIGH);
  }

  // Controlar extractor
  if (temperature > maxTemp) {
    Serial.println("Encendiendo extractor");
    digitalWrite(9, LOW);
  } else {
    Serial.println("Apagando extractor");
    digitalWrite(9, HIGH);
  }

  // Controlar humificador
  if (humidity < minHumidity) {
    Serial.println("Encendiendo humificador");
    digitalWrite(10, LOW);
  } else {
    Serial.println("Apagando humificador");
    digitalWrite(10, HIGH);
  }

  // Controlar intractor
  if (humidity > maxHumidity) {
    Serial.println("Encendiendo intractor");
    digitalWrite(11, LOW);
  } else {
    Serial.println("Apagando intractor");
    digitalWrite(11, HIGH);
  }
}

void showTemperatureAndHumidity(float temp, float hum) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.setCursor(0, 1);
  lcd.print("Humedad: ");
  lcd.print(hum);

  Serial.print("Temperature: ");
  Serial.println(temp);
  Serial.print("Humidity: ");
  Serial.println(hum);
}

No! pense en su momento la forma de que le llegue internet pero el wifi no llega.

Voy a modificarlo y probarlo! gracias por la ayuda. Use millis antes que delay porque este ultimo interfiere con el buen funcionamiento de los rele

Para saber si es de dia o de noche puedes usar la librería dusk2dawn, basandose en la fecha y la posicion GPS te da la hora en la que sale y se pone el sol.

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