-RISOLTO - Luci esterne ad accensione oraria e sensore di movimento.

Buongiorno a tutti!
premetto di essere alle prime armi, mi diletto a riprodurre sketch e progetti già esistenti per prendere dimestichezza con il sistema, ma adesso mi è venuta una necessità, accendere le luci esterne ad un determinato orario es. dalle 18:00 alle 01:00 e successivamente dalle 01:00 alle 01:04 tramite sensore PIR (per risparmiare un po), ho provato degli sketch trovati in rete ma sono settimane che ci sbatto la testa senza risultato! sono in possesso di una UNO r3, modulo relè, modulo PIR, moduli ds1302, ds1307 e ds3231, spero che qualcuno mi possa aiutare indicandomi magari uno sketch di partenza da adattare o simili. Ciao

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Cioè solo in quelle fascie il pir è attivo ? Se il pir rileva qualcosa fuori da quelle fasce orarie non deve accendere la luce ?

P.S. che senso ha la fascia oraria 01:00 alle 01:04 ? 4 minuti ??

hops! scusate errore di battitura! "successivamente dalle 01:00 alle 04:00 con sensore di movimento PIR" poichè è una fascia oraria, diciamo "morta", può capitare in modo sporadico di rientrare a casa in quella fascia oraria quindi è inutile tenerle accese.

Premesso che con un semplice Timer ed un sensore PIR per accensione lampade entrambi funzionanti a 230Vac risolveresti il problema, con Arduino ed i componenti in tuo possesso puoi farlo.

Ha ragione nid quando dice che il secondo confronto è inutile.

Dopo le ore 1.00 entra in funzione il PIR e rimane attivo (cioè accende la luce solo in presenza di una persona per, diciamo, 5 minuti) sino alle ore 18.00 in cui, invece, le luci si accendono fisse.

Tuttavia, consiglio di usare una fotoresistenza per determinare la condizione di buio, risparmiando così accensioni inutili ed eliminando lo RTC.

infatti, pensavo che pure il sensore di luminosità sia inutile dato che dopo le 04:00 tutto il sistema deve restare inattivo, e riaccendere le luci alle 18:00 successive. Penso che questo circuito possa tornare utile a molte persone, aggiungo che con il solo Timer non posso avere la stessa flessibilità, compattezza dell'arduino. Riflettendoci (es. ) con il timer accendo le luci dalle 18:00 alle 01:00 poi un'altro Timer accende il PIR per la seconda fascia di funzionamento?

Se usi Arduino, prima di tutto trasformare le ore/minuti in un numero unico, con semplice moltiplicazione:
18:00 => 18100+00 => 1800
01:30 => 01
100+30 => 0130
In questo modo è semplice fare i test nelle if

