Подключение IR приемника к Arduino, проблема с кнопкой.

den_389
Offline
Зарегистрирован: 20.12.2017

Привет, Друзья! Вот сел разбиратся с подключением ИК приемника к Arduino, первая статья в интеренете, взял оттуда код и залил на плату. Схема у меня простая лампочка и резистор. Задача чтоб пультом включать и выключать светодиод. Хотел вкл/выкл одной кнопкой пульта, но не тут то было. Светодиод не горит. Если назначить одну кнопку для включения другую для выключения так работает. Хочется место на пульте сэкономить. Кто знающий и умеет так делать подскажите нужен ваш совет!

<<< сам пульт

И еще сериал порт при нажатии кнопок, подсовывает дополнительный сигнал. Такой же есть и на похожем китайском пульте. Но при условии если кнопка длительно зажимается. А если нажимать короткими тычками то код сигнала один и тот же.

Это я нажимаю кнопку 1.

 Вот такой код не работает:

#include <IRremote.h> // подключаем библиотеку для IR приемника

IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
decode_results results;

void setup() // процедура setup
{
  irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
  
  pinMode(2, OUTPUT); // пин 13 будет выходом (англ. «output»)
  pinMode(A0, INPUT); // пин A0 будет входом (англ. «intput»)
  
  Serial.begin(9600); // подключаем монитор порта

  
}


void IR_remote () 
{
  if (irrecv.decode(&results)) // если данные пришли выполняем команды
  {
    Serial.println(results.value); // отправляем полученные данные на порт
    
 if (results.value == 16718055) { 
      
     digitalWrite(2, HIGH);
     
   }
   
 if (results.value == 16718055) { 
    
     digitalWrite(2, LOW);
     
   }  
    
   
    irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
  }
}

void loop() // процедура loop
{
  IR_remote ();
}

Вот такой код работатет, потому что кнопки вкл и выкл разные:

#include <IRremote.h> // подключаем библиотеку для IR приемника

IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
decode_results results;

void setup() // процедура setup
{
  irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
  
  pinMode(2, OUTPUT); // пин 13 будет выходом (англ. «output»)
  pinMode(A0, INPUT); // пин A0 будет входом (англ. «intput»)
  
  Serial.begin(9600); // подключаем монитор порта

  
}


void IR_remote () 
{
  if (irrecv.decode(&results)) // если данные пришли выполняем команды
  {
    Serial.println(results.value); // отправляем полученные данные на порт
    
 if (results.value == 16724175) { 
      
     digitalWrite(2, HIGH);
     
   }
   
 if (results.value == 16718055) { 
    
     digitalWrite(2, LOW);
     
   }  
    
   
    irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
  }
}

void loop() // процедура loop
{
  IR_remote ();
}

И все таки главный вопрос как включать и выключать светодиод одной кнопкой пульта. Любая информация по теме будет полезна. Спасибо за внимание)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
#include <IRremote.h> // подключаем библиотеку для IR приемника

IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
decode_results results;

void setup() // процедура setup
{
  irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
  
  pinMode(2, OUTPUT); // пин 13 будет выходом (англ. «output»)
  pinMode(A0, INPUT); // пин A0 будет входом (англ. «intput»)
  
  Serial.begin(9600); // подключаем монитор порта

  
}

void      ChangeLedState(void)
{
 static bool state = false;
 digitalWrite(2,state);
 state = !state;
}


void IR_remote () 
{
  if (irrecv.decode(&results)) // если данные пришли выполняем команды
  {
    Serial.println(results.value); // отправляем полученные данные на порт
    
 if (results.value == 16724175) { 
      
     ChangeLedState(); //digitalWrite(2, HIGH);
     
   }
   
    irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
  }
}

void loop() // процедура loop
{
  static long prev = 0;
 
  long now = millis();
  if ((now - prev)<200) return;
  prev = now;

  IR_remote ();
}

 

den_389
Offline
Зарегистрирован: 20.12.2017

Благодарю, DetSimen! Код работает.

Не могли бы вы пояснить суть конструкции:

 static long prev = 0;

  long now = millis();

  if ((now - prev)<200) return;

  prev = now;

Да, я не такой продвинутый поэтому не понял конструкцию и заметил что и без нее работает)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

это чтоб не опрашивать IR датчик чаще 200 миллисекунд. 

den_389
Offline
Зарегистрирован: 20.12.2017

Понял. Спасибо приятель!