Buon pomeriggio a tutti!!!
Mi chiedevo se esistesse un modo per far sì che l'arduino si ricordi il suo ultimo stato dopo un eventuale blackout!!!
Qualcuno sa se è possibile???
Grazie a tutti
Buon pomeriggio a tutti!!!
Mi chiedevo se esistesse un modo per far sì che l'arduino si ricordi il suo ultimo stato dopo un eventuale blackout!!!
Qualcuno sa se è possibile???
Grazie a tutti
fikkiovarrikkio:
Qualcuno sa se è possibile???
Solo se prevedi un piccolo gruppo di continuità per dare il tempo ad Arduino di salvare il suo stato sulla EEPROM, spazio permettendo, il software deve prevedere questa possibilità sia come backup che ripristino dei dati alla ripartenza.
Oppure, prima di fare qualsiasi cosa, scrivi sulla EEPROM e poi leggi dalla EEPROM.
Ma la EEPROM può fare un certo numero di letture-scritture, almeno credo.
voglio portare LOW il 12
scrivo 0 nella cella 12
ad ogni loop:
leggo il contenuto della cella 12 e porto il 12 allo stato corrispondente
Ma mi chiedo quanto possa durare.
paulus1969:
Ma la EEPROM può fare un certo numero di letture-scritture, almeno credo.
Circa 100.000 cicli.
Ecco, grazie!
Puoi prendere anche dei FRAM esterni oppure un RTC con memoria non volatile. IL DS1307 ha 56 Byte di RAM.
Ciao Uwe
IL DS1307 ha 56 Byte di RAM.
Il modello Tiny RTC ha anche una EEPROM seriale aggiuntiva da 4KB.
voglio portare LOW il 12
scrivo 0 nella cella 12
ad ogni loop:
leggo il contenuto della cella 12 e porto il 12 allo stato corrispondente
Non è proprio chiarissimo come esempio :S non esiste da qualche parte un codice d'esempio da poter studiare???
Circa 100.000 cicli.
a quanto corrispondono in maniera quantitativa 100.000 cicli? dopo di che bisogna resettare l'arduino affinchè torni questa possibilità???
Puoi prendere anche dei FRAM esterni oppure un RTC con memoria non volatile. IL DS1307 ha 56 Byte di RAM.
Aggiungendo semplicemente uno di questi moduli avrei una "memoria" aggiuntiva da poter sfruttare in qualsiasi modo io voglia ???
Grazie a tutti per le risposte =)
io scrivevo nella eeprom come ti ha spiegato paulus, poi mi son posto il dubbio del numero di cicli.
Puoi anche prevedere una scheda SD, boh, dipende da cosa fa e a cosa serve la tua applicazione.
CC88:
dipende da cosa fa e a cosa serve la tua applicazione.
Infatti senza sapere esattamente cosa deve fare, le condizioni d'uso, cosa intende per blackout, etc, siamo nel campo delle ipotesi ed è solo tempo perso.
ok mi spiego meglio.
Mettiamo caso voglio comandare una luce di casa mia attraverso l'arduino.
Adesso, se mentre la luce sta accesa se ne va via la corrente per un po, quando torna l'arduino riparte ad uno stato iniziale in cui la luce risulta spenta, invece a me serve che quando torna la corrente la luce resti nello stato in cui stava prima del blackout, nel caso in esempio per l'appunto accesa!!!
Questo è lo sketch tipo che utilizzo per una led:
byte Bottone = 3;
byte Luce = 6;
byte statoLed;
byte val;
byte vecchio;
void setup(){
pinMode( Bottone, INPUT );
pinMode( Luce, OUTPUT );
}
void loop(){
val = digitalRead(Bottone);
if (val == HIGH && (vecchio == LOW)){
statoLed = 1 - statoLed;
delay (15);
}
vecchio = val;
if (statoLed == 1){
digitalWrite(Luce, HIGH);
}
else {
digitalWrite(Luce, LOW);
}
}
è possibile fare questa cosa ?
fikkiovarrikkio:
Circa 100.000 cicli.
a quanto corrispondono in maniera quantitativa 100.000 cicli? dopo di che bisogna resettare l'arduino affinchè torni questa possibilità???
I cicli di lettura7scrittura massima sono assoluti, non è che resettando tornano disponibili, dopo un certo numero di letture/scritture la cella di memoria arriva al termine della sua vita utile, quindi non è che è possibile leggere/scrivere ad ogni ciclo di loop (ad esempio) perchè uccideresti la cella in pochissimo tempo, diverso è se vai a leggere/scrivere solo quando è necessario (power down, power up di arduino) ma anche qui dipende molto da quante volte e in quanto tempo questi eventi si manifestano, ad esempio se l'alimentazione va giù ogni anno allora il problema non sussite, se va giù 5 volte al minuti allora non è una soluzione percorribile.
Per l'esempio che hai fatto tu dovresti memorizzare ao ogni accensione spegnimento della luce e quindi la scrittura nella memoria interna è sicuramente da scartare
fikkiovarrikkio:
Adesso, se mentre la luce sta accesa se ne va via la corrente per un po, quando torna l'arduino riparte ad uno stato iniziale in cui la luce risulta spenta, invece a me serve che quando torna la corrente la luce resti nello stato in cui stava prima del blackout, nel caso in esempio per l'appunto accesa!!!
Dato che al massimo accendi e spegni la luce 20 volte al giorno, e sto esagerando, basta che salvi lo stato sulla EEPROM ogni volta che cambia, prima che finisci la vita utile della EEPROM ci vogliono oltre 13 anni, se poi usi la EEPROM ruotando le locazioni, in modo da non scrivere sempre sulla stessa, ti dura di più della vita stessa di un ATmega 328.
Dato che al massimo accendi e spegni la luce 20 volte al giorno, e sto esagerando, basta che salvi lo stato sulla EEPROM ogni volta che cambia, prima che finisci la vita utile della EEPROM ci vogliono oltre 13 anni, se poi usi la EEPROM ruotando le locazioni, in modo da non scrivere sempre sulla stessa, ti dura di più della vita stessa di un ATmega 328.
E se le luci in questione diventano 16?
Inoltre puoi indicarmi dove posso studiare questa cosa dato che ci sto appronciando ora??? Grazie mille =)
fikkiovarrikkio:
E se le luci in questione diventano 16?
I casi sono due, o dici esattamente quello che devi fare e, forse (non siamo un servizio assistenza), ti viene data una soluzione, oppure continui a dare le informazioni col contagocce e, sicuramente, non riceverai nessun aiuto concreto.
fikkiovarrikkio:
ok mi spiego meglio.
Mettiamo caso voglio comandare una luce di casa mia attraverso l'arduino.
Adesso, se mentre la luce sta accesa se ne va via la corrente per un po, quando torna l'arduino riparte ad uno stato iniziale in cui la luce risulta spenta, invece a me serve che quando torna la corrente la luce resti nello stato in cui stava prima del blackout, nel caso in esempio per l'appunto accesa!!!
A me stà cosa non convince. Se va via la luce in tutta la casa, anche i rele si spengono, se non sono bistabili/latched.
o dici esattamente quello che devi fare
devo fare esattamente quello che ti ho detto, imparare a gestire questa situazione XD
lo sketch diventerà qualcosa del genere
byte Bottoni[16] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37};
byte Luci[16] = {38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53};
byte statoLed[16];
byte val[16];
byte vecchio[16];
void setup(){
for (byte i = 0; i < 16 ; i++){
pinMode( Bottoni[i], INPUT );
pinMode( Luci[i], OUTPUT );
}
}
void loop(){
for(byte i = 0; i < 16; i++) {
val[i] = digitalRead(Bottoni[i]);
if (val[i] == HIGH && (vecchio[i] == LOW)){
statoLed[i] = 1 - statoLed[i];
delay (15);
}
vecchio[i] = val[i];
if (statoLed[i] == 1){
digitalWrite(Luci[i], HIGH);
}
else {
digitalWrite(Luci[i], LOW);
}
}
}
ed io devo fare in modo che se ad esempio le luci 38 e 39 sono accese quando va via la corrente, quando questa torna l'arduino si ricorda che le luci 38 e 39 sono accese e quindi risultano accese!
A me stà cosa non convince. Se va via la luce in tutta la casa, anche i rele si spengono, se non sono bistabili/latched.
I relè sono stimolati dall'arduino stesso, quindi quando torna la corrente se l'arduino ricorda le uscite accese automaticamente accende anche i relè !
fabpolli:
I cicli di lettura7scrittura massima sono assoluti, non è che resettando tornano disponibili, dopo un certo numero di letture/scritture la cella di memoria arriva al termine della sua vita utile, quindi non è che è possibile leggere/scrivere ad ogni ciclo di loop (ad esempio) perchè uccideresti la cella in pochissimo tempo, diverso è se vai a leggere/scrivere solo quando è necessario (power down, power up di arduino) ma anche qui dipende molto da quante volte e in quanto tempo questi eventi si manifestano, ad esempio se l'alimentazione va giù ogni anno allora il problema non sussite, se va giù 5 volte al minuti allora non è una soluzione percorribile.
Per l'esempio che hai fatto tu dovresti memorizzare ao ogni accensione spegnimento della luce e quindi la scrittura nella memoria interna è sicuramente da scartare
non so come mai mi era sfuggito il tuo commento! molto molto interessante! Mi spieghi qual'è la differenza tra il "power down, power up di arduino" ed un eventuale blackout??? cioè a me interessa che scrive solo quando è necessario .... astrobeed
suggeriva un gruppo di continuità per dare la possibilità nel caso di un blackout all'arduino di salvare in memoria lo stato ... non potrebbe essere una valida alternativa x non uccidere troppo velocemente la memoria ???
Ciao, non so se è il tuo caso ma in questo post Pilotare relay 24VAC da arduino - Hardware - Arduino Forum ho chiesto informazioni per pilotare dei relè esterni a 24V AC che sono di tipo passo passo per fare più o meno ciò che vuoi fare tu, ovvero comandarli da arduino.
Nel mio caso voglio comandarli "anche" da arduino, nel senso che i relè verranno pilotati da normali pulsanti da parete e anche da arduino, secondo me è una soluzione migliore perchè in caso di "hardware failure" l'impianto di casa continua a funzionare regolarmente semplicemente escludendo la parte domotica.
Nel post segnalato sopra ho riportato il solo schema che pilota le uscite, in realtà sto pensando di utilizzare relè passo passo a doppio scambio NO, uno pilota l'utenza, l'altro (alimentato in bassa tensione 24VAC o 5V CC non ho ancora ben chiaro cosa sia meglio) verrà utilizzato in modo tale da permettere ad arduino di sapere lo stato dell'utenza (accesa/spenta) a prescindere da assenze di tensione, interventi dell'utente o di arduino stesso sul relè.
Magari tu hai già l'impianto e non puoi permetterti una soluzione del genere o preferisci un'altra soluzione totalmente pilotata dal software/hardware.
Per il commento precedente intendevo dire che se scrivi ad ogni cambio di stato la uccidi sicuramente più velocemente (secondo i calcoli di astrobeed circa 13 anni che è comunque in buon tempo di vita) che non andando a scrivere solo quando manca corrente e quindi arduino si spegne. In questo caso come ti hanno consigliato occorre prevedere un piccolo gruppo di continuità che permetta ad arduino di restare acceso per il tempo necessario a completare le scritture