Не могу разобраться с внешним прерыванием

Тема в разделе "Arduino & Shields", создана пользователем Evgen-82, 16 янв 2021.

  1. Evgen-82

    Evgen-82 Нерд

    Всем привет! собрал некий пульт управления для управления телевизором (вкл/выкл) одной кнопкой по ИК каналу, код работает, теперь стоит задача, что бы сделать спящий режим для экономии аккумуляторной батареи пульта, с пробуждением по внешнему прерыванию, при нажатии на кнопку МК Arduino (Atmega328) просыпается, передает команду по ИК сигналу и снова ложится в сон, вот мой код
    Код (C++):
    #include <GyverPower.h>
    #include <IRremote.h>
    IRsend irsend;
    void setup()
    {
    power.autoCalibrate();
    power.setSleepMode(POWERDOWN_SLEEP);
    attachInterrupt(0, wakeup, FALLING);
    }

    void loop()
    {
    irsend.sendSAMSUNG(0xE0E040BF, 32);// POWER
    delay(50);
    power.sleep(SLEEP_FOREVER);
    }
    void wakeup()
    {
    }
    Но он почему-то не работает как задумано, а работает лишь тогда когда жмешь кнопку RESET на самой ардуино, что я не так сделал?
    03.JPG 04.JPG
     
  2. a1000

    a1000 Гик

    На первый взгляд всё в норме. Добавьте инициализацию пинов D2 и D3.
    И проверьте работает, ли пример от автора библиотеки.
    Код (C++):
    // просыпаемся по аппаратному прерыванию из sleep
    #include "GyverPower.h"
    void setup() {
      Serial.begin(9600);
      // кнопка подключена к GND и D3
      pinMode(3, INPUT_PULLUP);
      // подключаем прерывание на пин D3 (Arduino NANO)
      attachInterrupt(1, isr, FALLING);
      // глубокий сон
      power.setSleepMode(POWERDOWN_SLEEP);
    }
    // обработчик аппаратного прерывания
    void isr() {
      // в отличие от sleepDelay, ничего вызывать не нужно!
    }
    void loop() {
      Serial.println("go sleep");
      delay(300);
      // спим ~8 секунд, но можем проснуться по кнопке
      power.sleep(SLEEP_8192MS);
      // тут проснулись, по кнопке или через указанный период
      Serial.println("wake up!");
      delay(300);
    }
    Только под свою схему подправьте.
     
  3. parovoZZ

    parovoZZ Гуру

    Даташит забыл прочитать.
    Не по FALLING, не по RISING, МК из POWERDOWN_SLEEP не выходит, т.к. нет тактирования. Дальше сам. В даташите вся информация есть.
     
  4. рокки1945

    рокки1945 Гуру

  5. Evgen-82

    Evgen-82 Нерд


    Да, все работает, просыпается через 8 секунд и по кнопке
     

    Вложения:

    • 05.JPG
      05.JPG
      Размер файла:
      16,1 КБ
      Просмотров:
      18
  6. a1000

    a1000 Гик

    Хорошо, сон и выход из сна работаем. Проверим работает-ли передача сигнала от кнопки.
    Код (C++):
    #include <IRremote.h>
    IRsend irsend;

    int switchPin = 2;
    boolean lastButton = HIGH;
    boolean currentButton = HIGH;

    void setup()
    {
      pinMode(switchPin, INPUT);
    }

    boolean debounce(boolean last)
    {
      boolean current = digitalRead(switchPin);
      if (last != current)
      {
        delay(5);
        current = digitalRead(switchPin);
      }
      return current;
    }

    void loop()
    {
      currentButton = debounce(lastButton);
      if (lastButton == HIGH && currentButton == LOW)
      {
        irsend.sendSAMSUNG(0xE0E040BF, 32);// POWER
        delay(50);
      }
      lastButton = currentButton;
    }
     
  7. Evgen-82

    Evgen-82 Нерд

    Данный код работает, по нажатию кнопки включает и выключает устройство
     
  8. Evgen-82

    Evgen-82 Нерд

    Так тоже работает

    Код (C++):

    #include <IRremote.h>
    IRsend irsend;

    void setup() {
    pinMode(4,INPUT_PULLUP);

    }

    void loop() {
    if(digitalRead(4)==LOW)
    {
    irsend.sendNEC(0x20DF10EF, 32);// ЗДЕСЬ ДОЛЖЕН БЫТЬ ВАШ КОД ПУЛЬТА
    delay(50);
    }
    else
    {

    }
    }
     

    Вложения: