Attivazione rele' in funzione di range di temperatura e fasce orarie diverse

// accensione e spegnimento due rele in funzione della temperatura e umidita'
#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define TEMP 7  //originale
#define HUM 8   //originale
 DHT dht(2, DHT22);
int Vala = 27;//temperatura minima rele attivo(25 circa)
int Valb = 30;//temperatura max rele disattivo(31 circa) 

LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <RTClib.h>
RTC_DS3231 rtc;  

void setup() {
  Serial.begin(9600);
  dht.begin();
  lcd.init();
  lcd.backlight();
  pinMode(TEMP, OUTPUT);  //originale
  pinMode(HUM, OUTPUT);   //originale
  rtc.begin();
  // Avvio sensore DHT22
  dht.begin();

  if (rtc.lostPower()) {
    rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));
  }
  lcd.init();
  lcd.backlight();
  lcd.clear();
}

void loop() {
 // Lettura umiditĂ  e temperatura del sensore DHT22
  int h = dht.readHumidity();
  int t = dht.readTemperature();

 // Misura la temperatura e se minore di tot gradi attiva relè per accendere il riscaldatore
  if (t <= Vala)                 //impostare temperatura di partenza minore o uguale
    digitalWrite(TEMP, HIGH);  // Attiva Relè 1 temperatura
  else if (t > Valb)
digitalWrite(TEMP, LOW);  // Spegni Relè 1

  // Misura umidita' e se minore di tot gradi attiva relè per accendere l'umidificatore
  if (h <= 70)                //imposta umidita minore o uguale
    digitalWrite(HUM, HIGH);  // Attiva Relè 2 umidita
  else if (h > 90)
    digitalWrite(HUM, LOW);  // Spegni Relè 2


  Serial.print("Temp: ");
  Serial.print(t);
  Serial.print("C, Umid: ");
  Serial.print(h);
  Serial.println("%");


  // impostare cursore sulla quarta riga:
  lcd.setCursor(3, 7);
  lcd.print("TEMP: ");
  lcd.print(t);
  lcd.print("C");

  // imposta cursore sulla terza riga:
  lcd.setCursor(2, 2);
  lcd.print(" Umid: ");
  lcd.print(h);
  lcd.print("%"); 
  DateTime now = rtc.now();
  
 printDateTime(now);
  delay(1000);
}
void printDateTime(DateTime dt) {
  char dateBuffer[] = "  DD/MM/YYYY";
  char timeBuffer[] = "   hh:mm:ss";
  
  lcd.setCursor(1, 1);
  lcd.print(dt.toString(timeBuffer));
  lcd.setCursor(0, 0);
  lcd.print(dt.toString(dateBuffer));
}


salve volevo chiedere aiuto per questo programma.
questo programma funziona tutto per come' attiva e disattiva due rele' in funzione della temperatura e umidita' prendendo informazioni da un dht22 collegato sul pin 2 e comanda 2 rele' a 5v collegati ai pin 7 e 8 per l'orologio ho usato un ds3231 un display hd44780 20x4 collegato con modulo I2C collegato in parallelo sui pin sda e scl di arduino la scheda che utilizzo e' un arduino mega 2650.
Vorrei far attivare il rele' della temperatura con due fasce orarie diverse e parametri di temperatura diverse usando la referenza switch..case.
Es: voglio comandare il rele' 1 dalle ore 8:30 alle 20:00 con valori di temperatura compresi tra 21 e 25 gradi e dalle 20:01 alle 8:29 con valori di temperatura compresi tra i 27 e 31 gradi.
Non so' come prendere l'orario dall'rtc e creare la variabile da inserire nello switch
se utilizzassi
ES:
switch (variabile) //qui la variabile magica :slight_smile:
case 1
if (t <= Vala) //impostare temperatura di partenza minore o uguale
digitalWrite(TEMP, HIGH); // Attiva Relè 1 temperatura
else if (t > Valb)
digitalWrite(TEMP, LOW); // Spegni Relè 1
break;
case 2
if (t <= Valc) //impostare temperatura di partenza minore o uguale
digitalWrite(TEMP, HIGH); // Attiva Relè 1 temperatura
else if (t > Vald)
digitalWrite(TEMP, LOW); // Spegni Relè 1
break;
creando altre due vatiabili
int Valc = 21;//temperatura minima rele attivo
int Vald = 25;//temperatura max rele disattivo
ma non so' come integrare le fasce orarie dall'RTC
se qualcuno mi puo' dare indicazione perche' ho cercato in lungo e in largo sul manuale arduino sul forum video vari ma niente non so proprio come muovermi
ringrazio anticipatamente per qualche dritta.

Ciao, sistema il post inserendo anche la seconda parte di codice tra i tag <code> grazie!
Venendo alla tua richiesta ti consiglio di ragionare in modo separato, in una sezione di codice verifichi le temperature se sono nella soglia per attivare il rele o fuori per disattivarlo.
In un altra sezione verifichi se se entro o fuori certi range temporali e li, in base a che ore sono, imposti le due variabili di soglia in base alle temperature desiderate

1 Like

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