ИК управление реле

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

Приветствую. Помогите чайнику разобраться. Есть кусок кода управления реле ИК пультом.

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

IRrecv irrecv(2); //  пин IR приемника
decode_results results;

void setup() // процедура setup
{
  irrecv.enableIRIn();  // запускаем прием
   
  pinMode(8, OUTPUT); 
   }
void loop() 
{
  if (irrecv.decode(&results)) // читаем
  {
 // включаем если получен сигнал 
  
     if (results.value == 0xFF02FD)  
     digitalWrite(8, HIGH);
   }
}

Научите как изменить код чтобы работал алгоритм : держишь кнопку - вкл, отпустил - выкл. нужна работа 3 выходов от трёх кнопок

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Между строками 20 и 21 явно не хватает resume

Nikolaj666 пишет:
держишь кнопку - вкл, отпустил - выкл. нужна работа 3 выходов от трёх кнопок

Это не так просто, как Вам, возможно кажется. При удержании кнопки, Вы будете снова и снова получать коды повторения. Вам нужно их обрабатывать, а если в течение заданного интервала код не пришёл - выполнять действие по "отпусканию" кнопки

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

ЕвгенийП пишет:

Между строками 20 и 21 явно не хватает resume

Nikolaj666 пишет:
держишь кнопку - вкл, отпустил - выкл. нужна работа 3 выходов от трёх кнопок

Это не так просто, как Вам, возможно кажется. При удержании кнопки, Вы будете снова и снова получать коды повторения. Вам нужно их обрабатывать, а если в течение заданного интервала код не пришёл - выполнять действие по "отпусканию" кнопки

я по этому и не справился. а если чтоб при нажатии пульта происходило включение на пол-секунды. объясню для чего это нужно. собрал часы на ГРИ ИН14. управление тремя тактовыми кнопками. хочу прикрутить на ардуино про мини пульт.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nikolaj666 пишет:

я по этому и не справился. 

Вы не поэтому не справились, а потому что даже не попытались справиться - даже не попробовали.

Могу подсказать с чего начать:

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

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

ну это я знаю. первый раз проходит код кнопки, а потом идёт защита от дребезга

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Nikolaj666 пишет:

ну это я знаю. первый раз проходит код кнопки, а потом идёт защита от дребезга

Не знаете. Это не защита от дребезга, а код повтора. Который означает, что нажатая кнопка удерживается.

Сделайте так, как написал ЕвгенийП в посте #3

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nikolaj666 пишет:

 а потом идёт защита от дребезга

Перестаньте бредить

Nikolaj666 пишет:

ну это я знаю. 

Ну, я же Вам сказал "сделайте. посмотрите и подумайте - решение придёт".

Вы не хотите делать, т.к. и так всё знаете. Ну, знаете, так и решайте проблему, за чем дело-то стало?

 

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

 я новичёк, спрашиваю совета. мог и не так выразится. чего сразу нервничать ? у Вас сразу всё получалось ?

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы сделали то, что сказал? Если сделали, давайте сюда лог из сериала (скопипастите). Если нет, то решайте свою проблему сами, раз Вы лучше знаете что нужно делать. а что нет.

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

0xFF629D
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
 

так ?

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

если сделать вот так то очень похоже на щелчёк механической кнопки.

  irrecv.enableIRIn();  
  pinMode(8, OUTPUT); 
}

void loop() // 

{
  if (irrecv.decode(&results)) 
  {

 
     
     if (results.value == 0xFF629D) { 
     digitalWrite(8, HIGH);
   }
   delay(20);

 
     if (results.value == 0xFF629D) { 
     digitalWrite(8, LOW);
   }
   
    irrecv.resume(); 
    
}
}

что бы два канала добавить нужно последовательно ещё два  раза прописать с другими кодами ?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nikolaj666 пишет:

0xFF629D
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
0xFFFFFFFF
 

так ?

Нет. Я же Вам писал (Вы вообще читаете?) "Запустите, нажимайте пульт, держите, отпускайте". Вот в этом месте где Вы отпустили кнопку? Сделайте подобный лог с пометками "здесь нажал", "здесь отпустил". И в каждой строке, в плюс к коду лучше печатать значения millis(), чтобы понятен был масштаб времени. Смысл этой работы - всё видеть! А что видно на Вашем кусочке? 

Только мне то это сразу выкладывать не надо. Сами сначала подумайте, а уж если никак, то выкладывайте.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nikolaj666 пишет:

что бы два канала добавить нужно последовательно ещё два  раза прописать с другими кодами ?

Давайте, Вы сначала один сделаете. А там глядишь и вопросв поубавится.

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

 

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

 #include <IRremote.h>      // библиотека для ИК
    int RECV_PIN = 11;      // pin ИК приемника
    IRrecv irrecv(RECV_PIN);      //  объект получения сигнала 
    decode_results results;      // переменная хранящая результат
    int relay1 = 8;      // pin кнопки меньше 
    int relay2 = 7;      // pin кнопки ОК
    int relay3 = 9;      // pin кнопки больше
    void setup() {
       irrecv.enableIRIn();      // включаем ИК-приемник
       pinMode(relay1, OUTPUT);      //  - выход
       pinMode(relay2, OUTPUT);      //  - выход
       pinMode(relay3, OUTPUT);      //  - выход
    }

    void loop() {
       if (irrecv.decode(&results)) {      // если есть сигнал
          if (results.value == 0xFF22DD) {      
             digitalWrite(relay1, HIGH);      // нажатие
          delay (200);
             digitalWrite(relay1, LOW);      // оттпускание
          }
          irrecv.resume();      // получаем следующее значение
       }
      if (irrecv.decode(&results)) {      // если есть сигнал
          if (results.value == 0xFF02FD) {     
             digitalWrite(relay2, HIGH);      // нажатие
          delay (200);
             digitalWrite(relay2, LOW);      // отпускание
          }
          irrecv.resume();      // получаем следующее значение
       } 
       if (irrecv.decode(&results)) {      // если есть сигнал
          if (results.value == 0xFFC23D) {      
             digitalWrite(relay3, HIGH);      // нажатие
          delay (200);
             digitalWrite(relay3, LOW);      // отпускание
          }
          irrecv.resume();      // получаем следующее значение
       }
    }