ir и кнопка совместная работа
- Войдите на сайт для отправки комментариев
Вс, 31/08/2014 - 20:24
здравствуйте, нужна помощь, мучаюсь уже неделю над простым для кого то кодом, и не могу добиться результата
хочу сделать чтобы свет включался от пульта, но осталась возможность включать с выключателя, сотни раз переделывал разные коды, но радобает либо от пульта, либо от кнопки, а вместе никак. в чем я ошибаюсь? заранее спасибо))
#include <IRremote.h>
int RECV_PIN = 11; //vkhod IK priyemnika
const int buttonPin = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
int a=0; // peremennaya pereklyucheniya rezhima , pri nazhatii knopki ona prinimayet znacheniye +1
int b=0;
void setup()
{
irrecv.enableIRIn(); // vklyuchit? priyemnik
pinMode(13, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop()
{
if (digitalRead (buttonPin == HIGH))
{
(b=b+1);
}
else {b=0;}
if (irrecv.decode(&results)) {
delay(300); // zaderzhka pered vypolneniyem opredeleniya knopok , chtoby izbezhat? bystroye dvoynoye nazhatiye
if (results.value == 0xFF1AE5) {a=a+1;} // obrabotka nazhitya klavishi , zdes? peremennaya prinimayet znacheniye +1
if (a==1 || b==1)
{digitalWrite(13, HIGH);}
else {digitalWrite(13, LOW); a=0;}
{ //
delay(50); //pauza mezhdu povtorami //
} //
irrecv.resume(); //
}
}
Сведите a и b в одну переменную, причем не int, а boolean
не знаю в том направлении я шел как мне сказали или нет, но зажечь диод получилось(причем как и хотел зажигается и кнопкой и пультом), только он не тухнет блин XD что куда добавить??
#include <IRremote.h> int RECV_PIN = 11; //vkhod IK priyemnika int buttonPin = 2; IRrecv irrecv(RECV_PIN); decode_results results; boolean a=false; // peremennaya pereklyucheniya rezhima , pri nazhatii knopki ona prinimayet znacheniye +1 boolean c=false; boolean b=false; void setup() { irrecv.enableIRIn(); // vklyuchit? priyemnik pinMode(13, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { if (irrecv.decode(&results)) { delay(300); if (results.value == 0xFF1AE5) {b=true;}{ delay(50); } irrecv.resume(); } c = digitalRead(buttonPin); if (c == true&&b==false) { b=true; } if (b==true) { digitalWrite(13, HIGH); b=false; } if (c == true&&b==true) { digitalWrite(13, LOW); } }причем если boolean поменять на int, то работать не будет
#include <IRremote.h> int RECV_PIN = 11; //vkhod IK priyemnika int buttonPin = 2; IRrecv irrecv(RECV_PIN); decode_results results; boolean a=false; // peremennaya pereklyucheniya rezhima , pri nazhatii knopki ona prinimayet znacheniye +1 int c=0; int b=0; void setup() { irrecv.enableIRIn(); // vklyuchit? priyemnik pinMode(13, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { if (irrecv.decode(&results)) { delay(300); if (results.value == 0xFF1AE5) {b=0;}{ delay(50); } irrecv.resume(); } c = digitalRead(buttonPin); if (c == 1&&b==0) { b=1; } if (b==1) { digitalWrite(13, HIGH); b=0; } if (c == 1&&b==1) { digitalWrite(13, LOW); } }причем если boolean поменять на int, то работать не будет
Вот как раз boolean будет работать как надо
Для
есть два режима: true - свет включен и false - свет выключен, а для переключения достаточно
... и получается что-то типа так:
if (digitalRead (buttonPin == HIGH)) on_status=!on_status; if (irrecv.decode(&results)) { delay(300); if (results.value == 0xFF1AE5) on_status=!on_status; delay(50); //pauza mezhdu povtorami // irrecv.resume(); // } digitalWrite(13, on_status);спасибо большое, все заработало)) только странно срабатывает, может с первого раза, а может только с третьего, почему так получается?
#include <IRremote.h> int RECV_PIN = 11; //vkhod IK priyemnika int buttonPin = 2; IRrecv irrecv(RECV_PIN); decode_results results; boolean c=false; boolean b=false; boolean on_status=false; void setup() { irrecv.enableIRIn(); // vklyuchit? priyemnik pinMode(13, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { if (irrecv.decode(&results)) { delay(300); if (results.value == 0xFF1AE5) {b=true;}{ delay(50); } irrecv.resume(); } on_status=!on_status; c = digitalRead(buttonPin); if (c == true&&b==false) { b=true; } if (b==true) { digitalWrite(13, on_status); b=false; } }должен нормально срабатывать. может дребезг контактов мешает
можно вот так сделать:
только странно срабатывает, может с первого раза, а может только с третьего, почему так получается?
с этими b и c и не такой полтергейст может быть
дребезг контактов это на кнопке, а на пульте должно нормально срабатывать.... что то с кодом не то,
добавил delay, но все равно через раз как то срабатывает
буду мучать код))
ну, можно натыкать в код Serial.print, и посмотреть что происходит
вобщем все оказалось легче чем я думал. просто открыл пример Debounce и совсестил с библиотекой IR. и без каких либо переменных b и с
vdk, спасибо за помощь, иногда просто мозг замучивается))), и в итоге сам придумываю себе проблемы)
мож кому пригодится
#include <IRremote.h> int RECV_PIN = 11; const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; int ledState = HIGH; // the current state of the output pin int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin long lastDebounceTime = 0; // the last time the output pin was toggled long debounceDelay = 50; // the debounce time; increase if the output flickers IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); } void loop() { if (irrecv.decode(&results)) { delay(300); if (results.value == 0xFF1AE5) ledState = !ledState; delay(50); //pauza mezhdu povtorami // irrecv.resume(); } int reading = digitalRead(buttonPin); if (reading != lastButtonState) { lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { if (reading != buttonState) { buttonState = reading; if (buttonState == HIGH) { ledState = !ledState; } } } digitalWrite(ledPin, ledState); lastButtonState = reading; }