Sleep Arduino

Ciao a tutti,

ho un arduino standalone a 8mhz senza quarzo esterno.

Per le operazioni che deve fare, deve rilevare un segnale , fare un operazione e poi puo' spegnersi per 5 ore, riattivarsi e mettersi in attesa.

In alternativa, se esiste il modo, lo farei risvegliare tramite crepuscolare , ovvero si risveglia a determinati valori e va in sleep ad altri.

Quale soluzione e' fattibile senza componenti esterni?

Grazie

Da programma puoi mettere Arduino a "dormire", ma occorre un evento esterno per risvegliarlo.

Il crepuscolare può essere una soluzione.

come dice cyberhs devi usare un interrupt per farlo risvegliare, compiere quel che deve e poi tornare a dormire fino al successivo interrupt

Oltre al crepuscolare, per il risveglio potresti usare un NE555 od un altro timer in configurazione monostabile: con un impulso lo fai partire, metti a dormire Arduino e quando termina il ciclo del timer (5 ore) l'uscita attiva l'ingresso digitale di Arduino sotto interrupt per il risveglio.

Io utilizzo un pcf8653 come rtc per fare ciò. Ho avuto la necessità di far svegliare arduino 8 volte al giorno, fare dei controlli, inviare i dati e rimettersi a dormire. Con il pcf8653 hai un pin interrup low che puoi usare appunto impostando le varie "sveglie"... Il costo è irrisorio e l'ingombro pure...

Quindi soluzioni senza componenti esterni non ce ne sono?

Io il crepuscolare l'ho già montato sulla mia scheda perchè lo uso per aprire e chiudere un cancello.

Posso usare già questo stesso sistema? in che modo semmai?

dipende anche dal tipo di sleep che ti serve, ci sono diversi livelli, fra i quali alcuni che tengono attivi i timer. con uno di questi potresti usare un timer interno per risvegliarsi.
perche' vuoi che vada in sleep ? devi alimentarlo a batterie ?

L'interruttore crepuscolare di solito chiude un contatto al di sotto di una certa soglia (regolabile) di luminosità, per poi aprirlo quando la luminosità ritorna normale.

Quindi potresti risvegliare Arduino al mattino, tenerlo attivo il tempo necessario per l'elaborazione dei segnali e poi mandarlo a "nanna" fino all'arrivo del buio che lo riattiva, elabora i segnali e riparte il mattino successivo.

Testato: Esatto lo devo alimentare a batterie in un luogo remoto.

cyberhs: Sarebbe perfetto. non ho nemmeno necessità di eseguire operazioni con tempi precisi al centesimo.
Quindi potrei mandare a nanna arduino appena aperto il cancello, poi quando la soglia di luminosità scende, svegliarlo, fargli chiudere il cancello e rimandarlo a nanna fino a quando la soglia di luminosità non risale?

Mi fate un esempio di come mettere in pratica ciò? e che tipo di Sleep utilizzare?

Tenete conto il sensore e' sul Pin Analogico 2

Ma è a batterie anche il crepuscolare ? Perché se è alimentato, e poi porti i suoi contatti su arduino, tanto vale portargli anche l'alimentazione
Un micro a batterie ha senso quando non ha nessun cavo che gli arriva, se i cavi invece ci sono mettine uno in più e togli la rogna della batteria fa sostituire

Arduino per un uso a consumi limitati non è proprio il massimo; decisamente consigliabile è realizzare uno stand-alone, con molteplici vantaggi: si risparmia una marea di componenti, dimensioni ridottissime, consumi realmente al minimo, specialmente se si usa il micro nella configurazione originale con clock interno a 1MHz.
Se devi elaborare segnali ad intervalli più o meni stabili, considerando la necessità di risparmiare energia, invece di componentistica esterna anch'io sono del parere che si potrebbe lasciare acceso un timer del micro e fornire un impulso di risveglio ogni tot ore, per rimetterlo a risposo dopo avergli fatto svolgere le sue funzioni.

@Testato: 0 cavi 0 corrente, il crepuscolare e' un sensore di luminosità collegato ad Arduino

@Professor Menniti: Ovviamente e' uno standalone senza quarzo ma configurato a 8mhz e non a 1

La soluzione del risveglio con timer mi sembra eccellente.
Dove posso vedere qualche sketch a riguardo?

