orologio RTC per far accendere una lampadina?

Buongiorno, sono sempre quello del topic sui millis() e delay ecc ecc...

Voi mi avevate detto che per fare un programma come quello che avevo descritto (una lampadina che si deve accendere per ad esempio 1 ora, poi si deve spegnere 10 ore, poi si deve accendere 2 ore ecc) serviva un orologio RTC perchè usando delay si aveva un errore che si andava anche ad accumulare...

Ho già trovato le librerie per includere un rtc ad Arduino e gli schemi dei fili, il problema è che tutti i progetti che ho trovato su internet sono tutti volti a far funzionare l'orologio come semplice orologio, che indica ore, minuti e secondi, e niente di più :confused:

Non riesco a capire come dire all'Arduino che all'ora X dell'orologio la lampadina si deve accendere, e all'ora Y si deve spegnere ecc ecc!

rifaccio la domanda del mio vecchio post: E SE RIPIEGASSI SEMPLICEMENTE SUL DELAY? non sarebbe più semplice, senza orologi? grazie per la pazienza

Ciao Alessio,

il delay(), salvo casi specifici, è da evitare; per eseguire o mettere in pausa parti del programma per determinati periodi è consigliabile l'uso di millis().

La questione è...se quest'intervallo NON deve partire ad ore precise e NON deve durare un'eternità vada per millis()...esempio...se dopo aver pigiato un pulsante la lampadina deve rimanere accesa 1 minuto...ok millis().

se la tua lampadina deve accendersi ogni giorno, o in certi giorni, ad un'ora precisa e spegnersi ad un'altra ora precisa...meglio l'uso di un RTC...possibilmente quelli compensati tipo ds3231.

la libreria che stai utilizzando metterà a disposizione dei metodi tipo get.hour(); get.min() o cose del genere per accedere all'ora e al minuto attuali...per farla semplice...tu li metti in una bella if() con all'interno quello che vuoi fare.

Io ti avevo appunto suggerito di partire subito usando delay(). Non vedo il senso dello stare a fare supposizioni e seghe mentali standosene con le mani in mano, quando ci vuole poco a provare di persona, così sarai tu stesso in grado di valutare se quello che otterrai sarà soddisfacente o meno per i tuoi scopi. Io a quest'ora l'avrei già fatto!

sukkopera quindi delay o millis() come suggerisce ORSO2001?

La precisione, o meglio l’imprecisione, è identica, sia delay che millis si basano sullo stesso clock di sistema.

Se il programma deve fare una e una sola cosa delay è sufficiente e più semplice da usare.

Invece quando si vogliono fare più cose contemporaneamente si deve usare millis.

L’imprecisione dell’oscillatore si può ridurre costruendo una scheda standalone quarzata (come il vecchio Arduino2009), e allora le funzioni delay/millis diventano molto più precise.

Ma quando si vogliono realizzare dei tempi periodici si può anche accumulare un secondo errore/ritardo, cosa che avviene sicuramente con delay, ma anche con millis se si usa male la funzione (misure dell’errore)

Ora, tornando al topic, non ho capito se quello che serve è “accendere per X ore” oppure “accendere alle ore X”. Nel primo caso l’RTC può anche essere non regolato (basta calcolare la differenza tra due momenti), nel secondo invece va regolato con l’ora corrente (e bisogna verificare se si è arrivati al momento X).

Ad esempio si può far cambiare stato al LED on board ogni 10 ore esatte leggendo un RTC (anche non regolato) con la stessa filosofia di millis (la funzione secs ritorna il numero di secondi tra 0 e 86399):

#include  <Wire.h>


byte BCDbin(byte n){ 
    return (n >> 4)*10 + (n & 0x0F); 
}


long secs() {
    Wire.beginTransmission(0x68);           // indirizzo RTC
    Wire.write(0);                          // punta al registro 0
    Wire.endTransmission();
    Wire.requestFrom(0x68, 3);              // legge tre byte
    long sec = BCDbin(Wire.read());
    long min = BCDbin(Wire.read());
    long hou = BCDbin(Wire.read());
    return hou*3600 + min*60 + sec;         // ritorna secondi attuali
}


long t1;


void setup(){
    pinMode(13, OUTPUT);
    digitalWrite(13, 0);                    // LED on board spento
    Wire.begin();
    t1 = secs();                            // memorizza tempo iniziale
}


void loop(){
    long actualTime = secs();               // legge secondi attuali

    long elapsed = actualTime - t1;         // calcola tempo trascorso
    if (elapsed < 0) elapsed += 86400;      // aggiustamento overflow

    if (elapsed >= 36000){                  // se passate 10 ore
        t1 = (t1 + 36000) % 86400;          // aggiorna tempo iniziale
        digitalWrite(13, !digitalRead(13)); // inverte stato LED
    }
}

Fallo come vuoi, basta che ti metti a farlo, altrimenti non imparerai mai! Quando poi hai un problema vieni qua e ne parliamo!!!

sukkopera TRANQUILLLLLLO lo sto già facendo!!

Claudio_FF lo sketch che mi hai mandato serve per ciò che avevo chiesto giusto? grazie mille! Se ho capito bene, per mettere i tempi che voglio basta che cambio il valore in IF mettendoci tutte le volte un valore diverso giusto?

@ Guglielmo Se Alessio7894 usa una di quelle prese telecomandate interposta tra presa e spina non tocca i 230V e é a posto a livello impianto elettrico.

@ Alessio7894 Ci sono delle prese telecomandabili che sono con un piccolo trasmettitore che puoi prendere dal telecomando pilotabili da Arduino. Vedi libreria RCswitch esempio: http://www.sciamannalucio.it/arduino-comunicazione-wireless-433mhz/

Per la tempistica usa un orologio RTC il DS3231 é molto preciso (sbaglia qualche secondo al anno). Se Ti serve una precisione migliore sincronizza il RTC con una altra fonte di tempo come un modulo DCF77 (non funzina sempre; viene disturbato facilmene da qualsiasi apparecchio eletrico), un GPS (non funziona dentro casa) o un NTP (serve un accesso al internet con una scheda WiFi o Ethernet via cavo.) Ciao Uwe

Ciao, Prova a vedere qui https://forum.arduino.cc/index.php?topic=537556.msg3663543#msg3663543 Ieri un altro utente aveva un problema simile al tuo Magari unite gli sforzi e ottenete con meno fatica un risultato migliore

Dopo la fusione dei post ci ho messo un po a ricostruire la storia. Ma tu veramente da agosto ad adesso non ti sei nemmeno cavato il dubbio se arduino sta acceso così a lungo? Non dico comperare un rtc, che adesso avresti pronto, ma almeno tenere acceso arduino. Lascia stare, cambia passatempo, troppo sforzo per troppo poco risultato, dai retta...