Sistema per far dormire Arduino per circa 1 minuto

Ciao,
E' possibile mettere in stand-by Arduino per circa un minuto senza usare Interrupt?
Grazie

Bloccarlo per 1 minuto o mandarlo in idle?
Per bloccarlo delay(60000);
Se lo mandi in idle lo devi risvegliare con un timer e quindi con un interrupt (anche se interno).

Chiedi a Leo. E' lui l'esperto di questo campo.

ma devi metterlo in basso consumo oppure solo renderlo praticamente sordo e inattivo?

edit
ecco stessa cosa di paolo anche io pensavo al delay :slight_smile:

PaoloP:
Se lo mandi in idle lo devi risvegliare con un timer e quindi con un interrupt (anche se interno).

Si si a nanna profonda... :slight_smile:
MA questo "(anche se interno)" mi permette comunque di usare entrambi i due : interrupt 0 e interrupt 1 sui pin digitale 2 e 3?

Si.
Il micro differenzia tra interrupt esterni e interrupt interni.

Grazie,
Che tu sappia le variabili vengono tenute (ovviamente quelle dichiarate prima del setup()) dopo il risveglio?

Giusto per aumentare il mio grado di confusione ho trovato:

  • sleep.h
  • Enerlib.h
  • Narcoleptic.h
  • LowPower.h
  • JeeLib.h => sugerito da:Pitusso

:~ Che (dovrebbero) fare la stessa cosa :~

Quale preferire?
Consigli...

Ciao,
se vuoi far dormire Arduino consumando il meno possibile, Leo72 è il tuo uomo.
Puoi anche dare un'occhiata qui:

usando delle librerie della Jeenode, puoi usare una semplice funzione al posto del delay per ottenere lo stesso scopo.

@70agiuseppe:
scusa se ti rispondo solo ora ma sono influenzato e non sto bene.
Il risparmio energetico sull'Arduino inteso come scheda è un pò relativo perché metti solo il micro Atmega328 in sleep, in resto della circuiteria della scheda resta attiva a consumare corrente.

Detto questo, ti serve la lib sleep.h, che è quella della toolchain, che serve per mettere in sleep il micro, è un interrupt che te lo risvegli. O un interrupt su un pin esterno oppure anche un interrupt interno. Il modo più semplice è quello di usare il watchdog, che puoi impostare anche per 1 secondo. Oppure un timer.
Intanto puoi scaricarti da questo post un archivio con un paio di PDF che ho mostrato all'incontro di Bassano dello scorso giugno:
http://forum.arduino.cc//index.php?topic=167655.msg1303328#msg1303328

In uno di essi c'è proprio la spiegazione di come usare timer, interrupt e sleep.

Ricordati poi che non puoi usare la libreria wdt.h così com'è perché essa sette il watchdog per resettare il micro, ma a te serve che generi un interrupt.

Waps... avevo letto male.
1 minuto lo devi fare contando 60 timeout del watchdog impostato ad 1 secondo. Ricorda che non è precisissimo, come timer, per cui non saranno 60 secondi esatti esatti.

#include <avr/wdt.h>
#include <avr/sleep.h>

const byte LED13 = 13;
byte ledStatus = 1;
volatile unsigned int counter = 0;
volatile byte flag = 0;

void setup() {
    MCUSR = 0; //resetta il registro di stato della MCU, così non ricorda se c'è stato un reset per via del WDT
    wdt_disable(); //disattiva il watchdog
    pinMode(LED13, OUTPUT); //pin 13 in OUTPUT
    digitalWrite(LED13, ledStatus); //stato iniziale acceso
    setWdt();
    //imposta lo sleep
    set_sleep_mode(SLEEP_MODE_PWR_DOWN); //modalità di sleep - POWER DOWN
}

void loop() {
    sleep_mode(); //cpu a nanna - corrisponde a sleep_enable+sleep_cpu+sleep_disable
    if (flag) {
        wdt_disable();
        counter = 0;
        flag = 0;
        //fai qui quello che devi fare
        ledStatus ^= 1; //cambio lo stato al led
        digitalWrite(LED13, ledStatus);
        setWdt(); //reimposta il watchdog
    }
}


void setWdt() {
    SREG &= ~(1<<SREG_I); //disattiva tutti gli interrupt
    //imposta il registro del watchdog
    WDTCSR |= ((1<<WDCE) | (1<<WDE));
    WDTCSR = ((1<<WDIE)| (1<<WDP2) | (1<<WDP1)); //modalità "interrupt" - 1 secondo di timeout
    SREG |= (1<<SREG_I); //riattiviamo gli interrupt globali
}

ISR(WDT_vect) {
//    //eventualmente metti qui qualcosa da eseguire ogni volta che il watchdog scatena l'interrupt
    if (++counter >= 59) {
        flag = 1;
    }
}

I commenti sono abbastanza esplicativi.
Così hai uno sleep che ogni secondo è svegliato dal watchdog e dopo 60 secondi esegui un compito.

Leo Ti ringrazio tantissimo

leo72:
Ricordati poi che non puoi usare la libreria wdt.h così com'è perché essa sette il watchdog per resettare il micro, ma a te serve che generi un interrupt.

Era proprio quello che cercavo di capire: relazione tra variabili e sleep

Davvero utile, grazie Leo

Hai qlc link da consigliare sull' argomento?

Sul mio sito (link in calce) ho un paio di guide sull'uso del watchdog.
Ho anche il codice di un orologio con display a 7 seg menti in cui uso un sistema simile per lo sleep ed il risveglio, questo basato però sull'interrupt scatenato da un timer collegato ad un quarzino esterno da 32 KHz. Il chip è in grado di "sopravvivere" con una semplice batteria a bottone, una CR2032, per un tempo calcolato in anni. :wink: Rileggiti bene anche il PDF che ti ho consigliato qualche post su, dove ci sono snocciolati un bel pò di argomenti utili.
Insomma, se vuoi approfondire il discorso dei timer, degli interrupt e del risparmio energetico non hai che da... leggere :wink:

x iscrizione