Pornind de la articolul precedent putem optimiza codul sursa in asa fel incat montajul nostru cu Arduino sa functioneze o perioada de timp. Apoi la apasarea unui buton, la modificarea parametrilor unuia sau mai multor senzori acesta sa intre in modul sleep. In final pentru ca microcontrolerul sa-si reia activitatea va trebui sa apasam un alt buton sau la modificarea parametrilor unui senzor acesta sa reintre in ciclul normal de rulare.
Pentru a face acest lucru am adaugat si o a doua intrerupere folosind pinul digital 3.
Codul sursa rezultat este cel de mai jos:
#include <avr/sleep.h>
#define pornit 3 //pinul folosit pentru iesirea din sleep mode
#define oprit 2 //pinul folosit pentru intrarea in sleep mode
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte grafic[] = {
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F,
0x1F
};
int oprire = 0;
void setup() {
lcd.createChar(0, grafic);
pinMode(pornit, INPUT_PULLUP);
pinMode(oprit, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(oprit), goToSleep, LOW);
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Arduino si sleep");
lcd.setCursor(0, 1);
lcd.print("mode on/off");
delay(3000);
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("In acest moment");
lcd.setCursor(0, 1);
lcd.print("arduino ruleaza...");
delay(5000);
if (oprire == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sleep mode...");
for (int i=0; i<16; i++) {
lcd.setCursor(i, 1);
lcd.write(byte(0));
delay(300);
}
delay(1500);
GoingSleep();
}
}
int GoingSleep() {
sleep_enable();
attachInterrupt(digitalPinToInterrupt(pornit), wakeUp, LOW);
lcd.noBacklight();
lcd.clear();
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
delay(1000);
sleep_cpu();
oprire = 0;
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Acum m-am trezit");
delay(1500);
}
int goToSleep() {
oprire = 1;
return oprire;
}
void wakeUp() {
sleep_disable();
detachInterrupt(digitalPinToInterrupt(pornit));
}
Montajul functioneaza in felul urmator: la pornire va executa tot codul din buca loop().
In cazul in care pinul digital 2 este pus la masa pentru o scurta perioada de timp (un impuls de la un comutator, un senzor, un releu etc) microcontrolerul va intra in modul sleep.
Va sta in acest mod pana la resetarea acestuia sau pana cand pinul digital 3 va fi si el pus la masa cu un impuls, moment in care microcontrolerul isi va relua activitatea.