Помогите начинающему

Тема в разделе "Arduino & Shields", создана пользователем PRIUS, 17 сен 2020.

  1. PRIUS

    PRIUS Нерд

    Доброго времени суток!
    Модератору корзину добра.
    Пока скетч только на командах какие знаю, из уроков программирования, которые были нууу ооочень давно, другие команды пока не знаю, но по-тихому начинаю познавать. С библиотеками тоже начинаю разбираться, но продвигается очень тяжело.

    Все цифры с пульта работают почти нормально.

    Почему код приходит иногда другой, это указано в условии "OR" в некоторых цифрах.

    Постоянное горение светодиодов работает нормально, как только делаешь любую моргушку, как записано на восьмой кнопке, цикл повторяется один раз и все гаснет. Что с этим можно сделать? Интернет перерыл, не могу понять. Если что-то можно сделать то плиз закоментите. Скетч прилагаю.

    Спасибо.

    Код (C++):
    #include <IRremote.h>
    int red=9;
    int green=13;
    int blue=10;
    int RECV_PIN = A1;
    IRrecv irrecv(RECV_PIN);
    decode_results results;
    void setup()
    { pinMode (red,OUTPUT);
      pinMode (blue,OUTPUT);
      pinMode (green,OUTPUT);
      Serial.begin(9600);
      Serial.println("Enabling IRin");
      irrecv.enableIRIn();
      Serial.println("Enabled IRin");}
    void loop() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        irrecv.resume();  
        if(results.value==0xFF30CF or results.value==0x9716BE3F)// на еденичке
        {
         digitalWrite(red,HIGH);
          digitalWrite(green,LOW);
            digitalWrite(blue,LOW);
      }
       else if(results.value==0xFF18E7)// на двоичке
       {
         digitalWrite(red,LOW);
          digitalWrite(green,HIGH);
            digitalWrite(blue,LOW);
    }
    else if(results.value==0xFF7A85)// на троичке
    {
        digitalWrite(red,LOW);
          digitalWrite(green,LOW);
             digitalWrite(blue,HIGH);
    }
    else if(results.value==0xFF10EF)// на четверочке
    {
        digitalWrite(red,HIGH);
          digitalWrite(green,HIGH);
             digitalWrite(blue,HIGH);
      }
    else if(results.value==0xFF6897 or results.value==0xC101E57B  )// на нуле
    {
        digitalWrite(red,LOW);
          digitalWrite(green,LOW);
             digitalWrite(blue,LOW);
      }
    else if(results.value==0xFF38C7)// на на пятерочке
    {
        digitalWrite(red,HIGH);
          digitalWrite(green,HIGH);
             digitalWrite(blue,LOW);
      }
    else if(results.value==0xFF5AA5 or results.value==0x449E79F)// на шетерочке
    {
        digitalWrite(red,HIGH);
          digitalWrite(green,LOW);
             digitalWrite(blue,HIGH);
      }
    else if(results.value==0xFF42BD)// на семерочке
    {
        digitalWrite(red,LOW);
          digitalWrite(green,HIGH);
             digitalWrite(blue,HIGH);

    }
    else if(results.value==0xFF4AB5)// на восьмёрочке

    {
      digitalWrite(red,LOW);
          digitalWrite(green,LOW);
             digitalWrite(blue,LOW);        
      digitalWrite(red, HIGH);
      delay(1000);
      digitalWrite(red, LOW);
      delay(1000);
    }
    }

      }
     
  2. parovoZZ

    parovoZZ Гуру

    кучу else if можно заменить на switch case
     
    Igor68 нравится это.
  3. PRIUS

    PRIUS Нерд

    Пока не разобрался как это работает, но на верном пути.
     
  4. asam

    asam Гик

    А как это должно работать? Нажал/отпустил и оно моргает пока другую кнопку не нажмешь? Или должно моргать пока кнопку жмешь?
     
  5. PRIUS

    PRIUS Нерд

    Нажал/отпустил и оно моргает пока другую кнопку не нажмешь и включается другой режим.
     
  6. asam

    asam Гик

    Ну можно вот так, например:

    Код (C++):
    #include <IRremote.h>
    #include <TimerOne.h>
    int red = 9;
    int green = 13;
    int blue = 10;
    int RECV_PIN = A1;
    volatile bool blinking = false;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void blinkfn()
    {
      static bool state = false;
      if (! blinking)
        return;
      state =  ! state;
      digitalWrite(red, state);
    }

    void setup()
    { pinMode (red, OUTPUT);
      pinMode (blue, OUTPUT);
      pinMode (green, OUTPUT);
      Serial.begin(9600);
      Serial.println("Enabling IRin");
      irrecv.enableIRIn();
      Serial.println("Enabled IRin");
      Timer1.initialize(1000000);            //Настраиваем таймер на прерывания раз в секунду
      Timer1.attachInterrupt(blinkfn);
    }
    void loop() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        irrecv.resume();
        blinking = false;
        if (results.value == 0xFF4AB5) // на восьмёрочке
        {
          digitalWrite(red, LOW);
          digitalWrite(green, LOW);
          digitalWrite(blue, LOW);
          blinking = true;
        }
        if (results.value == 0xFF30CF or results.value == 0x9716BE3F) // на еденичке
        {
          digitalWrite(red, HIGH);
          digitalWrite(green, LOW);
          digitalWrite(blue, LOW);
        }
        else if (results.value == 0xFF18E7) // на двоичке
        {
          digitalWrite(red, LOW);
          digitalWrite(green, HIGH);
          digitalWrite(blue, LOW);
        }
        else if (results.value == 0xFF7A85) // на троичке
        {
          digitalWrite(red, LOW);
          digitalWrite(green, LOW);
          digitalWrite(blue, HIGH);
        }
        else if (results.value == 0xFF10EF) // на четверочке
        {
          digitalWrite(red, HIGH);
          digitalWrite(green, HIGH);
          digitalWrite(blue, HIGH);
        }
        else if (results.value == 0xFF6897 or results.value == 0xC101E57B  ) // на нуле
        {
          digitalWrite(red, LOW);
          digitalWrite(green, LOW);
          digitalWrite(blue, LOW);
        }
        else if (results.value == 0xFF38C7) // на на пятерочке
        {
          digitalWrite(red, HIGH);
          digitalWrite(green, HIGH);
          digitalWrite(blue, LOW);
        }
        else if (results.value == 0xFF5AA5 or results.value == 0x449E79F) // на шетерочке
        {
          digitalWrite(red, HIGH);
          digitalWrite(green, LOW);
          digitalWrite(blue, HIGH);
        }
        else if (results.value == 0xFF42BD) // на семерочке
        {
          digitalWrite(red, LOW);
          digitalWrite(green, HIGH);
          digitalWrite(blue, HIGH);

        }

      }

    }
     
  7. PRIUS

    PRIUS Нерд

    мало что понял, но буду разбираться. если заработает спасибо.
     
  8. PRIUS

    PRIUS Нерд

    ничего не получилось. моргания так и нет
     
  9. parovoZZ

    parovoZZ Гуру

  10. Limoney

    Limoney Гик

    Это нормально, работает, как написали без моргания. Не используйте delay
     
  11. b707

    b707 Гуру

    а сколько он раз должен повторятся, если у вас и цикла никакого нет? Как написано - один раз моргнуть - ровно так и работает
     
  12. b707

    b707 Гуру

    его и не будет, в представленном коде нет моргания вовсе.

    Подобная задача решается не так.

    1. Для начала найдите пример "блинк без delay()" и разберитесь, как он работает. Напишите на его основе код мигания светодиодом, проверьте его работу.

    2. Потом добавьте к миганию код отработки кнопки (обычной. не радио). смысл в том, что кнопка должна опрашиватся одновременно с миганием, поэтому в коде НЕДОПУСТИМО использовать операторы delay(). Кнопка должна прекращать мигание, если светодиод мигает - или запускать снова, если мигание остановлено. Для этого вам придется изучить такое понятие, как "флаги".

    3. Теперь замените обычную кнопку на считаывание кода с радиопульта
     
    Daniil, arkadyf и issaom нравится это.