Код управления люстрой с ик пульта и кнопки (выключателя). Идея реализовать включения света и кнопкой и ИК. Код (Text): #include <IRremote.h> #include <IRremoteInt.h> const int buttonPin = 2; int Pwr = 13; // LED (здесь реле) boolean state = 0; int buttonState = 0; // переменная для хранения состяния кнопки //IR Receiver Module Pin and variable int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup(){ pinMode(Pwr, OUTPUT); // Вывод Pwr выход irrecv.enableIRIn(); //Старт ИК-приёмника pinMode(buttonPin, INPUT); // инициализируем пин, подключенный к кнопке, как вход } void loop(){ // считываем значения с входа кнопки buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { // включаем реле digitalWrite(Pwr, buttonState); } else { // выключаем реле digitalWrite(Pwr, buttonState); } if(irrecv.decode(&results)){ // Декодирование принятого сигнала по ИК if(results.value == 0xFF629D){ // Код кнопки POWER state = !state; } digitalWrite(Pwr, state); // Пин Pwr irrecv.resume(); } }
как я вижу исходя из скетча ,реле у вас включаться если удержать кнопку,а с пульта вообще ничего не происходит?!
Код (Text): void loop(){ if (digitalRead(buttonPin)) { digitalWrite(Pwr, !digitalRead(Pwr)); delay(100); } if(irrecv.decode(&results)){ if(results.value == 0xFF629D) digitalWrite(Pwr, !digitalRead(Pwr)); irrecv.resume(); } }
С данным кодом таки есть, с кнопки все ок, а с пульта нет. Но если оставить код только для пульта Код (Text): #include <IRremote.h> #include <IRremoteInt.h> int Pwr = 4; // LED boolean state = 0; //IR Receiver Module Pin and variable int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup(){ pinMode(Pwr, OUTPUT); // Вывод Pwr выход irrecv.enableIRIn(); //Старт ИК-приёмника } void loop(){ if(irrecv.decode(&results)){ // Декодирование принятого сигнала по ИК if(results.value == 0xFF629D){ // Код кнопки POWER state = !state; } digitalWrite(Pwr, state); // Пин Pwr irrecv.resume(); } } пульт работает. Пушной звер, спасибо - буду пробовать
Длявыключателя получилось использовать вот такой код, но выключатель кнопочный "без пружины". Код (Text): #define BUTTON_PIN A3 #define LED_PIN 13 boolean buttonWasUp = true; // была ли кнопка отпущена? boolean ledEnabled = false; // включен ли свет? void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // определить момент «клика» несколько сложнее, чем факт того, // что кнопка сейчас просто нажата. Для определения клика мы // сначала понимаем, отпущена ли кнопка прямо сейчас... boolean buttonIsUp = digitalRead(BUTTON_PIN); // ...если «кнопка была отпущена и (&&) не отпущена сейчас»... if (buttonWasUp && !buttonIsUp) { // ...может это «клик», а может и ложный сигнал (дребезг), // возникающий в момент замыкания/размыкания пластин кнопки, // поэтому даём кнопке полностью «успокоиться»... delay(10); // ...и считываем сигнал снова buttonIsUp = digitalRead(BUTTON_PIN); if (!buttonIsUp) { // если она всё ещё нажата... // ...это клик! Переворачиваем сигнал светодиода ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled); } } // запоминаем последнее состояние кнопки для новой итерации buttonWasUp = buttonIsUp; }
поправил код Код (Text): #include <IRremote.h> #include <IRremoteInt.h> #define BUTTON_PIN A3 #define LED_PIN 13 boolean buttonWasUp = true; // была ли кнопка отпущена? boolean ledEnabled = false; // включен ли свет? //int Pwr = 8; // LED boolean state = 0; //IR Receiver Module Pin and variable int RECV_PIN = 2; IRrecv irrecv(RECV_PIN); decode_results results; void setup(){ pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); // Вывод Pwr выход (был pwr_) irrecv.enableIRIn(); //Старт ИК-приёмника } void loop(){ boolean buttonIsUp = digitalRead(BUTTON_PIN); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(BUTTON_PIN); if (!buttonIsUp) { ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled); } } buttonWasUp = buttonIsUp; if(irrecv.decode(&results)){ if(results.value == 0xFF629D) digitalWrite(LED_PIN, !digitalRead(LED_PIN)); irrecv.resume(); } }
Включатель включаешь - свет загорается, а когда выключаешь приходиться дважды переключать выключатель. (Вверх-вниз-вверх-вниз и свет выключился.)
Спасибо tomasina, за часть кода из соседней ветки. Но сижу и не понимаю как правильно реализовать, что бы все таки выключатель работал правильно: Вот мой код Код (Text): #include <IRremote.h> #include <IRremoteInt.h> #define BUTTON_PIN A2 //кнопка #define LED_PIN 5 // реле boolean buttonWasUp = true; // была ли кнопка отпущена? boolean ledEnabled = false; // включен ли свет? //IR Receiver Module Pin and variable int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup(){ pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); irrecv.enableIRIn(); //Старт ИК-приёмника } void loop(){ boolean buttonIsUp = digitalRead(BUTTON_PIN); if (buttonWasUp && !buttonIsUp) { delay(10); buttonIsUp = digitalRead(BUTTON_PIN); if (!buttonIsUp) { ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled); } } buttonWasUp = buttonIsUp; if(irrecv.decode(&results)){ if(results.value == 0xFF629D) digitalWrite(LED_PIN, !digitalRead(LED_PIN)); irrecv.resume(); } } , а это код для выключателя света Код (Text): void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { digitalWrite(LED_PIN, !digitalRead(BUTTON_PIN)); delay(100); } как и подружить, уже перепробовал многое. В си пока все новое. (((
Брал часть кода с сайта http://agsidenko.ru/2014/04/03/практическая-работа-5-кнопочный-перек/ . Суть, все просто до невозможно. Заходим в комнату либо включаем обычный кнопочный выключатель света (с положением вверх либо вниз) и свет включается, либо включаем с пульта. И отключается либо кнопкой, либо пультом. Сейчас все работает, но код сделан для "кнопки", которую раз нажал и отпустил - свет включился, и еще раз нажал отключился. С пульта все работает..
у вас опрос выключателя и опрос пульта работают отдельно друг от друга, а должны работать вместе ! digitalWrite(LED_PIN, !digitalRead(LED_PIN)); здесь вы тупо меняете состояние порта ,но вот выключателю не сообщаете что произошли изменения ...
Что самое удивительное код работает =). Тогда вопрос как? На деле не скажешь, что есть косяк между выключателем и ик
хотя наверно можно и так оставить.. как то так должно работать... Код (Text): void setup(){ pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); irrecv.enableIRIn(); //Старт ИК-приёмника buttonWasUp=!digitalRead(BUTTON_PIN); } void loop(){ boolean buttonIsUp = digitalRead(BUTTON_PIN); delay(50); buttonIsUp = digitalRead(BUTTON_PIN); if (buttonIsUp == buttonWasUp) { buttonWasUp=!buttonIsUp; digitalWrite(LED_PIN, !digitalRead(LED_PIN)); } if(irrecv.decode(&results)){ if(results.value == 0xFF629D) digitalWrite(LED_PIN, !digitalRead(LED_PIN)); irrecv.resume(); } }