Consiglio su Modalità Sleep

Salve

Ho da poco finito di assemblare un prototipo di datalogger che dovrebbe servire ad effettuare delle letture
di trasduttori di posizione , una lettura ogni ora circa, il tutto funziona correttamente.
I sensori vengno alimentati qualche secondo prima di effettuare la lettura.
Vorrei alimentare a batteria ma considerando che consuma 120 mA , con battere al piombo da 7.2 Ah
dovrebbe durare 2,5 gg.
Il sistema è composto da

Arduino Mega r3
Sd shield
Rtc1302
Ads1115 convertitore AD 16 bit 4 moduli
Lcd 16x2

Vorrei aumentare un po l'autonomia ho trovato in rete la possibilità di mettere in sleep il sistema
nel sito:

da questo ho visto che ci sono varie modalità di sleep

SLEEP_MODE_IDLE - the least power savings
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANDBY
SLEEP_MODE_PWR_DOWN - the most power savings

ma non capisco se durante la modalità sleep perdo i valori delle variabili e dei settaggi
in più lo sleep via timer esposto nel link puo' da quello che ho capito avvenire per un massimo di 4 secondi circa.
ho letto l'eventuale possibilita' di sostituire lo shield rtc con una che gestisce un uscita programmabile
che gestisca il wake up tramite interrupt.
Ho visto che posso spegnere i tre timer adc power ecc. ma non capisco quali sono utili e no per il mio caso.

Cosa mi consigliate in merito?

Grazie Mille Anticipatamente

  1. spegni la retroilluminazione del Display
  2. Non avrai un risparmio buono perché l'Arduino MEGA oltre al Controller ATmega2650 che puoi mettere in Sleep c'ha altri componenti che non si mettono in sleep. Non raggiungi mai i pochi µA che sono quando un Controller é in sleep. Resterai sempre sui 10-20mA.
    Per risparmiare bene devi usare un Controller senza altra periferica (LED, Interfaccia USB, controllo tensione)

Ciao Uwe

Grazie uwefed

In effetti spegnendo la backlight risarmio 15 mA, arrivando circa a 105 mA,
Quindi dovrei usare il solo microcontrollore e mettere uno stadio regolatore di tensione , ma un dubbio i2c e spi funzionano allo stesso modo? mancherebbe la parte degli ingressi analogici ?
Se volessi provare lo sleep ance se dovessi arrivare a 20 mA come dovrei proseguire ?

Grazie Mille

Ho letto la tua presentazione e, per la "poca" esperienza che dichiari di avere in questo settore ... ho idea che, purtroppo, puoi fare poco per arrivare a quei bassi consumi ...

Difatti, per poter veramente sfruttare in modo utile la modalità sleep, occorre disegnarsi da soli la propria board, ottimizzata al massimo così da minimizzare i consumi ... ma il disegno e la realizzazione di una board con degli ATmega2560 (TQFP 100) non è certo cosa amatoriale :confused:

Le classiche board Arduino e simili, hanno comunque a bordo tutta una serie di componenti che "consumano" e il porre in sleep la MCU NON ha "praticamente" alcun effetto benefico.

Guglielmo

Metti a monte di tutto un atmega328 o meglio ancora un attiny, e lo usi per pilotare l'alimentazione di tutto il sistema, Mega2560 compresa, con un transistor.

Imposti un rtc (o il watchdog) che svegli l'attiny una volta all'ora, lo lasci sveglio per il tempo necessario ad effetture le misurazioni e poi lo rimetti a dormire.

Con clock a 1MHz puoi alimentare il micro a 3V con 2 ministilo AAA

doppiozero:
Metti a monte di tutto un atmega328 o meglio ancora un attiny, e lo usi per pilotare l'alimentazione di tutto il sistema, Mega2560 compresa, con un transistor.

... si, certo ... così ogni volta spegne la scheda e resetta il tutto :smiling_imp:

Non so se hai notato che già nel suo primo intervento si preoccupava proprio di sapere se, in modalità sleep, perdesse il contenuto delle variabili, ecc ... ::slight_smile:

Guglielmo

Grazie per le risposte

In effetti non potrei mai assemblare un microcontrollore ,
Spegnere il tutto risparmierei parecchio ma dovrei cambiare la procedura per ricaricare tutte le volte i setting.

Da quello che ho capito servirebbe qualcosa del genere
https://octopart.com/mcu+card+atmega2560-mikroelektronika-33342381

Ma volendo testare la modalità sleep anche per conoscenza cosa mi consigliate come tipo di sleep , rtc con allarm?

Io uso lo SLEEP_MODE_PWR_DOWN ... e poi risveglio tramite un interrupt.

Direi che dovresti studiarti sia la <avr/sleep.h> che la <avr/power.h> ... fanno entrambe parte di AVR libc ... libreria fondamentale per programmare seriamente su AVR e sempre inclusa dall'IDE :wink:

Tutte le prove (... per imparare e capire) puoi farle con una MCU con piedinatura DIP, come l'ATMega328P, lo stesso montato su Arduino UNO e con il quale è facilissimo farsi uno standalone anche su breadboard :slight_smile:

