Go Down

Topic: libreria sleep (Read 6972 times) previous topic - next topic

supermax

Non riesco a trovare la libreria sleep
Avreste qualche indicazione?
grazie sin da ora

PaoloP

E' già inclusa nelle librerie avr all'interno dell'IDE.

Code: [Select]
#include <avr/sleep.h>

--> http://playground.arduino.cc/Learning/arduinoSleepCode

supermax

#2
May 27, 2013, 02:45 pm Last Edit: May 27, 2013, 03:44 pm by leo72 Reason: 1
Grazie per la risposta.
Stavo cercando un modo per risparmiare energia  della batteria e credevo di dover scaricare la libreria sleep.
Ho provato a modificare lo sketch blink per far dormire Arduino qualche secondo senza poter dare impulsi di risveglio perchè l'rtc che uso (ds1307) non ha il wake-up programmabile.
Avevo provato la libreria Narcoleptic, ma interferisce con le trasmissioni seriali tra monitor seriale e sd-card in un modo che non sono riuscito a risolvere; peraltro non mi funziona co la IDe 1.03  
Ho letto il link ma i comandi che ho inserito non mi funzionano e mi restituisce l'errore:

SLEEP_MODE_PWR_IDLE' was not declared in this scope

Per cercare di capire cosa fanno, ho messo i comandi tutti insieme nel loop:
secondo voi cosa manca?

Vi riporto il testo dello sketch;
grazie sin da ora
Code: [Select]
#include <avr/sleep.h>
int sleepStatus = 0;
void wakeUpNow(){   }
void setup() {                
 // initialize the digital pin as an output.
 // Pin 13 has an LED connected on most Arduino boards:
 pinMode(13, OUTPUT);    
}

void loop() {
 Serial.begin(9600);
 digitalWrite(13, HIGH);   // set the LED on
 Serial.print(" acceso ");
 delay(1000); // wait for a second
 Serial.println(" spento ");            
 digitalWrite(13, LOW);    // set the LED off
 set_sleep_mode(SLEEP_MODE_PWR_IDLE);
 sleep_enable();
 attachInterrupt(0,wakeUpNow, LOW);
 sleep_mode();
 
 delay(1000);              // wait for a second
 
 sleep_disable();  
 detachInterrupt(0);
}


edit by mod: includi il codice usando gli appositi tag

leo72


SLEEP_MODE_PWR_IDLE' was not declared in this scope


E' SLEEP_MODE_IDLE.

I modi accettati sono anche scritti nello sketch di esempio di quella pagina linkata:
Code: [Select]

     *     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

supermax

#4
May 29, 2013, 12:55 pm Last Edit: May 29, 2013, 01:00 pm by supermax Reason: 1
grazie!
non so quando mi sarei accorto di aver scritto set_sleep_mode(SLEEP_MODE_PWR_IDLE);  anzichè set_sleep_mode(SLEEP_MODE_IDLE);
Comunque il blink funziona ma il delay dura circa 1/5 del tempo impostato. Per farlo stare spento un secondo devo mettere almeno 5000.
Come si fa a riportarlo alla cognizione del tempo normale?

supermax

Ho spostato il comando:
detachInterrupt(0);
prima di:
delay(5000);
e il tempo sembra essere tornato normale.
Verificherò come cambiano gli ampere dalla batteria eliminando la libreia sleep dallo sketch e vi farò sapere i risultati.

leo72

E' sbagliato mettere un delay in mezzo allo sleep perché durante lo sleep il micro non calcola il tempo in modo corretto.
Se vuoi risvegliare il micro ogni secondo puoi usare:
1) il watchdog impostato a 1 secondo e programmato per generare un interrupt e non un reset (ma il suo timer non è molto preciso)
2) se l'Atmega328 lavora come standalone, metti il clock a 8 MHz e poi agganci ai pin XTAL1 e XTAL2 un quarzo da orologio (32 kHz) ed usi il modulo Real-Time Counter interno al micro impostato per andare in overflow 1 volta al secondo;
3) se hai un DS1307 puoi far uscire il suo clock sul pin CLK_OUT ed usare quello per risvegliare il micro, impostando il DS1307 per dare un'onda quadra con frequenza 1 Hz.

supermax

Infatti, misurando con il multimetro non mi ha dato nessun vantaggio

supermax

#8
May 30, 2013, 01:29 pm Last Edit: May 30, 2013, 10:58 pm by leo72 Reason: 1
Sto provando con lrtc ds1307 della shield Memoire e ho inserito lo scketch preso da http://donalmorrissey.blogspot.it/2010/04/putting-arduino-diecimila-to-sleep.html
Ho difficoltà a cpire i passaggi dal link che avete postato perchè non capisco che fanno quie comandi annidati dentro le void
Sto provando con lrtc ds1307 della shield Memoire e ho inserito lo scketch preso da http://donalmorrissey.blogspot.it/2010/04/putting-arduino-diecimila-to-sleep.html
Ho collegato il RQW del rtc al dig-pin 2ma non si sveglia.
Code: [Select]
#include <avr/sleep.h>
#include <avr/power.h>
int pin2 = 2;
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. */
 detachInterrupt(0);
                       }
void enterSleep(void){
 /* Setup pin2 as an interrupt and attach handler. */
 attachInterrupt(0, pin2Interrupt, LOW);
 delay(100);
 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
 sleep_enable();
 sleep_mode();
 /* The program will continue from here. */
 /* First thing to do is disable sleep. */
 sleep_disable();
                   }
void setup() {
 Serial.begin(9600);
 /* Setup the pin direction. */
 pinMode(pin2, INPUT);
 Serial.println("Initialisation complete.");
             }
int seconds=0;
void loop()  {
 delay(1000);
 seconds++;
 Serial.print("Awake for ");
 Serial.print(seconds, DEC);
 Serial.println(" second");
 if(seconds == 3){
   Serial.println("Entering sleep");
   delay(200);
   seconds = 0;
   enterSleep();
                 }
              }

leo72

Devi impostare il DS1307 in modo che faccia uscire sul pin il segnale di clock altrimenti non funziona.

supermax

Ho letto che di default dovrebbe già farlo, comunque sto cercando di capire come si fa.
Ho anche collegato al dig-pin2 i 3.3V e poi i 5V, ma non si sveglia lo stesso.

leo72

Non uso molto il DS1307, ma di suo non tira fuori il clock, come nessun RTC che uso.
Sul suo datasheet c'è scritto che devi impostarlo tu a mano mettendo ad 1 il bit SQWE. Prima regola il prescaler in modo da avere il segnale con la frequenza desiderata (bit RS0 e RS1).
Tutti questi bit fanno parte del registro $07.
Per regolare il registro, basta che prepari un byte con i valori che ti servono, poi apri una connessione con Wire e spedisci il byte all'indirizzo suddetto.



supermax

#12
Jun 07, 2013, 03:52 pm Last Edit: Jun 08, 2013, 12:15 am by leo72 Reason: 1
nello sketch con cui imposto l'ora c'è questa riga:
Code: [Select]
Wire.send(00010000); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
e pensavo bastasse questa.

Sapreste dirmi come modificare lo sketch

Code: [Select]
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val) {  return ((val/10*16) + (val%10));  }

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val) {  return ((val/16*10) + (val%16));  }

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers

void setDateDs1307(byte second,        // 0-59
byte minute,        // 0-59
byte hour,          // 1-23
byte dayOfWeek,     // 1-7
byte dayOfMonth,    // 1-28/29/30/31
byte month,         // 1-12
byte year)                 {    // 0-99
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.send(0);
 Wire.send(decToBcd(second));    // 0 to bit 7 starts the clock
 Wire.send(decToBcd(minute));
 Wire.send(decToBcd(hour));
 Wire.send(decToBcd(dayOfWeek));
 Wire.send(decToBcd(dayOfMonth));
 Wire.send(decToBcd(month));
 Wire.send(decToBcd(year));
 Wire.send(00010000); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
 Wire.endTransmission();     }  //fine void setDateDs1307

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)            {
 // Reset the register pointer
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.send(0);
 Wire.endTransmission();

 Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

 // A few of these need masks because certain bits are control bits
 *second     = bcdToDec(Wire.receive() & 0x7f);
 *minute     = bcdToDec(Wire.receive());
 *hour       = bcdToDec(Wire.receive() & 0x3f);  // Need to change this if 12 hour am/pm
 *dayOfWeek  = bcdToDec(Wire.receive());
 *dayOfMonth = bcdToDec(Wire.receive());
 *month      = bcdToDec(Wire.receive());
 *year       = bcdToDec(Wire.receive());
                       }  //fine void getDateDs1307

void setup() {
 Serial.begin(9600);
 byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
 Wire.begin();

 second = 0;    //per rimettere 0ra e data ripristinare queste righe
 minute = 48;   //aprire il serial monitor per rimettere l'ora
 hour = 15;
 dayOfWeek = 6;  // 1 =sunday
 dayOfMonth = 07;
 month = 06;
 year = 13;
 setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
              }  //fine void setup

void loop()       {
 byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
 getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

 Serial.print(hour, DEC);// convert the byte variable to a decimal number when being displayed
 Serial.print(":");
 if (minute<10)          {
     Serial.print("0");  }
 Serial.print(minute, DEC);
 Serial.print(":");
 if (second<10)           {
     Serial.print("0");   }
 Serial.print(second, DEC);
 Serial.print("  ");
 Serial.print(dayOfMonth, DEC);
 Serial.print("/");
 Serial.print(month, DEC);
 Serial.print("/");
 Serial.print(year, DEC);
 Serial.print("  Day of week:");
 switch(dayOfWeek)                  {
 case 1:
   Serial.println("Sunday"); break;
 case 2:
   Serial.println("Monday");break;
 case 3:
   Serial.println("Tuesday");break;
 case 4:
   Serial.println("Wednesday"); break;
 case 5:
   Serial.println("Thursday"); break;
 case 6:
   Serial.println("Friday"); break;
 case 7:
   Serial.println("Saturday"); break; }
delay(1000); // aspetta 2 secondi        
             } //fine loop

edit by mod: per favore includi il codice usando gli appositi tag

PaoloP

Racchiudi il codice con gli appositi tag.  ;)

leo72

@Supermax:
1) per favore.... il codice va fra gli appositi tag...  :smiley-sweat:
2) questo sketch la contiene questa istruzione ... ora sono io che non capisco: quale programma stai usando? questo o quello più sopra?

Go Up