Jag blir väldigt förvirrad av det här med interrupts och deras adresser...
Känns som att det Lär vara det som ställer till det nu.
Jag har använt guiden i länken nedanför.
Och det verkar som att jag kan försätta Arduinon i Sleep Mode.
Men däremot inte väcka upp den ifrån det.
Jag har testat att byta HIGH till LOW här och där utan resultat, koden nedan är den som fungerar "bäst" hittils.
En knapp kan få Arduinon att somna.
Men det händer inget när jag trycker den som ska vara Wake Up. Den har ett fysiskt pullup motstånd till knappen, och
knappen är bekräftad fungera. Men den kan inte väcka upp via interrupt.
SLEEP är inkopplat till pinne 18 på Arduino MEGA (digitalpin 18/ext int 3) på Arduino MEGA.
WAKE UP är inkopplad till pinne 19 (digitalpin 19/ext int 2) på Arduino MEGA.
Är det verkligen siffran 2 man ska skriva in i attach interrupt då? Hmm..
Jag är totalt förvirrad just nu, är det något uppenbart som ni kan se här?
Kod: Markera allt
// SLEEP MODE MALL https://arduino.stackexchange.com/questions/23555/pir-sensor-and-sleep-interrupt-on-mega2560
// SLEEP MODE biblioteket 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
void wakeUpNow() {
}
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
// SLEEP MODE lägger till denna
{
// pinMode(WakeUpPin, INPUT_PULLUP); // originaltext
// attachInterrupt(2, wakeUpNow, LOW); // originaltext - use interrupt 0 (pin 2) and run function wakeUpNow when pin 2 gets LOW
pinMode(WakeUpPin, INPUT_PULLUP);
attachInterrupt(2, wakeUpNow, HIGH); // Om denna står på LOW så blir displayen tom - Fel interrupt??
}
}
// SLEEP MODE - SleepNow måste declareras, raden nedan gör detta, annars blir det 'sleepNow' was not declared in this scope
void sleepNow() {
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(2, wakeUpNow, HIGH); // use interrupt 0 (pin 2) and run function
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep: disable sleep...
detachInterrupt(2); // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time.
}
// ------------------------------------------------------------------------------------------------------------------------******************************************
// ------------------------------------------------------------------------------------------------------------------------******************************************
// -------- Denna ska väcka upp Arduinon från SLEEP MODE --------
{
val = digitalRead(WakeUpPin); // Knapp som sparar position
if (val == HIGH) { // Kollar om knappen är tryckt
// HÄR NEDANFÖR SKA KOD FÖR UPPVÄCKNING LIGGA
// wakeUpNow();
sleep_disable(); // first thing after waking from sleep: disable sleep...
detachInterrupt(2); // disables interrupt 0 on pin 2 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);
}
}
// ------------------------------------------------------------------------------------------------------------------------******************************************
// ------------------------------------------------------------------------------------------------------------------------******************************************
// -------- 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
}
}