int adesso=rtc.Hour*100+rtc.Minutes;
if( (adesso>=1800 && adesso<=2359) || adesso<=0100)  {  // tra 18:00-2359 o fino a 1:00

nid69ita:
Se usi Arduino, prima di tutto trasformare le ore/minuti in un numero unico, con semplice moltiplicazione:
18:00 => 18100+00 => 1800
01:30 => 01
100+30 => 0130
In questo modo è semplice fare i test nelle if

int adesso=rtc.Hour*100+rtc.Minutes;

if( (adesso>=1800 && adesso<=2359) || adesso<=0100)  {  // tra 18:00-2359 o fino a 1:00

Direi che é meglio contare i minuti e non creare un centesimo di ora.

18:00 => 1860+00 = 1080
17:58 => 17
60+58 = 1078

Il vantaggio é se vuoi lasciarlo acceso per 5 minuti allora l' orario é 1078 fino a 1083 e non devi controllare se c'é un overflow dei minuti come nel Tuo esempio.

Ciao Uwe

ottimo, grazie, questo può essere il punto di partenza sulla struttura del listato. Quindi successivamente alla stringa suggerita da voi, indicherò: che se l'ora attuale è all'interno di questo range (18:00 - 01:00) il relè sarà attivo quindi HIGH. Quello che in queste settimane mi ha fatto scervellare è che non sono riuscito a scrivere la stringa del PIR, cioè la funzione "if" se il PIR è HIGH nella fascia oraria ben precisa ed in questo caso sarebbe dalle ore 01:00 alle ore 04:00, ho scandagliato tutti i forum e siti (in tutte le lingue) senza mai trovare nulla che facesse al mio caso!!!

uwefed:
Direi che é meglio contare i minuti e non creare un centesimo di ora.

Se non devi fare calcoli ma solo confronti (lo uso da anni in gestione database), è più pratico (almeno per me) moltiplicare per 100, le costanti sono leggibili 17:58 => 1758 contro 1078
Inoltre è solo una conversione momentanea, il timer è dato dell'RTC, non devi preoccuparti di nessun overflow.

Buongiorno, cosa non va? qualcuno potrebbe dare un'occhiata ho fatto un po di copia incolla...

int Hon;
int Hoff;
int Hmin1;
int Hon1;
int Hoff1;
DateTime now;

void setup () {
Serial.begin(9600);
Wire.begin();
rtc.begin();
pinMode(2, OUTPUT);

pinMode(7, INPUT);
digitalWrite(2, LOW);

Hon=01; // accensione con PIR
Hoff=04; //spegnimento con PIR
Hon1=19; // accensione FISSA
Hoff1=01; // spegnimento da FISSA
}
void loop () {
if(millis()-tt > 3000){
now = rtc.now();
Hmin = now.hour();
tt = millis();
}
int pir = digitalRead(7);
if (pir || Hmin >= Hon || Hmin <= Hoff ) {
digitalWrite(2, HIGH);
time = millis();
}
else if (!pir && (millis()-time > 2000)){
digitalWrite(2, LOW);
}

if( (Hmin1 >=Hon1 && Hmin1<= Hoff1) )  { 
digitalWrite(2, HIGH);
}
else{
digitalWrite(2, LOW); 
}



}

Ciao a tutti dopo aver perso tante nottate al PC, sono riuscito a sviluppare lo sketch che mi serviva, se può essere di utilità a qualcuno, questo semplice progettino permette, come nel mio caso di accendere le luci del viale di ingresso di casa in due fasi es. (I° fase) dalle ore 18:00 alle ore 01:00 in modo fisso, (II° fase) dalle successive ore 01:00 alle ore 04:00 solo al passaggio e/o movimento di persone, questo per risparmiare un po di energia elettrica, poichè a mio avviso non ha senso che il viale rimanga acceso inutilmente di notte a meno che io non rientri in casa a quell'ora o degli ospiti vanno via.
vi allego lo sketch ed una foto del materiale utilizzato:

#include <Wire.h>
#include "RTClib.h"
#define RELAY_PIN 2

RTC_DS1307 RTC;

void setup() {
  
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();  
  pinMode(7, INPUT);
  pinMode(RELAY_PIN, OUTPUT);
 }

void loop() {
  DateTime now = RTC.now();
  int nowHourMinute = now.hour() * 100 + now.minute();

      if(nowHourMinute > 1800 && nowHourMinute < 0100) {  // ORARIO ACCENSIONE FISSA
        digitalWrite(RELAY_PIN, HIGH);
    delay (1000);
      }
   else if(nowHourMinute == 0100) {
       digitalWrite(RELAY_PIN, LOW);
   }    
     int pir = digitalRead(7);
      if((pir == HIGH) && (nowHourMinute > 0100 && nowHourMinute < 0400)) {  //ORARIO ACCENSIONE A MOVIMENTO
  
        digitalWrite(RELAY_PIN, HIGH);
    delay(10000);
          }
   else if(pir == LOW);
    digitalWrite(RELAY_PIN, LOW);

     }

Ciao gojonny71, sono un utente alle primissime armi con arduino, il tuo sketch risolverebbe a pieno una delle problematiche che vorrei affrontare con arduino.
Mi chiedevo se è stato considerato e qualora non lo fosse come risolvere il problema dell'ora legale.
Per quel poco che ne posso capire credo che tramite questo sketch ad ogni cambio di ora legale o solare si dovrebbe riprogrammare l'arduino.
C'è la possibilità di far si che in maniera automatica al cambio dell'ora il sistema riesca ad aggiornarsi da solo?