Potete consigliarmi qualcosa?

Non ricordo se Leo72, uno dei nostri MOD, ha scritto qualcosa sull’uso dei Timer, in alternativa dovresti dare un’occhiata al datasheet del micro per comprendere bene i meccanismi dello sleep. Un’eccellente dimostrazione d’uso la trovi nel firmware in dotazione al progetto del Micrologio presentato da Leo e da me su Elettronica In (è scaricabile gratuitamente dal sito), oppure quello fatto inizialmente dal solo Leo (presente sul suo sito). Di seguito un estratto tanto per capire di cosa stiamo parlando, ma ovviamente devi approfondire per bene:

//modalità risparmio energetico massimo! tutte le periferiche interne inutilizzate verranno spente
void impostaRisparmioEnergetico() {
    //modifica dei registri del microcontrollore
    PRR |= ((1<<PRUSART0) | (1<<PRADC) | (1<<PRSPI) | (1<<PRTIM1) | (1<<PRTWI)); //spengo le seguenti periferiche: USART, ADC, I2C, Timer1, SPI
    ADCSRA &= ~(1<<ADEN); //spengo l'ADC (convertitore analogico/digitale)
    ACSR |= (1<<ACD); //spengo il comparatore analogico
    DIDR0 |= ((1<<ADC5D) | (1<<ADC4D) | (1<<ADC3D) | (1<<ADC2D) | (1<<ADC1D) | (1<<ADC0D)); //spengo i buffer di input digitale sui pin ADC0..5
    DIDR1 |= ((1<<AIN1D) | (1<<AIN0D)); //spengo i buffer di input digitale su AIN0..1
    MCUCR |= (1<<BODS); //disattivo il circuito BOD (Brown-out detection)
    WDTCSR &= ~((1<<WDCE) | (1<<WDE)); //disattivo il circuito di watchdog

    //preparo la modalità di stand-by
    set_sleep_mode(SLEEP_MODE_PWR_SAVE); //imposto la modalità su POWER SAVE
    sleep_enable(); //risparmio energetico pronto all'uso
}

Grazie. Ora vedo!

flaterik:
@Testato: 0 cavi 0 corrente, il crepuscolare e' un sensore di luminosità collegato ad Arduino

Questo non ci credo. Il sensore crepuscolare ha un consumo. Indaga quanto.
Ciao Uwe

Per 0 corrente intende nessun cavo di alimentazione disponibile :wink:

@Uwe: Esatto, come dice Testato.
Intendo dire che non ho nessun alimentazione da fornirgli al di fuori delle batterie che alimentano lo StandAlone.

Cerco di fare quindi lo Sketch lasciando il timer di Arduino in funzione.

Io so per certo che una volta chiuso o aperto il cancello, lo sleep puo' durare diverse ore. Anche 8 ore di fila. Quindi farei OPERAZIONE -> 9 Ore Sleep -> OPERAZIONE -> 9 Ore Sleep.

In realtà le ore di sleep potrebbero essere anche più, ma variano un minimo con la durata delle giornate ecc

Certo se invece che il timer potessi usare il crepuscolare per mandare in sleep il tutto... ma poi se arduino e' in sleep come fa a essere risevegliato dal crepuscolare che viene comandato da arduino stesso?

Se fosse possibile questa operazione avrei il massimo risparmio di energia!

il tuo uso scorretto del termine crepuscolare fa andare fuori strada, tu intendi semplicemente che hai una fotoresistenza connessa ad un ingresso analogico e che la userai per creare un crepuscolare con arduino.

io farei cosi’,
invece di fare sleep di 9 ore, fai sleep di molto meno, ogni 15min ad esempio lo risveglierei via timer, avendo la fotoresistenza disponibile puoi sapere se la luminosita’ e’ quella adatta per fare quello che vuoi. Se la luminosita’ non e’ quella che cerchi va dinuovo in sleep.
Non consumera’ chissa’ che di piu’, perche’ per fare questo controllo ci impieghera’ microsecondi

Hai ragionissima Testato. Ho mandato un po’ tutti fuori strada per un uso improprio dei termini.

Mi date qualche dritta sul codice da utilizzare per lo sleep?

Segui le indicazioni del Menniti