Hoy!
I have a little program where I can put the Arduino Mega 2560 to sleep by pressing a button.
Another button can wake it up. It works.
BUT only if I press the wake up button Once first, then I can sleep and wake as many times as I want.
But if i put it to sleep and not press the wake up button once, it cannot awake from sleep and I have
to do a hard reset. Seems like a little bug?
Anyone has a clue?
Posting the code below, sorry for some swedish text
// Testar lägga till olika energispar LBR's SLEEP MODE här
#include <avr/sleep.h>
int WakeUpPin = 19; // KNAPP --- Väcker maskinen
int GoToSleepPin = 18; // KNAPP --- Knapp som försätter MEGA i SLEEP MODE - Ext Int 3
// SLEEP MODE - Ligger under alla int's - Om tas bort blir det 'wakeUpNow' was not declared in this scope
void wakeUpNow() {
}
// Ligger i Void Setupen
pinMode(WakeUpPin, INPUT); //Declarar denna som input MEGA's input är 19 Knapp - VÄCKER
pinMode(GoToSleepPin, INPUT); //Declarar denna som input MEGA's input är 18 Knapp - Sparar pos och försätter i SLEEP MODE
// ---- Ligger under Void Setup
// ---- SleepNow måste declareras, raden nedan gör detta, annars blir det 'sleepNow' was not declared in this scope
void sleepNow() {
attachInterrupt(19, wakeUpNow, LOW); // NY rek. kod - use interrupt ? (pin ?) and run function
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register
sleep_mode(); // here the device is actually put to sleep!!
attachInterrupt(19, wakeUpNow, HIGH); // NY rek. kod - use interrupt ? (pin ?) and run function
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep: disable sleep...
detachInterrupt(19); // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time.
}
// Ligger i Void Loop
// ------------------------------------------------------------------------------------------------------------------------******************************************
// ------------------------------------------------------------------------------------------------------------------------******************************************
// -------- Denna VÄCKER Arduinon från SLEEP MODE -------- PROBLEM = Väcker bara Arduino om WakeUp knappen tryckts en gång innan man sätter den i Sleep Mode (konstigt)
{
val = digitalRead(WakeUpPin); // Knapp som väcker Arduino från Sleep Mode
if (val == HIGH) { // Kollar om knappen är tryckt
// HÄR NEDANFÖR SKA KOD FÖR UPPVÄCKNING LIGGA
// SLEEP MODE lägger till denna - Finns inte i gamla mallen
pinMode(WakeUpPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(WakeUpPin), wakeUpNow, HIGH);
// wakeUpNow(); // Väcker - Verkar inte behövas med raderna ovan i bruk
// sleep_disable(); // first thing after waking from sleep: disable sleep... - Verkar inte behövas med raderna ovan i bruk
detachInterrupt(19); // disables interrupt ? on pin ? so the wakeUpNow code will not be executed during normal running time.
delay(750);
lcd.setCursor(0, 1);
lcd.print("ARISE!");
Serial.println("Waking up the machine");
delay(750);
}
}
// Ligger i Void Loop
// ------------------------------------------------------------------------------------------------------------------------******************************************
// ------------------------------------------------------------------------------------------------------------------------******************************************
// -------- SPARAR POSITION OCH FÖRSÄTTER MEGA I SLEEP MODE --------
{
val = digitalRead(GoToSleepPin); // Knapp som sparar position och går in i SLEEP MODE
if (val == HIGH) { // Kollar om knappen är tryckt
UserStopPulseCount4 = PulseCount;
EEPROM.put(24, UserStopPulseCount4); // Skriver PulseCount numret till minnet, adressen är 24
EEPROM.put(28, UserStopPulseCount4 + 1); //
lcd.setCursor(0, 1); // Dessa två rader skriver till LCD, 0, 1 ärrad 2 och 1, 0 vore rad 1
lcd.print(PulseCount);
delay(750);
lcd.setCursor(0, 1);
lcd.print("OffOn SLEEP");
Serial.println("Saving Off to On position to memory and initiates SLEEP MODE Zzzz...");
delay(750);
lcd.clear(); // Tömmer skärmen
lcd.setCursor(1, 0); // Visar Goodbye... på första raden av LCD
lcd.print("Goodbye..."); // Sista meddelandet innan den stänger ner
delay(750); // Väntar lite
lcd.clear(); // Tömmer skärmen
// SOV FUNKTION HÄRUNDER
sleepNow(); // Aktiverar SLEEP MODE - Kommer behöva interrupt wake up för att vakna från detta
}
}