IRremote и обработка удержания кнопки пульта ДУ

Тема в разделе "Глядите, что я сделал", создана пользователем Пушной звер, 22 ноя 2014.

  1. Пушной звер

    Пушной звер Оракул



    Код (Text):
    #include <IRremote.h> // https://github.com/shirriff/Arduino-IRremote

    #define RECV_PIN 11 // IR приемник
    #define OUT1 9// выхода на мосфеты
    #define OUT2 10

    #define POWER_KEY 0x40BF30CF // коды пульта ДУ
    #define KEY1 0x40BF7887 // v-
    #define KEY2 0x40BFF807 // v+
    #define KEY3 0xC03FC03F
    #define KEY4 0xC03F40BF

    byte analogData1, analogData2 = 0; // значения аналогово выхода
    uint32_t val;

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    void setup()
    {
      irrecv.enableIRIn();
    //Serial.begin(9600);
    }


    void loop() {
      if (irrecv.decode(&results)) { // если пришел пакет
        if (results.value != 0xFFFFFFFF){ // и этот пакет не FF
          val = results.value; // сохраняем правельный пакет в переменную  
        }                // если пришел FF, соответственно пропускаем.
       
        /// сверяем значение из переменной val.. если пришла команда повтора (пакет с FF)
        /// в переменной останется прошлый, правельный, пакет и код выполнится повторно.
        if (val == KEY1){    
          if (analogData1 != 0)analogData1--; // если шим не равно 0 отнимаем 1
          analogWrite(OUT1, analogData1);    // устанавливаем значение в выход  
        }  
        if (val == KEY2){ // и это вторая кнопка  
          if (analogData1 < 255) analogData1++; // если шим меньше 255 прибовляем 1
          analogWrite(OUT1, analogData1);  // устанавливаем значение
        }
        if (val == KEY4){    
          if (analogData2 != 0)analogData2--;
          analogWrite(OUT2, analogData2);    
        }  
        if (val == KEY3){    
          if (analogData2 < 255) analogData2++;
          analogWrite(OUT2, analogData2);
        }
         
        ///
        if (results.value == POWER_KEY) {
          if (analogData1 != 0 && analogData2 != 0){ // если ШИМ неравно 0
            analogWrite(OUT1, 0); // выключаем
            analogWrite(OUT2, 0);
            analogData1 = 0;
            analogData2 = 0;
          }
          else {
            analogWrite(OUT1, 255); // включаем
            analogWrite(OUT2, 255);
            analogData1 = 255;
            analogData2 = 255;
          }        
        }
           
    /*Serial.println(val, HEX); //// ТЕСТЫ!
    Serial.println(results.value, HEX);
    Serial.println(analogData1);
    Serial.println(analogData2);
    Serial.println();
    */
      irrecv.resume();
      }
    }
     
    resident82, robokop, altex и 2 другим нравится это.
  2. ИгорьК

    ИгорьК Давно здесь

    Надо добавить, что библиотека IRremote.h использует таймер, который блокирует ШИМ на 3 и 11 ноге. Попытка сделать нечто, типа analogWrite(3, 155); приводит, в основном, к зависанию.
     
    TotCambIKoka нравится это.
  3. Пушной звер

    Пушной звер Оракул

    да, и то что не все пульты шлют FF как повтор.
     
  4. Salk

    Salk Гик

    Не обязательно "FF". У меня китайский универсальный пульт, шлет один и тот же код при любой зажатой кнопке: "4294967295"
    Безымянный.jpg
    Применил ваш код для управления громкостью/нч/вч для акустики, чтобы пальцы не мозолить и каждый раз не нажимать одну и ту же кнопку. Все работает, спасибо !
    Код (Text):
    uint32_t val;

    if (irrecv.decode(&results))
      {
        if (results.value != 4294967295)
        {
          val = results.value; // сохраняем правельный пакет в переменную
        }
        // громкость
        if (val == 587783) //Код кнопки (пусть это громкость плюс)
        {
          if (vol < 127)
            vol = vol + VOLUME_STEP; // Шаг
          setVolume(vol);
        }
        if (val == 525053) //Код 2 кнопки (пусть это громкость минус)
        {
          if (vol > 0)
            vol = vol - VOLUME_STEP;
          setVolume(vol);
        }
     
  5. robokop

    robokop Гик

    Скажите пожалуйста , Пушной зверь , а каким кнопкам принадлежат эти коды вашего пульта- 0xC03FC03F,
    0xC03F40BF. Просто у меня пульт точно такой же , а IDE не хочет читать программу для считывания кодов кнопок !
     
  6. Пушной звер

    Пушной звер Оракул

    так если оно не работает, как знание что те кнопки влево и вправо помогут?
    если IRrecvDemo не работает, то дело явно не в пульте.
     
  7. robokop

    robokop Гик

    у меня есть работающий скетч для управления ардуино с помощью ИК пульта , но я не могу узнать коды кнопок - IDE не читает IRrecvDemo . А у вас пульт точно такой же как у меня. Я просто вставлю в свой скетч ваши коды кнопок !!! :):):)
     
  8. utevaugu36

    utevaugu36 Нуб

    облазил все форумы по поводу проблемы конфликтования Neopixel(ws2812b) и IR пульта. Лента выключает прерывания, пульт включает. В итоге получается бардак. Может кто-то сталкивался с подобной проблемой?
     
  9. a1000

    a1000 Гик

    Покажите ваш работающий скетч.