консультация по ардуино

Тема в разделе "Флудилка", создана пользователем CYITEP_BAC9I, 21 мар 2017.

  1. mcureenab

    mcureenab Гуру

    Даже не один цикл 4, а цикл для вывода номера измерения, цикл для вывода энергии и цикл для вывода скорости.
     
    CYITEP_BAC9I нравится это.
  2. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Большое спасибо. Теперь приложу все усилия что бы самому дописать скетч. вроде все уже разжевали). не думал что собрать скетч в кучу, окажется сложнее чем саму схему спаять.
    Кстати по моему разобрался почему были помехи и ложные срабатывания на прерываниях. посмотел через камеру а оказалось что излучающие диоды мерцают немного(после импульсного стабилизатора) возможно эти мерцания и сводили с ума Дуню. Хотя почему тогда, когда пользовался обычной командой digitalRead этих помехи не влияли на измерения. Ладно х с ним главное что работает.
    У меня знакомые планеристы интересуются можно ли сделать авиагоризонт (показометр крена и тангажа) и сколько он может стоить. Возможно займусь этим, как скетч закончу для хрона.(а это наверное не одну неделю займет:()
    Кстати вопрос не про Ардуино, но если кто в курсе посоветуйте какое жало паяльника T12 удобнее для навесного монтажа? параллельно собираю себе на ардуино паяльник)
     
    Последнее редактирование: 1 июн 2017
  3. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    всем доброго здравия. временная затычка вышла с воодом данных веса пульки. Сорри уже баиньки пора и некогда скеч комментировать( завтра постараюсь это сделать. но суть в следующем. от длинного нажатия на кнопку Mode_button переходим в режим ввода веса пульки. при этом следующие короткие нажатия Mode_button переключаются между разрядами индикатора куда вводятся данные им присвоил имена abcd. будет использоваться 3 разряда b- граммы, c- 10 доля грамма d- сотая. так вот когда начинаешь вводить кнопками Step_up_button и Step_down_button. начинают изменятся данные во всех разрядах в данном случае в d и c. аналогов задчи которую я решаю в интернете не встречал, поэтому приходитс самому додумывать как поразрядно ввести данные в МК. можно конечно просто сделать что при нажатии на кнопку будет добавлятся по 1 мг веса, но если пулька будет весить 3 грамма то это очень неудобно будет. Завтра если не решу сам постараюсь подробнее закомментировать скетч.
    если кто сегодня поймет в чем цимес буду премного благодарен. так как с утра переварю и смогу дальше продолжить.
    Код (C++):
    #include "TM1637.h" // Подключаем библиотеку
    #define CLK 12 // К этому пину подключаем CLK
    #define DIO 13 // К этому пину подключаем DIO

    TM1637 disp(CLK,DIO);


    #define Mode_button  11// блок кнопок кнопка выбора режимов
    static byte CountMode = 0; // счетчик нажатий кнопки
    #define Step_up_button 10 // шаг вверх
    byte CountStep_up =0;
    #define Step_down_button 9// шаг вниз
    byte CountStep_down =0;
    bool Test_cycle = 0;
    bool IN_cycle = 1;
    bool OUT_cycle = 1;
    bool Speed_cycle = 1;
    bool Energy_cycle = 1;
    bool Meas_num_cycle = 1;
    bool display_cycle = 1;

    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;

    void setup()
    {
      // Устанавливаем яркость от 0 до 7
      disp.set(3);
      disp.init(D4056A);
    }

    void loop() // Повторяем в бесконечном цикле
    {
      int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

    bool prevflagMB = 0;
    bool flagMB = 0;
      disp.display(0,NumTab[17]);
        disp.display(1,NumTab[17]);
        disp.display(2,NumTab[17]); //16 минус - 17 пустое место
        disp.display(3,NumTab[17]);
      static unsigned long previousMillis77 =0;
    if (digitalRead(Mode_button ==1)&&millis() - previousMillis77 > 25)
    { previousMillis77 = millis();
      prevflagMB = 1;}
    if (digitalRead(Mode_button ==0)&&millis() - previousMillis77 > 25 && prevflagMB == 1 )
    {
      previousMillis77 = millis();
      flagMB = 1;
    if (flagMB == 1 && prevflagMB == 1)
    {
      CountMode++;
      if(CountMode == 3)CountMode =0;
      flagMB = 0;
    } prevflagMB = 0;

    }
    bool long_press =0;
    if (digitalRead(Mode_button ==1)&&millis() - previousMillis77 > 2000)
    { previousMillis77 = millis();

      prevflagMB = 1;
      }
    if (digitalRead(Mode_button ==0)&&millis() - previousMillis77 > 25 && prevflagMB == 1 )
    {
      bool long_press =1;

      previousMillis77 = millis();
      prevflagMB = 0;
    if (long_press ==1)
    {
    bool Energy_cycle = 0;
      long_press =0;
    }


    }

    while (Energy_cycle == 0);    
    {
    static bool FDown =0;
    static bool FUp =0;
    static byte CountDigit =0;

    if (digitalRead(Mode_button ==1))
    {
      delay(20);
      FDown =1;
    }
    if (digitalRead(Mode_button ==0) && FDown ==1)
    {
       delay(20);
      FUp =1;
    if (FDown ==1 && FUp ==1)
      {
    CountDigit++;
    if (CountDigit == 2) CountDigit=0;
       FDown =0;
      FUp =0;
      }
    }


    if (CountDigit ==0)
    {disp.display(3,NumTab[d]);



    if (digitalRead(Step_up_button ==1))
    {
      delay(20);
      FDown =1;
    }
    if (digitalRead(Step_up_button ==0) && FDown ==1)
    {
       delay(20);
      FUp =1;
    if (FDown ==1 && FUp ==1)
      {
    d=d+1;
    if (d ==10) d=0;
       FDown =0;
      FUp =0;
      }
    }

    if (digitalRead(Step_down_button ==1))
    {
      delay(20);
      FDown =1;
    }
    if (digitalRead(Step_down_button ==0) && FDown ==1)
    {
       delay(20);
      FUp =1;
    if (FDown ==1 && FUp ==1)
      {
    d=d-1;
    if (d == -1) d=9;
       FDown =0;
      FUp =0;
      }
    }

    }

    if (CountDigit ==1)
    {
    disp.display(2,NumTab[c]);


    if (digitalRead(Step_up_button ==1))
    {
      delay(20);
      FDown =1;
    }
    if (digitalRead(Step_up_button ==0) && FDown ==1)
    {
       delay(20);
      FUp =1;
    if (FDown ==1 && FUp ==1)
      {
    c=c+1;
    if (c ==10) c=0;
       FDown =0;
      FUp =0;
      }
    }

    if (digitalRead(Step_down_button ==1))
    {
      delay(20);
      FDown =1;
    }
    if (digitalRead(Step_down_button ==0) && FDown ==1)
    {
       delay(20);
      FUp =1;
    if (FDown ==1 && FUp ==1)
      {
    c=c-1;
    if (c == -1) c=9;
       FDown =0;
      FUp =0;
      }
    }

    }
    }

    //выход из цикла пока не дописал , пока не до выхода
    // ввод написан на delay потому что общий код программы хроногафа просто огромен и я уже путаться начал(
    }
     
    Последнее редактирование: 5 июн 2017
  4. mcureenab

    mcureenab Гуру

    Не очевидный код.

    Код (C++):
    if (digitalRead(Mode_button ==1)
    digitalRead возвращает LOW или HIGH, а не true или false.
    Mode_button ==1 получается 0. Это точно то что нужно? Может так надо?

    Код (C++):
    if (digitalRead(Mode_button) ==HIGH)
    Ну и по остальным кнопкам то же самое.
     
    CYITEP_BAC9I нравится это.
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    уже час ночи, но услышал оповещение и решил ответить.
    Не помню на каком форуме это подхватил, но один человек писал что так ускоряется написание кода. что 0 это то же самое что и false и LOW , 1 == HIGH или true
    я и для себя на этом принципе программки пишу. все стабильно работает, компилятор не матерится.
    Но исправлюсь обязательно. Спасибо за направление. если бы еще помогли почему одновременно изменяются пременные d и c)
    все всем спокойной ночи, отключаю телефон)
     
  6. mcureenab

    mcureenab Гуру

    Сейчас вместо кнопок на пинах 9,10,11 скетч читает пин 0. И что он там читает не известно. Поэтому нет смысла искать ошибку там где её возможно нет.
     
    CYITEP_BAC9I нравится это.
  7. mcureenab

    mcureenab Гуру

    0 и false это одно и то же. На счёт LOW == 0 - недокументированная фича.
    HIGH == 1 это тоже недокументированная фича.
    Не 0, это true, но true это 1.

    И в общем сравнение номера пина с HIGH или LOW быстрее наводит на мысль об ошибке, чем сравнение с 1 или 0.
     
    CYITEP_BAC9I нравится это.
  8. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    вечер добрый. Разобрался с вводом данных по разрядам. получилось просто и легко. теперь новая проблема не могу выйти из цикли(
    Теоретически хотел внутри цикла ввода веса кнопкой Mode_button переключать вводимые разряды.(это получается хорошо) а выходить из цикла долгим нажатием более 2 сек(на эту же кнопку) при этом при выходе, собирается вес пульки из введенных разрядов. внизу скетча нерабочие закооментированные варианты. Ни один не работает((( ни тот что слизал из интернета, ни тот что сам изобрел. оба варианта непонятно что делают, но в результате у дуни съезжает крыша и помогает только ресет. пока вышел из положения, одновременным нажатием Step_up_button и Step_down_button кнопок. При этом одновременное нажатие остваляет введенные данные нетронутыми. так как одна кнопка прибавляет, другая сразу отнимает, в результате введеное число остается тем же. Кот длинный . Если кто сможет помочь смотрите только нижнюю часть, попытки выхода из цикла
    Код (C++):
    #include "TM1637.h" // Подключаем библиотеку
    #define CLK 12 // К этому пину подключаем CLK
    #define DIO 13 // К этому пину подключаем DIO

    TM1637 disp(CLK,DIO);


    #define Mode_button  11//  кнопока кнопка выбора режимов
    #define Step_up_button 10 // шаг вверх
    #define Step_down_button 9// шаг вниз

    int CountDigit =0;
    bool Flag_MB1 =0;
    bool Flag_MBc =0;
    //bool Flag_MB =0;
    //bool Flag_MB_long =0;//флаг нажатия кнопки выбора режима
    bool Flag_S_up =0;
    bool Flag_S_down =0;

    bool long_press =0;

    byte CountMode = 0; // счетчик нажатий кнопки
    byte CountStep_down =0;
    unsigned long prevMillis =0;
    byte CountStep_up =0;
    bool Test_cycle = 0;
    bool IN_cycle = 1;
    bool OUT_cycle = 1;
    bool Speed_cycle = 1;
    bool Energy_cycle = 1;
    bool Meas_num_cycle = 1;
    bool display_cycle = 1;
    int bullets_weight;


    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
    bool     button_state      = true;
    bool     button_long_state = false;
    uint32_t ms_button = 0;

    void setup()
    {
      // Устанавливаем яркость от 0 до 7
      disp.set(3);
      disp.init(D4056A);
    Serial.begin(9600);
      pinMode(Mode_button, INPUT);
      pinMode(Step_up_button, INPUT);
      pinMode(Step_up_button, INPUT);
    }

    void loop()
    {




    while (Energy_cycle == 0);    
    {
      int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,};


    if (digitalRead(Mode_button) ==HIGH && Flag_MBc ==0 )//&& long_press ==1
    {
    CountDigit++;
    Flag_MBc =1;

      if(CountDigit >3)
    {
      CountDigit=1;
    }


    }
    if (digitalRead(Mode_button) ==LOW  && Flag_MBc ==1)//&& long_press ==1
    {

    Flag_MBc =0;
    }
    Serial.println("CountDigit");
       Serial.println(CountDigit);


    if (CountDigit ==1)
    {disp.display(3,NumTab[d]);

    if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 )
    { d=d+1;
    if (d ==10)
    {
      d=0;
    }
    Flag_S_up =1;}

       if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 )
       { Flag_S_up =0;}
    if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 )
    { d=d-1;
    if (d ==-1)
    {
      d=9;
    }
    Flag_S_down =1;}

    if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 )
    { Flag_S_down =0;}



       Serial.println("d");
       Serial.println(d);

    }



    if (CountDigit ==2)
    {
    disp.display(2,NumTab[c]);
    if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 )
    { c=c+1;
    if (c ==10)
    {
      c=0;
    }
    Flag_S_up =1;}

       if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 )
       { Flag_S_up =0;}
    if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 )
    { c=c-1;
    if (c ==-1)
    {
      c=9;
    }
    Flag_S_down =1;}

    if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 )
    { Flag_S_down =0;}



      Serial.println("c");
       Serial.println(c);

    }


    if (CountDigit ==3)
    {
    disp.display(1,NumTab[b]);

    if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 )
    { b=b+1;
    if (b ==10)
    {
      b=0;
    }
    Flag_S_up =1;}

       if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 )
       { Flag_S_up =0;}
    if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 )
    { b=b-1;
    if (b ==-1)
    {
      b=9;
    }
    Flag_S_down =1;}

    if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 )
    { Flag_S_down =0;}



       Serial.println("b");
       Serial.println(b);
    }

    if (digitalRead(Step_down_button) ==HIGH && digitalRead(Step_up_button) ==HIGH && Flag_MB1 ==0 )//&& long_press ==1
    {

    Flag_MB1 =1;


    }
    if (digitalRead(Step_down_button) ==LOW  &&digitalRead(Step_up_button) ==LOW&& Flag_MB1 ==1)//&& long_press ==1
    {

    Flag_MB1 =0; bullets_weight = b*100+c*10+d;
       Serial.println(bullets_weight);
    delay(2000);
    }


    /*uint32_t ms    = millis();    //варианд длинногонажатия из интернета
       bool pin_state = digitalRead(Mode_button);
    if( pin_state  == HIGH && button_state && ( ms - ms_button ) > 50 ){
          button_state      = false;
          button_long_state = false;
          ms_button         = ms;
       }
    // Фиксируем длинное нажатие кнопки
       if( pin_state  == HIGH && !button_long_state && ( ms - ms_button ) > 2000 ){
          button_long_state = true;
          Serial.println("Long press key");
       }
    // Фиксируем отпускание кнопки
       if( pin_state == LOW &&! button_state && ( ms - ms_button ) > 50  ){
          button_state      = true;
          ms_button         = ms;
          if( !button_long_state )Serial.println("Press key");
       }



    // мой вариант обоработки длинного нажаития

    /* if (digitalRead(Mode_button) ==HIGH && Flag_MB1 ==0 && millis() - prevMillis > 2000 )
    {

    Flag_MB1 =1;
    long_press =1;
      prevMillis = millis();
       //bool Energy_cycle = 0;

      }
    if (digitalRead(Mode_button) ==LOW && Flag_MB1==1 )
    {Energy_cycle=1;
    Flag_MB1 =0;

    }
    if (long_press ==1)
    {
      bullets_weight = b*100+c*10+d;
       Serial.println(bullets_weight);
       delay(2000);
    }*/

    }
    }







     
    про антидребезг не напоминать)
     
    Последнее редактирование: 7 июн 2017
  9. mcureenab

    mcureenab Гуру

    Кнопка с удержанием должна срабатывать когда её отпускают. Когда такую кнопку нажимают можно подать сигнал, что кнопка нажата. Например моргнуть индикатором.
    А дальше неизвестно что нужно делать, пока порог удержания не превышен или кнопка не отпущена.
     
    CYITEP_BAC9I нравится это.
  10. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Ок спасибо, об этом не подумал. попробую переделать. а вобще все мои попытки вешают ардуино и она не рагирует больше ни на какие нажатия после длинного нажатия)
     
  11. mcureenab

    mcureenab Гуру

    Комментируйте коД. Пишите что должно произойти на каждом шаге выполнения. Иногда программист думает ожидает одно, а код пишет про другое.
     
    CYITEP_BAC9I нравится это.
  12. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    постараюсь. все делается урывками, пока никто не видит что дите балуется херней. поэтому тороплюсь не успеваю комментировать. но буду меняться
     
  13. mcureenab

    mcureenab Гуру

    Лучше даже сначала коментарии набросать и под них уже кодить.

    Разделите код на функции. Цикл loop уже необозримым стал.
     
    CYITEP_BAC9I нравится это.
  14. mcureenab

    mcureenab Гуру

    Смотрю у вас три куска почти идентичного кода.

    Вместо отдельных переменных b, c, d объявите массив.

    uint8_t d[3];

    Используйте CountDigit-1 в качестве индекса

    d[CountDigit-1]

    Тогда три ветки
    if (CountDigit==1
    if (CountDigit==2
    if (CountDigit==3

    Можно будет объединить в одну.
     
    CYITEP_BAC9I нравится это.
  15. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо за помощь. решил этот ребус. получилось на пол сотни строк меньше)
    Код (C++):
    #include "TM1637.h" // Подключаем библиотеку
    #define CLK 12 // К этому пину подключаем CLK
    #define DIO 13 // К этому пину подключаем DIO

    TM1637 disp(CLK,DIO);


      #define Mode_button  11//  кнопока кнопка выбора режимов
    #define Step_up_button 10 // шаг вверх
    #define Step_down_button 9// шаг вниз

    int CountDigit =0;
    bool Flag_MB1 =0;
    bool Flag_MBc =0;
    //bool Flag_MB =0;
    //bool Flag_MB_long =0;//флаг нажатия кнопки выбора режима
    bool Flag_S_up =0;
    bool Flag_S_down =0;

    bool long_press =0;

    byte CountMode = 0; // счетчик нажатий кнопки
    byte CountStep_down =0;
    unsigned long StartMillis =0;
    unsigned long StopMillis =0;
    byte CountStep_up =0;
    bool Test_cycle = 0;
    bool IN_cycle = 1;
    bool OUT_cycle = 1;
    bool Speed_cycle = 1;
    bool Energy_cycle = 1;
    bool Meas_num_cycle = 1;
    bool display_cycle = 1;
    int bullets_weight;
    bool     button_state      = true;
    bool     button_long_state = false;
    uint32_t ms_button = 0;
    int DG =0;

    int8_t Digit[3] ;
    void setup()
    {
      // Устанавливаем яркость от 0 до 7
      disp.set(3);
      disp.init(D4056A);
    Serial.begin(9600);
      pinMode(Mode_button, INPUT);
      pinMode(Step_up_button, INPUT);
      pinMode(Step_up_button, INPUT);
    }

    void loop()
    {


    // while (Energy_cycle == 1);      
    // {



      int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,};
    //
      disp.display(0,NumTab[17]);
      disp.display(1,NumTab[Digit[2]]);
    disp.display(2,NumTab[Digit[1]]); //16 минус - 17 пустое место
    disp.display(3,NumTab[Digit[0]]);


    bool NazgatieBM =0;
    if (digitalRead(Mode_button) ==HIGH && Flag_MBc ==0 )//если кнопка воборов режима нажата
        {
         StartMillis=millis();//засекаем время нажатия
         Flag_MBc = 1; }
     
    if (digitalRead(Mode_button) ==LOW  && Flag_MBc ==1)//если кнопка выбора режима отжата
        {
         StopMillis = millis();//засекаем время отжатия
         NazgatieBM =1; //флаг что было нажатие
         Flag_MBc =0; }
    Serial.println("StartMillis");
       Serial.println(StartMillis);
       Serial.println("StopMillis");
       Serial.println(StopMillis);

    //если врямя клика больше 20мс и меньше 2000
    //то это короткое нажатие выбра разряда индикатора для ввода данных
    if (StopMillis - StartMillis >20 && StopMillis - StartMillis <2000 && NazgatieBM ==1)
    {StartMillis = 0;
       StopMillis = 0;
        CountDigit++;
         Serial.println("KOROTCOE NAZGATIE");
      NazgatieBM =0;
        //
       if(CountDigit >3)
    {
      CountDigit=1;
    }
    }
    Serial.println("CountDigit");
    Serial.println(CountDigit);
    ;
    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >2000 && NazgatieBM ==1)
    { StartMillis = 0;
      StopMillis = 0;

      long_press = 1;  // флаг длинного нажатия
       NazgatieBM =0;
       Serial.println("DLINNOE NAZGATIE");
       }
        if (long_press ==1) // если есть флаг длинного нажатия
        {
         bullets_weight = (Digit[2]*100)+(Digit[1]*10)+Digit[0];    // рассчитываем вес пульки   когда убираешь скобки получается фигня
       Serial.println(bullets_weight);  // выводим на монитор(это только для отладки)

      long_press =0;
      Energy_cycle = 0; //выходим из цикла
      delay(2000);
       
        }

    if (CountDigit >0) //если счетчик разрядов больше 0( по другом не смог придумать как завести фунцию
    {
     
    if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 )  дальше уже вводим данные используя элемет массива как переменную)
    { Digit[CountDigit-1]=Digit[CountDigit-1]+1;
    Serial.println("hren");
    Flag_S_up =1;
    if (Digit[CountDigit-1] ==10)
    {
    Digit[CountDigit-1]=0;
    }
    }

       if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 )
       { Flag_S_up =0;}
    if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 )
    { Digit[CountDigit-1]=Digit[CountDigit-1]-1;
      Flag_S_down =1;
    if (Digit[CountDigit-1] ==-1)
    {
      Digit[CountDigit-1]=9;
    }
    }

    if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 )
    { Flag_S_down =0;}
    }

    Serial.println("DG"); //Digit[2]
    Serial.println(DG);
       Serial.println("d");
       Serial.println(d);

      Serial.println("c");
       Serial.println(c);


       Serial.println("b");
       Serial.println(b);


    //} */
    }
     
    едиственно теперь не представляю как сделать помигивание вводимого рязряда. Хотя наверное и так хорошо. учитываю простоту ввода сразу 2 кнопками + и-, хотя хватило бы даже 1). Буду пилить дальше!
    если настроение позволить может и помигивание реализую.

    кстати теперь когда какое либо действие происходит после отжатия кнопки, все стало работь как я и хотел. ище раз спасибо за правильное направление
     
  16. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    попалась страничка с картинками. https://www.drive2.ru/b/457450989176230857/ стало немного понятнее как циклы работают. не совсем согласен как изображены continue и break. но в целом наглядно. кстати как кошернее выходить из цикла while по условию или по break в цикле?
     
  17. mcureenab

    mcureenab Гуру

    Хоть по goto.)))

    Если программа становится короче, понятнее, то почему бы не использовать continue, break или goto?
    Хотя можно и без них обойтись.
     
  18. mcureenab

    mcureenab Гуру

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

    Код (C++):
    uint8_t & d = Digit[CountDigit-1];
    Теперь переменная d и Digit[CountDigit-1] это синонимы. Меняя d вы фактически меняете Digit[CountDigit-1].
     
    CYITEP_BAC9I нравится это.
  19. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Спасибо большое!
    сейчас еще веселее набросок покажу) обхохочетесь. Суть в следущем есть 4 светодиода. 2 группы по 2. синий и желтый - показывают напряжение на входной группе датчиков. если оно идеальное - между 2.2 и 2.3 вольта, то горят оба. если меньше идеального то горит синий, если больше идеального,но в рамках допустимого горит желтый. если напряжение выходит за допустимые пределы начинают мигать если низкое мигает синий если высокое мигает желтый. такая же история с выходными датчиками. мне это нужно для того что бы при включении игрушки произошло тестирование датчиков. если все хорошо, диоды мигнут 3 раза и выход из режима тестрирования. если нет то цикл "зацикливается") пока не напряжение на датчиках не придет в порядок.

    сам скетч измерения как не странно рабочий. но гигантский. вопрос есть ли способы ужать его?
    Заранее благодарен Вася.
    Даже загрузка ругается на длину. размещаю только часть. дальше в case просто перебираются все возмодные варианты, индикации напряжения. можно было сделать отдельно вход и выход индикацию но по ряду причин мне удобнее когда все 4 светодиода управляются одним режимом case
    Код (C++):
    #define Led_IN_yellow 17 // вход блок индикаторных светодидов
    #define Led_IN_blue 16
    #define Led_OUT_yellow 18 // выход
    #define Led_OUT_blue 19




    #define pinIN 2  // входные пины датчкиов
    #define pinOUT 3 // пин выходных датчков

    #define pin_TestIN A0
    #define pin_TestOUT A1


    bool InPort_stat = 0;  // флаг срабатывания входа
    bool OutPort_stat = 0; // флаг срабатывания выхода

    bool flagIN = 0;
    bool flagOUT = 0;

    bool Test_cycle = 0;
    bool IN_cycle = 0;
    bool OUT_cycle = 0;
    bool Speed_cycle = 0;
    bool Energy_cycle = 0;
    bool Meas_num_cycle = 0;
    bool display_cycle = 0;



    uint32_t IN_ms, IN_ms1 = 0;
    bool IN_led_stat    = true;
    uint32_t OUT_ms, OUT_ms1 = 0;
    bool OUT_led_stat    = true;

    void setup() {
      pinMode (Led_IN_yellow , OUTPUT);
      pinMode (Led_IN_blue , OUTPUT);
      pinMode (Led_OUT_yellow , OUTPUT);
      pinMode (Led_OUT_blue , OUTPUT);
      pinMode (pin_TestIN , INPUT);
      pinMode (pin_TestOUT , INPUT);
      uint32_t IN_ms, IN_ms1 = 0;
      bool IN_led_stat    = true;
      uint32_t OUT_ms, OUT_ms1 = 0;
      bool OUT_led_stat    = true;
    Serial.begin(9600);
    }

    void loop() {







      while (Test_cycle == 0)  //pin_TestIN pin_TestOUT  //digitalWrite (Led_IN_blue, 1);  //digitalWrite (Led_IN_yellow, 1);
      {int ModeTest;
        int TestIN = analogRead(pin_TestIN); //Led_IN_yellow Led_IN_blue Led_OUT_yellow Led_OUT_blue
        int TestOUT  = analogRead(pin_TestOUT);


        //если входное меньше 2
        if  (TestIN < 409 && TestOUT > 409 && TestOUT < 450)                  ModeTest = 1;
        if  (TestIN < 409 && TestOUT > 450 && TestOUT < 471)                  ModeTest = 2;
        if  (TestIN < 409 && TestOUT > 471 && TestOUT < 512)                  ModeTest = 3;
        if  (TestIN < 409 && TestOUT > 512)                                  ModeTest = 4;
        if  (TestIN < 409 && TestOUT < 409)                                   ModeTest = 5;
        // если входное  в пределах 2 и 2.2
        if  (TestIN > 409 && TestIN < 450 && TestOUT < 409)                   ModeTest = 6;
        if  (TestIN > 409 && TestIN < 450 && TestOUT > 512)                  ModeTest = 7;
        if  (TestIN > 409 && TestIN < 450 && TestOUT > 409 && TestOUT < 450)  ModeTest = 8;
        if  (TestIN > 409 && TestIN < 450 && TestOUT > 450 && TestOUT < 471)  ModeTest = 9;
        if  (TestIN > 409 && TestIN < 450 && TestOUT > 471 && TestOUT < 512)  ModeTest = 10;
        // если входное  в пределах 2.2 и 2.3
        if  (TestIN > 450 && TestIN < 471 && TestOUT < 409)                   ModeTest = 11;
        if  (TestIN > 450 && TestIN < 471 && TestOUT > 512)                  ModeTest = 12;
        if  (TestIN > 450 && TestIN < 471 && TestOUT > 409 && TestOUT < 450)  ModeTest = 13;
        if  (TestIN > 450 && TestIN < 471 && TestOUT > 450 && TestOUT < 471)  ModeTest = 14;
        if  (TestIN > 450 && TestIN < 471 && TestOUT > 471 && TestOUT < 512)  ModeTest = 15;
        // если входное  в пределах 2.3 и 2.5
        if  (TestIN > 471 && TestIN < 512 && TestOUT < 409)                   ModeTest = 16;
        if  (TestIN > 471 && TestIN < 512 && TestOUT > 512)                  ModeTest = 17;
        if  (TestIN > 471 && TestIN < 512 && TestOUT > 409 && TestOUT < 450)  ModeTest = 18;
        if  (TestIN > 471 && TestIN < 512 && TestOUT > 450 && TestOUT < 471)  ModeTest = 19;
        if  (TestIN > 471 && TestIN < 512 && TestOUT > 471 && TestOUT < 512)  ModeTest = 20;
        //если входное больше 5ModeTest =1;
        if  (TestIN > 512 && TestOUT < 409)                                  ModeTest = 21;
        if  (TestIN > 512 && TestOUT > 512)                                 ModeTest = 22;
        if  (TestIN > 512 && TestOUT > 409 && TestOUT < 450)                 ModeTest = 23;
        if  (TestIN > 512 && TestOUT > 450 && TestOUT < 471)                 ModeTest = 24;
        if  (TestIN > 512 && TestOUT > 471 && TestOUT < 512)                 ModeTest = 25;




        switch (ModeTest)
        {
          case 1:
            static unsigned long previousMillis7 = 0;
            if (millis() - previousMillis7 > 300)
            {
              previousMillis7 = millis();
              digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue));
            }
            digitalWrite (Led_OUT_blue, 1);  
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite (Led_OUT_yellow, 0);
            break;

          case 2:
            static unsigned long previousMillis6 = 0;
            if (millis() - previousMillis6 > 300)
            {
              previousMillis6 = millis();
              digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue));
            }
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite (Led_OUT_blue, 1);
            digitalWrite (Led_OUT_yellow, 1);
            break;

          case 3:
            static unsigned long previousMillis5 = 0;
            if (millis() - previousMillis5 > 300)
            {
              previousMillis5 = millis();
              digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue));
            }
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite (Led_OUT_yellow, 1);
            digitalWrite (Led_OUT_blue, 0);
            break;

          case 4:
            static unsigned long previousMillis4 = 0;
            if (millis() - previousMillis4 > 300)
            {
              previousMillis4 = millis();
              digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue));
            }

            static unsigned long previousMillis3 = 0;
            if (millis() - previousMillis3 > 300)
            {
              previousMillis3 = millis();
              digitalWrite(Led_OUT_yellow, !digitalRead(Led_OUT_yellow));
            }
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite (Led_OUT_blue, 0);
       
            break;

          case 5:
            static unsigned long previousMillis2 = 0;
            if (millis() - previousMillis2 > 300)
            {
              previousMillis2 = millis();
              digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue));
            }
            static unsigned long previousMillis1 = 0;
            if (millis() - previousMillis1 > 300)
            {
              previousMillis1 = millis();
              digitalWrite(Led_OUT_blue, !digitalRead(Led_OUT_blue));
            }
             digitalWrite (Led_IN_yellow, 0);
            digitalWrite (Led_OUT_yellow, 0);
            break;

          case 6:
            digitalWrite (Led_IN_blue, 1);
            digitalWrite (Led_IN_yellow, 0);
            static unsigned long previousMillis8 = 0;
            if (millis() - previousMillis1 > 300)
            {
              previousMillis8 = millis();
              digitalWrite(Led_OUT_blue, !digitalRead(Led_OUT_blue));
            }
             digitalWrite (Led_OUT_yellow, 0);
            break;
     
    unsignedlong previousMillis1 почему на каждый вариант мигания своя переменная то самому странноб компилятор не дал возможности обойтись одной общей переменной. пришлось так выкручиваться
     
    Последнее редактирование: 8 июн 2017
  20. mcureenab

    mcureenab Гуру

    Зачем мильён раз проверять одно и то же. Используйте вложенные if, используйте else if

    В условиях явно ошибка из-за двойной проверки порога само пороговое значение выпало.
     
    CYITEP_BAC9I нравится это.