Indice
Descrizione
Puoi ridurre il consumo energetico di Arduino attivando la modalità sleep. In questo modo il microcontrollore ferma tutte le attività e interrompe l'esecuzione dello sketch.
Usando degli interrupt puoi risvegliare la scheda e farle riprendere il normale funzionamento dal punto in cui si è fermata.
Seguendo questo video tutorial impari a mettere in pratica tutte queste tecniche e ridurre il consumo di corrente della tua scheda. Inoltre scopri alcuni consigli per modificare il circuito e risparmiare ulteriormente energia.
#define BUTTON_PIN 2
#define LED_PIN 9
volatile byte flag = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), callback, RISING);
}
void loop() {
if (flag) {
Serial.println("Cambio");
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
delay(200);
flag = 0;
}
Serial.println("...");
delay(500);
}
void callback() {
flag = 1;
}
#include <avr/sleep.h>
#define SLEEP_PIN 3
#define WAKEUP_PIN 2
#define LED_PIN 9
volatile byte flag = 0;
void setup() {
Serial.begin(9600);
pinMode(SLEEP_PIN, INPUT);
pinMode(WAKEUP_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
attachInterrupt(digitalPinToInterrupt(SLEEP_PIN), sleepCallback, RISING);
}
void loop() {
if (flag) {
Serial.println("Sleep mode attivato");
digitalWrite(LED_PIN, LOW);
sleep();
digitalWrite(LED_PIN, HIGH);
Serial.println("Sleep mode terminato");
}
Serial.println("...");
delay(500);
}
void sleepCallback() {
flag = 1;
}
void wakeupCallback() {
flag = 0;
}
void sleep() {
Serial.flush();
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
detachInterrupt(digitalPinToInterrupt(SLEEP_PIN));
attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), wakeupCallback, RISING);
delay(200);
sleep_cpu();
// codice eseguito dopo il risveglio
detachInterrupt(digitalPinToInterrupt(WAKEUP_PIN));
attachInterrupt(digitalPinToInterrupt(SLEEP_PIN), sleepCallback, RISING);
sleep_disable();
}
#include <avr/sleep.h>
#define SLEEP_PIN 3
#define WAKEUP_PIN 2
volatile byte flag = 0;
void setup() {
pinMode(SLEEP_PIN, INPUT);
pinMode(WAKEUP_PIN, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
attachInterrupt(digitalPinToInterrupt(SLEEP_PIN), sleepCallback, RISING);
}
void loop() {
if (flag) {
sleep();
}
delay(10);
}
void sleepCallback() {
flag = 1;
}
void wakeupCallback() {
flag = 0;
}
void sleep() {
sleep_enable();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
detachInterrupt(digitalPinToInterrupt(SLEEP_PIN));
attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), wakeupCallback, RISING);
delay(200);
sleep_cpu();
// codice eseguito dopo il risveglio
detachInterrupt(digitalPinToInterrupt(WAKEUP_PIN));
attachInterrupt(digitalPinToInterrupt(SLEEP_PIN), sleepCallback, RISING);
sleep_disable();
}