Всем привет! собрал некий пульт управления для управления телевизором (вкл/выкл) одной кнопкой по ИК каналу, код работает, теперь стоит задача, что бы сделать спящий режим для экономии аккумуляторной батареи пульта, с пробуждением по внешнему прерыванию, при нажатии на кнопку МК 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 на самой ардуино, что я не так сделал?
На первый взгляд всё в норме. Добавьте инициализацию пинов 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); } Только под свою схему подправьте.
Даташит забыл прочитать. Не по FALLING, не по RISING, МК из POWERDOWN_SLEEP не выходит, т.к. нет тактирования. Дальше сам. В даташите вся информация есть.
Хорошо, сон и выход из сна работаем. Проверим работает-ли передача сигнала от кнопки. Код (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; }
Так тоже работает Код (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 { } }