Non riesco a trovare la libreria sleep
Avreste qualche indicazione?
grazie sin da ora
E' già inclusa nelle librerie avr all'interno dell'IDE.
#include <avr/sleep.h>
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
#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
supermax:
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:
* 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
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?
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.
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:
- il watchdog impostato a 1 secondo e programmato per generare un interrupt e non un reset (ma il suo timer non è molto preciso)
- 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;
- 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.
Infatti, misurando con il multimetro non mi ha dato nessun vantaggio
Sto provando con lrtc ds1307 della shield Memoire e ho inserito lo scketch preso da Embedded Systems: Sleeping Arduino - Part 2 Wake Up Via An External Interrupt
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 Embedded Systems: Sleeping Arduino - Part 2 Wake Up Via An External Interrupt
Ho collegato il RQW del rtc al dig-pin 2ma non si sveglia.
#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();
}
}
Devi impostare il DS1307 in modo che faccia uscire sul pin il segnale di clock altrimenti non funziona.
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.
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.
nello sketch con cui imposto l'ora c'è questa riga:
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
#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
Racchiudi il codice con gli appositi tag.
- per favore.... il codice va fra gli appositi tag...
- questo sketch la contiene questa istruzione ... ora sono io che non capisco: quale programma stai usando? questo o quello più sopra?
Scusate, cercherò di essere più preciso nella descrizione e nella scrittura dei post.
Lo sketch del 30 maggio è quello che vorrei usare; l'ultimo è quello che uso per rimettere l'ora esatta e da cui ho estratto la riga di comando che mi sembra dovrebbe attivare il segnale SQW.