ir и кнопка совместная работа

vannno
Offline
Зарегистрирован: 31.08.2014

здравствуйте, нужна помощь, мучаюсь уже неделю над простым для кого то кодом, и не могу добиться результата

хочу сделать чтобы свет включался от пульта, но осталась возможность включать с выключателя, сотни раз переделывал разные коды, но радобает либо от пульта, либо от кнопки, а вместе никак. в чем я ошибаюсь? заранее спасибо))


#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(); // 
}
}

 

vdk
Offline
Зарегистрирован: 14.04.2013

Сведите a и b в одну переменную, причем не int, а boolean

vannno
Offline
Зарегистрирован: 31.08.2014

не знаю в том направлении я шел как мне сказали или нет, но зажечь диод получилось(причем как и хотел зажигается и кнопкой и пультом), только он не тухнет блин 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); 
  }
}


 

vdk
Offline
Зарегистрирован: 14.04.2013

vannno пишет:

причем если boolean поменять на int, то работать не будет

Вот как раз boolean будет работать как надо

Для



boolean on_status

есть два режима: true - свет включен и false - свет выключен, а для переключения достаточно

on_status=!on_status;
digitalWrite(13, on_status);

 

vdk
Offline
Зарегистрирован: 14.04.2013

... и получается что-то типа так:

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);

 

vannno
Offline
Зарегистрирован: 31.08.2014

спасибо большое, все заработало)) только странно срабатывает, может с первого раза, а может только с третьего, почему так получается?

#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;
  } 
  }

 

vdk
Offline
Зарегистрирован: 14.04.2013

должен нормально срабатывать. может дребезг контактов мешает

можно вот так сделать:

digitalWrite(13, on_status);
delay (500);

 

vdk
Offline
Зарегистрирован: 14.04.2013

vannno пишет:

только странно срабатывает, может с первого раза, а может только с третьего, почему так получается?

с этими b и c и не такой полтергейст может быть

vannno
Offline
Зарегистрирован: 31.08.2014

дребезг контактов это на кнопке, а на пульте должно нормально срабатывать.... что то с кодом не то, 

добавил delay, но все равно через раз как то срабатывает

буду мучать код))

vdk
Offline
Зарегистрирован: 14.04.2013

ну, можно натыкать в код Serial.print, и посмотреть что происходит

vannno
Offline
Зарегистрирован: 31.08.2014

вобщем все оказалось легче чем я думал. просто открыл пример 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;
}