Включение и выключение Arduino кнопкой - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь включить и выключить Arduino с помощью кнопки. Я использовал учебник https://www.instructables.com/id/A-Guide-to-Putting-Your-Arduino-to-Sleep/, чтобы понять, как это сделать. Но, к сожалению, сценарий не подходит на 100%. Я хочу, и то, и другое через один и тот же переключатель (не по таймеру). Итак, я реализовал это так, как показано ниже, просто переназначая различные функции событию через attachInterrupt (). Как будто вы не можете переназначить функцию, назначенную событию. Это тот случай? У кого-нибудь есть решение этой проблемы?

Я уже добавил detachInterrupt перед тем, как снова использовать attachInterrupt. Также я уже добавил задержку между ними. Пробное событие прерывания HIGH, LOW и CHANGE, всегда один и тот же результат, ложится спать, но никогда не просыпается.

#include <avr/sleep.h>
#define INTERRUPT_PWR_BUTTON_PIN 2 // pin for power button (Power button)

void setup() {                
    Serial.println("I'm up...");
    attachInterrupt (digitalPinToInterrupt(INTERRUPT_PWR_BUTTON_PIN), goToSleep, HIGH); //attaching wakeup to interrup 0 on pin 2
    delay(1000);
}

void loop() {
    Serial.println("Ping");
    delay(1000);              // wait 1 sec
}

void goToSleep() {
    Serial.println("Power Button pressed...");
    Serial.flush();
    sleep_enable(); // only enabling sleep mode, nothing more
    detachInterrupt(digitalPinToInterrupt(INTERRUPT_PWR_BUTTON_PIN)); //remove interrupt 0 from pin 2
    attachInterrupt (digitalPinToInterrupt(INTERRUPT_PWR_BUTTON_PIN), wakeUp, HIGH);
    /* 2019-05-02 NN: Does not work, device will not wake up at all, unless pressing reset -> 2 buttons for now */
    set_sleep_mode(SLEEP_MODE_PWR_DOWN); // setting sleep mode to max pwr saving
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
    sleep_cpu();
    Serial.println("Just woke up!"); // gets executed after interrupt
    digitalWrite(LED_BUILTIN, HIGH);  
}

void wakeUp () {
    Serial.println("Wakeup Interrupt Fired");
    sleep_disable();
    detachInterrupt(digitalPinToInterrupt(INTERRUPT_PWR_BUTTON_PIN)); //remove interrupt 0 from pin 2
    attachInterrupt (digitalPinToInterrupt(INTERRUPT_PWR_BUTTON_PIN), goToSleep, HIGH);
}

1 Ответ

0 голосов
/ 02 мая 2019

Поскольку вы хотите использовать только одну кнопку, вы можете активировать функцию переключения через прерывание, и из этой функции Arduino будет спать или активироваться.Вы должны использовать один логический флаг для достижения этого.

...
// use flag to control state of sleep
bool isSleeping = false;

void setup() {
    ...
    attachInterrupt (digitalPinToInterrupt(INTERRUPT_PWR_BUTTON_PIN), toggleSleepState, HIGH); //attaching wakeup to interrup 0 on pin 2
    ...
}

void loop() {
    ...
}

void toggleSleepState() {

    static unsigned long last_interrupt_time = 0;
    unsigned long interrupt_time = millis();
    // If interrupts come faster than 200ms, assume it's a bounce and ignore
    if (interrupt_time - last_interrupt_time > 200) 
    {
        // toggle state of sleep
        isSleeping = !isSleeping;

        if (isSleeping == true) {
            goToSleep();
        }
        else {
            wakeUp()
        }
    }
    last_interrupt_time = interrupt_time;
}

void goToSleep() {
    // sleep logic
}

void wakeUp () {
    // wake up logic
}
...