Timer On/Off ma quando si spegne e riaccende Arduino non riaccende Luce

Visto che hai già un timer basato sull’RTC io userei quello.

Vedi questa versione, dove oltre a qualche correzione (ad esempio non chiamare “Tono()” se non hai ancora inizializzato i pin!) ti ho anche tolto quelle Serial.print dell’orario sostituendole con una funzione che ti consiglio di guardare ;):

#include <DS3232RTC.h>
#include <SimpleDHT.h>
#include <DS3231.h>
#include <Wire.h>
#include <Time.h>
#include <RTClib.h>

SimpleDHT22 dht22(5);
RTC_DS3231 rtc;
Time t;

#define R_TEMP 2
#define R_UMID 3
#define R_LUCE 4
#define R_VENTILATORE 8
#define P_BUZZER 7

#define ACCESO LOW
#define SPENTO HIGH

#define ON_ORA 10   // ORA ACCENSIONE
#define ON_MIN 15   // MINUTI ACCENSIONE
#define OFF_ORA 10  // ORA SPEGNIMENTO
#define OFF_MIN 30  // MINUTI SPEGNIMENTO

// Variabili globali
int onTimer;
int offTimer;
int OraAttuale;
int OraPrec = -1;
int OraVent;

bool inOrario;   // indica che l'ora corrente è quella di accensione
bool VentInOrario;

unsigned long t1, t2;

void setup()
{
  Serial.begin(115200);
  pinMode(R_TEMP, OUTPUT);// PIN 2 OUTPUT
  pinMode(R_UMID, OUTPUT);// PIN 3 OUTPUT
  pinMode(R_LUCE, OUTPUT);// PIN 4 OUTPUT
  pinMode(R_VENTILATORE, OUTPUT);// PIN 8 OUTPUT
  pinMode(P_BUZZER, OUTPUT);// PIN 7 OUTPUT

  rtc.begin();  
  onTimer = ON_ORA * 60 + ON_MIN;
  offTimer = OFF_ORA * 60 + OFF_MIN;
  Tono();

  digitalWrite(R_TEMP, SPENTO); // IMPOSTO IL RELE' IN OFF DI DEFAULT
  digitalWrite(R_UMID, SPENTO); // IMPOSTO IL RELE' IN OFF DI DEFAULT
  digitalWrite(R_LUCE, SPENTO); // IMPOSTO IL RELE' IN OFF DI DEFAULT
  digitalWrite(R_VENTILATORE, SPENTO); // IMPOSTO IL RELE' IN OFF DI DEFAULT

}

void loop() {
  if (millis() - t1 >= 1000) {
    t1 = millis();
    Timer();
    Temperaturaumidita();
  }
  if (millis() - t2 >= 500) {
    t2 = millis();
    Flash();
  }
  if (tmrVent > 0 && millis() - tmrVent >=
}
void Flash() //Sistema in esecuzione
{
  digitalWrite(6, HIGH);
  delay(50);
  digitalWrite(6, LOW);
  delay(50);
}

char sTemp[9];
void printTime()
{
  sprintf(sTemp, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  Serial.println(sTemp);
}

void Timer()
{
  DateTime now = rtc.now();
  OraAttuale = now.hour() * 60 + now.minute();

  PrintTime();

  if ( OraAttuale != OraPrec ) {
    OraPrec = OraAttuale;
    // Determino se siamo nell'orario di accensione
    if (onTimer < offTimer)
      inOrario = (OraAttuale >= onTimer && OraAttuale < offTimer);
    else
      inOrario = (OraAttuale >= onTimer || OraAttuale < offTimer);
    // Verifico lo stato del relè
    // Se siamo in orario ed è spento, lo accendo
    if ( inOrario && digitalRead(R_LUCE) == SPENTO) {
      digitalWrite(R_LUCE, ACCESO);
      Serial.println("LUCE ON");
    }
    // Se non siamo in orario ed è acceso, lo spengo
    if ( !inOrario && digitalRead(R_LUCE) == ACCESO ) {
      digitalWrite(R_LUCE, SPENTO);
      Serial.println("LUCE OFF");
    }
    // Gestisco anche il ventilatore (1 ora ON 2 ore OFF,
    // quindi 1 ora ogni 3 a partire dalle 00:00)
    OraVent = now.hour() / 3;
    VentInOrario = (OraVent == now.hour());
    if ( VentInOrario && digitalRead(R_VENTILATORE) == SPENTO) {
      digitalWrite(R_VENTILATORE, ACCESO);
      Serial.println("VENTILATORE ON");
    }
    if ( !VentInOrario && digitalRead(R_VENTILATORE) == ACCESO ) {
      digitalWrite(R_VENTILATORE, SPENTO);
      Serial.println("VENTILATORE OFF");
    }
    
  }
}

void Temperaturaumidita()
{
  float temperature = 0;
  float humidity = 0;
  dht22.read2(&temperature, &humidity, NULL);
  Serial.print((float)temperature); Serial.print(" °C, ");
  Serial.print((float)humidity); Serial.println(" %");

  if (temperature >= 20) {
    digitalWrite(R_TEMP, ACCESO);
  }
  else {
    digitalWrite(R_TEMP, SPENTO);
  }
  if (humidity >= 90) {
    digitalWrite(R_UMID, ACCESO);
  } else {
    digitalWrite(R_UMID, SPENTO);
  }
}

void Tono()
{
  tone(P_BUZZER, 1000, 200);   //suona
  delay(2000);                 //aspetta 2 secondi
  noTone(P_BUZZER);            //non suona
  delay(1000);
}