Помогите разобраться с ик пультом и светодиодом

Тема в разделе "Arduino & Shields", создана пользователем Ard14, 12 окт 2022.

  1. Ard14

    Ard14 Нуб

    Здравствуйте. Хочу чтобы светодиод при нажатии кнопки пульта ик начинал мигать, но не совсем до понимаю суть работы с ИК датчиком. Направьте меня в нужную сторону, пожалуйста. Данный код не работает

    Код (C++):
    #include "IRremote.h"
    IRrecv irrecv(6);
    decode_results results;
    byte led_pin = 3;
    int led_status = LOW;
    unsigned long last_time;
    void setup() {
      pinMode(3, OUTPUT);
      irrecv.enableIRIn(); // запускаем прием
    }

    void loop() {
      if ( irrecv.decode( &results )) {
        switch(results.value){
          case 0xFFA25D:
          if(millis() - last_time > 500){
            last_time = millis();
            if(led_status == LOW){
              led_status = HIGH;}
            else{
              led_status = LOW;}}
            break;}
      irrecv.resume();
      }
    }
     
    Последнее редактирование: 13 окт 2022
  2. fogary

    fogary Гик

    Значение led_status Вы меняете, а состояние пина - нет. Где у Вас digitalWrite()?
    Переменная last_time изначально никак не инициализирована. Хотя бы 0 присвойте, т. е. unsigned long last_time = 0;.
     
  3. Ard14

    Ard14 Нуб

    digitalWrite забыл написать когда вставлял код

    Код (C++):
    #include "IRremote.h"
    IRrecv irrecv(6);
    decode_results results;
    byte led_pin = 3;
    int led_status = LOW;
    unsigned long last_time = 0;
    void setup() {
      pinMode(3, OUTPUT);
      irrecv.enableIRIn(); // запускаем прием
    }

    void loop() {
      if ( irrecv.decode( &results )) {
        switch(results.value){
          case 0xFFA25D:
          if(millis() - last_time > 500){
            last_time = millis();
            if(led_status == LOW){
              led_status = HIGH;}
            else{
              led_status = LOW;
            digitalWrite(led_pin, led_status);}}
            break;}
      irrecv.resume();
      }
    }
     
  4. Ard14

    Ard14 Нуб

    Такой код не работает. Как его дописать, с чего начать мне начать разбираться?
     
  5. Airbus

    Airbus Радиохулиган Модератор

    С чтения умных книжек наверное?
     
  6. Ard14

    Ard14 Нуб

    Вы можете сказать, почему данный код не работает именно с ик пультом? Заранее спасибо
     
  7. fogary

    fogary Гик

    digitalWrite() вставили в ветку else.

    Вы как нажимаете кнопку на пульте: нажали и держите, или нажали и отпустили?
    Если второе, то светодиод мигать не будет. Догадаетесь почему?

    Т. е. с обычной кнопкой он работает?
     
  8. Ard14

    Ard14 Нуб

    Ну с обычной кнопки да, только разумеется без switch и case, я говорю просто про тактовую кнопку и светодиод
     
  9. Ard14

    Ard14 Нуб

    Кнопку нажимаю и отпускаю
     
  10. fogary

    fogary Гик

    Возмите рабочий код для кнопки, замените кнопку на пульт (без switch и case) и проверьте.
     
  11. Airbus

    Airbus Радиохулиган Модератор

    А где там в коде кнопка? Код работает именно так как написан
     
  12. Ard14

    Ard14 Нуб

    Кнопка таким у меня образом прописана

    Код (C++):
    if (условие){
    digitalWrite( led_pin, millis() / 500 %2);}
     
     
  13. Bott

    Bott Гик

    У Вас какая то бредятина написана. Все три куска кода разные и все нерабочие. Если сами не хотите разбираться то хотя бы погуглите или откройте примеры из библиотеки. Тут ничего сложного. Это работает примерно так
    Код (C++):
    #include <IRremote.h>

    int RECV_PIN = 6; //вход ИК приемника
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    int LED = 8;

    void setup()

    {
    irrecv.enableIRIn(); // включить приемник
    pinMode(LED, OUTPUT);
    }

    void loop() {

    if (irrecv.decode(&results))
    {
      if (results.value == 0x2FD807F) //код моей кнопки "2FD807F". У Вас он будет свой
      {
        digitalWrite(LED, HIGH); // здесь можно не только зажигать но и мигать свистеть пердеть
      }
        if (results.value == 0x2FD40BF)//код моей кнопки "2FD40BF". У Вас он будет свой
        {
          digitalWrite(LED, LOW); // здесь тоже можно делать все что в голову взбредет
        }
    irrecv.resume();
    }
    }
     
    parovoZZ нравится это.
  14. Ard14

    Ard14 Нуб

    Чтобы сделать данный алгоритм нужно программировать как обычную кнопку?
     
  15. Bott

    Bott Гик

    Програмировать кого? Или чаво? Ардуино? Естественно надо
     
  16. parovoZZ

    parovoZZ Гуру

    для начала надо взять лист бумаги и нарисовать алгоритм. Без умения строить алгоритм работы программы в программировании делать нечего.
     
    Airbus нравится это.
  17. Airbus

    Airbus Радиохулиган Модератор

    [​IMG]
     
    mednagolov и DetSimen нравится это.
  18. mednagolov

    mednagolov Гик

    А вы точно уверены, что дело в коде?
    Проверте действительно ли рабочий пульт? правильно ли подключен IRприёмник?
    Пультик проверяем так- берём телефон, и запускаем видеокамеру. Жмем кнопку на пульте и через телефон смотрим на светодиод пульта. Дело в том , что глазом ИК излучение пульта не видно, но камера телефона его прекрасно видит...
    Второе - ИК приемник как у вас подключен? и какой ?
    Я свой сначала подключал как указывалось на сайте robotclas (там же его и покупал) , и тоже ничего не мог добиться.... ничего не работало. Оказывается там в описании перепутаны назначения выводов! вот такой вот косяк!
    Если ИК-датчик VS1838B то правильно подключайте так
    ИКдатчик подключение.JPG
    Потом грузите на ардуинку простой скетч , чтоб проверить что всё работает.
    Код (C++):
    #include "IRremote.h"
    IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
    decode_results results;
    void setup() {
    Serial.begin(9600); // выставляем скорость COM порта
    irrecv.enableIRIn(); // запускаем прием
    }
    void loop() {
    if ( irrecv.decode( &results )) { // если данные пришли
    Serial.println( results.value, HEX ); // печатаем данные
    irrecv.resume(); // принимаем следующую команду
    }
    }
     
  19. mednagolov

    mednagolov Гик

    в COM порте будут печататься коды нажимаемых на пульте кнопок.
     
  20. parovoZZ

    parovoZZ Гуру

    увидит, если не стоит ИК фильтр. Чаще он там стоит....