Помогите с программной частью!

Тема в разделе "Arduino & Shields", создана пользователем Danko, 5 ноя 2017.

  1. Danko

    Danko Нуб

    дело вот в чем я создаю "ночник"(не знаю как ещё сказать) и у меня возникли проблемы с программированием
    вот код:
    Код (C++):
    #include <boarddefs.h>
    #include <IRremote.h>
    #include <IRremoteInt.h>
    #include <ir_Lego_PF_BitStreamEncoder.h>
    #define BLUE 9
    #define RED 10
    #define GREEN 8
    #define GUARD 11
    int r = 0;
    int m = 0;
    IRrecv irrecv(A0); // указываем пин, к которому подключен IR приемник
    decode_results results;


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

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

      if (irrecv.decode(&results)) // если данные пришли выполняем команды
      {
        Serial.println(results.value); // отправляем полученные данные на порт
       
    // включаем и выключаем светодиоды, в зависимости от полученного сигнала  
       
         if (results.value == 1 or 2049) {
        m = 1;
      }
     
         if (results.value == 2 or 2050) {
        m = 2;
      }
      while(m == 1)
      {
        if (irrecv.decode(&results)) // если данные пришли выполняем команды
      {
         Serial.println(results.value);
        if (results.value == 3021076190) {
         r = 1;
       }
         if (results.value == 3713206319) {
          r=0;
       }
         if (results.value == 4014923603 && r == 1) {
         digitalWrite(GREEN, HIGH);
       }
         if (results.value == 3763387878) {
         digitalWrite(GREEN, LOW);
       }
         if (results.value == 4031701222 && r == 1) {
         digitalWrite(BLUE, HIGH);
       }
         if (results.value == 3746610259) {
         digitalWrite(BLUE, LOW);
       }
         if (results.value == 1599490922 && r == 1) {
         digitalWrite(RED, HIGH);
       }
         if (results.value == 139672439) {
         digitalWrite(RED, LOW);
       }
         if (r == 1){
         digitalWrite(GUARD,HIGH);
       }
         if (r == 0){
         digitalWrite(GUARD,LOW);
       }
         if (results.value == 2 or 2050) {
        m = 2;
       }  
        irrecv.resume();
        }  
      }
      while(m == 2)
      {
        if (irrecv.decode(&results)) // если данные пришли выполняем команды
      {
         Serial.println(results.value);
        if (results.value == 4014923603) {
         digitalWrite(GREEN, HIGH);
       }
         if (results.value == 3763387878) {
         digitalWrite(GREEN, LOW);
       }
         if (results.value == 4031701222) {
         digitalWrite(BLUE, HIGH);
       }
         if (results.value == 3746610259) {
         digitalWrite(BLUE, LOW);
       }
         if (results.value == 1599490922) {
         digitalWrite(RED, HIGH);
       }
         if (results.value == 139672439) {
         digitalWrite(RED, LOW);
       }
         if (r == 1){
         digitalWrite(GUARD,LOW);
       }
         if (results.value == 1 or 2049) {
        m = 1;
       }
        irrecv.resume();
        }
      }
      }
    }
       
    когда я задаю в while(m == 1) 2 он у меня не переходит на другой while
     
  2. Unixon

    Unixon Оракул Модератор

    Это что еще такое?
    Код (C++):
    if ((results.value==1) || (results.value==2049))
    Дальше аналогично.
     
    arkadyf нравится это.
  3. Unixon

    Unixon Оракул Модератор

    Еще лучше при сравнении писать константу впереди:
    Код (C++):
    if (1==x) { }
    Тогда, если вы вдруг опечатаетесь и вместо "==" напишете "=", компилятор это не пропустит.
     
    arkadyf нравится это.
  4. NikitOS

    NikitOS Public enemy Администратор

    if (results.value == 1 or 2049) {
    m = 1;
    }

    if (results.value == 2 or 2050) {
    m = 2;
    }


    Что это за бред?!
     
    Tomasina нравится это.
  5. Danko

    Danko Нуб

    у тебя здесь ошибка там не так надо было написать, а вот так
    Код (C++):
    if (results.value==1 || results.value==2049)
    , и огромное спасибо, оно заработало!
     
  6. Unixon

    Unixon Оракул Модератор

    Это не ошибка, это подстраховка :)
     
    arkadyf нравится это.
  7. Danko

    Danko Нуб

    я таким образом хочу сделать переключение режимов , а если ты насчет
    Код (C++):
    if (results.value == 2 or 2050)
    то это управление с пульта
     
  8. NikitOS

    NikitOS Public enemy Администратор

    2 or 2050

    Я об этом
     
    Tomasina нравится это.
  9. DIYMan

    DIYMan Guest

  10. DetSimen

    DetSimen Guest

    А вот это
    (results.value==2 or 2050)

    всегда дает true, независимо от results.value
     
  11. Airbus

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

    А switch case не лучше?
     
    NikitOS нравится это.
  12. Unixon

    Unixon Оракул Модератор

  13. DIYMan

    DIYMan Guest

    Ну да. Я просто написал, что вполне законно исользовать паскакалевский подход и писать диграфами, если уж вдруг читабельность важна. Как по мне - никогда их не юзаю, по причине хотя бы того, что "||" написать гораздо быстрее, чем "or". Да и привычнее намного.
     
  14. brokly

    brokly Гик

    С точки зрения "красивости" кода - ДА.
    Код (C++):
    uint8_t i=0;

    void setup() {
      Serial.begin(19200);
    }

    void loop() {
      uint8_t k=Serial.read();

      switch(k){
        case 1: i+=3;
        case 3: i+=7;
        case 7: i+=2;
        case 15: i+=9;
      }

      Serial.println(i);
    }

    Скетч использует 1700 байт (5%) памяти устройства. Всего доступно 30720 байт.
    С любой другой точки зрения - НЕТ.
    Код (C++):
    uint8_t i=0;

    void setup() {
      Serial.begin(19200);
    }

    void loop() {
      uint8_t k=Serial.read();

      if (1==k){
         i+=3;
      } else if (3==k){
         i+=7;
      } else if (7==k){
         i+=3;
      } else if (15==k){
         i+=9;
      }

      Serial.println(i);
    }

    Скетч использует 1666 байт (5%) памяти устройства. Всего доступно 30720 байт.
    Кейс сожрал лишние 34 байта. Зачем покупать дороже, если результат одинаков ?
     
  15. DIYMan

    DIYMan Guest

    break забыл после каждого case ;)
     
  16. brokly

    brokly Гик

    Согласен :) Правда, в данном случае это роли не играет :)

    Код (C++):
    void setup() {
      Serial.begin(19200);
    }

    void loop() {
      uint8_t k=Serial.read();

      switch(k){
        case 1:
           i+=3;
        break;
        case 3:
           i+=7;
        break;
        case 7:
           i+=2;
        break;
        case 15:
           i+=9;
        break;
      }

      Serial.println(i);
    }

    Скетч использует 1684 байт (5%) памяти устройства. Всего доступно 30720 байт.
     
    Все равно есть экономия.
     
  17. DIYMan

    DIYMan Guest

    А последний break если убрать - будет экономия? ;) В смысле - в case 15 break уже не нужен, фактически ;)
     
  18. brokly

    brokly Гик

    Думаю, что нет. Компилятор вполне себе нормально оптимизирует :)

    Спецом проверил, размер прошивки не поменялся .
     
    DIYMan нравится это.
  19. Danko

    Danko Нуб

    насчет switch'а думал но поскольку не очень умен не получилось
     
  20. Danko

    Danko Нуб

    под не очень умен я имею ввиду то что не до конца знаю c++ , я несколько лет на pascal "кодил"