Guglielmo

... si, certo ... così ogni volta spegne la scheda e resetta il tutto :smiling_imp:

Spegnere il tutto risparmierei parecchio ma dovrei cambiare la procedura per ricaricare tutte le volte i setting.

Si non l'ho precisato, devi salvare i parametri, ma piuttosto che niente..

Grazie

Non piago non so perchè :sob: comunque per prima cosa proverò lo sleep SLEEP_MODE_PWR_DOWN
per vedere i risultati e sincerarmi che dopo il wakeup rifunzioni il tutto.
Vi farò sapere

In questo sito

trovi un sacco di informazioni sui bassi consumi in quanto il progetto è proprio un datalogger e il tizio ha sia costruito partendo dai chip che usato delle schede già assemblate.

L'uso del Mega è obbligatorio?

Rispondendo a zoomx su arduino uno non entra il codice
Non capisco una parte di codice riguardate lo sleep

void enterSleep(void)  
 {  
  set_sleep_mode(A_SLEEP_MODE);  
  sleep_enable();  
  sleep_mode();  
  /** The program will continue from here. **/   <-a cosa si riferisce
  /* First thing to do is disable sleep. */  
  sleep_disable();   <-a qui riattiva arduio ?
 }

@mariocalimero : ... perdonami però, stai usando delle funzioni avanzate, che difatti, come vedi, proprio per la loro complessità NON sono neanche previste nel reference di Arduino, quindi ...
... prima di usarle, tocca che dedichi del tempo a studiare e capire come funziona il power management e lo sleep della MCU che stai usando. Purtroppo sono funzionalità complesse e NON possono essere usate così, senza conoscere a fondo cosa fanno.

Quindi ... datasheet alla mano, devi studiarti tutto il capitolo 11 - Power Management and Sleep Modes così da capire come funziona, cosa si può spegnere e cosa non si può, cosa riaccendere, come, quando e perché, ecc. ecc.

Inoltre, come ti ho già detto, devi anche studiarti la <avr/sleep.h> e la <avr/power.h> che fanno entrambe parte di AVR libc .

Purtroppo, se vuoi uscire dalle semplici funzioni di Arduino ed avventurarti in cose più complesse ... questo è lo scotto da pagare ... :confused:

Guglielmo

Salve

Ho eseguito il test con il codice sotto riportato
il consumo di tutto il sistema con attivo è di 96 mA
invece in sleep consuma 46,5 mA
Lcd con il backlight spento consuma circa 5mA
al momento della riattivazione l'ora di Arduino deve essere risincronizzata.

[code]#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2); 
#include <avr/power.h>
int pin2 = 2;
int pinSleep=7;
unsigned long tem;
int ti;


void pin2Interrupt(void) {
 /* This will bring us back from sleep.  
 /* We detach the interrupt to stop it from
   continuously firing while the interrupt pin
  * is low. */

 //lcd.init();
                       }
void enterSleep(void){
sleep_enable();
 /* Setup pin2 as an interrupt and attach handler. */
 attachInterrupt(0, pin2Interrupt, LOW);
 delay(100);
 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
 //
 sleep_cpu();
// sleep_bod_disable();
 
 /* The program will continue from here. */
 /* First thing to do is disable sleep. */

 detachInterrupt(0);
 sleep_disable();
                   }
void setup()
{
  tem=millis();
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  //lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Hello, world!");
 Serial.begin(9600);
 /* Setup the pin direction. */
 pinMode(pin2, INPUT);
 pinMode(pinSleep, INPUT);
 Serial.println("Initialisation complete.");

}




void loop()  {
if (digitalRead(pinSleep)==HIGH){
//if (12==1){
   Serial.println("Entering sleep");
   delay(200);
   
   enterSleep();
                 }
if (millis()>=tem+1000) {
   ti++;           
    lcd.setCursor(0,1);
    lcd.print(ti);          
   tem=millis();
    }
              }
[/code]

mariocalimero:
al momento della riattivazione l'ora di Arduino deve essere risincronizzata.

Ovviamente :), ... a meno che tu non abbia un RTC da dove leggerla.

Del resto, se spegni tutto che pretendi ?

Guglielmo

Grazie a tutti per la pazienza.

In effetti già è un buon risultato, quando riattivo faccio il resinc con rtc

Ma mi chiedo cosi' con questo hardware posso spingermi oltre ?
per avere consumi piu' passi?

Per avere consumi più bassi devi abbassare il clock del micro e abbassare la tensione di alimentazione, nel caso del 328P vai ad 8MHz e 3.3v. Poi bisogna vedere quanto consuma il resto.
Il blog che ti ho linkato prima è pieno di queste informazioni in quanto l'autore costruisce proprio datalogger che poi vanno alimentati a batterie per mesi. Ad esempio il tizio si è accordo che le SD riguardo a consumi non sono tutte uguali ma alcune consumano decisamente più di altre.

Grazie Zoomx

In effetti sul link ci sono tante informazioni utili.