Не работает код.

Тема в разделе "Arduino & Shields", создана пользователем MolodoyElectric, 28 апр 2018.

  1. Здарова братва! Вообщем пишу простенький скетч для работы со светодиодами. Суть: нужно чтоб когда нажимаешь 1 кнопку начинал мигать 1 светодиод (void blinkLed), отжимаешь - перестает. Тоже самое с кнопкой 2 и светодиодами void linLed. По части мигания все работает, без кнопок. Какая то канитель с кнопками. Вообще ничего не работает, и понять не могу что такое. Подскажите пожалуйста где ошибки, и как исправить. Главное когда брал по отдельности пробовал все работает, а все собрал какая то каша. Запутался уже.
    Код (C++):
    #include <Bounce2.h>
    Bounce bouncer = Bounce();
    Bounce bouncer1 = Bounce();
    #define LED_PIN2  2
    #define LED_PIN3  3
    #define LED_PIN4  4
    #define LED_PIN5  5
    #define LED_PIN6  6
    #define LED_PIN7  7
    #define LED_PIN8  8
    #define LED_PIN9  9
    #define LED_PIN10  10
    #define LED_PIN11  11
    #define LED_PIN12  12
    #define LED_PIN13  13
    #define LOW_INTERVAL 350
    #define HIGH_INTERVAL 70
    #define HIGH_INTERVALLIN 300
    unsigned long prevTime;


    void setup() {
    pinMode(LED_PIN2, INPUT);
    digitalWrite(LED_PIN2, HIGH);
    pinMode(LED_PIN3, INPUT);
    digitalWrite(LED_PIN3, HIGH);
    pinMode(LED_PIN4, INPUT);
    digitalWrite(LED_PIN4, HIGH);

      pinMode(LED_PIN5, OUTPUT);
      pinMode(LED_PIN6, OUTPUT);
      pinMode(LED_PIN7, OUTPUT);
      pinMode(LED_PIN8, OUTPUT);
      pinMode(LED_PIN9, OUTPUT);
      pinMode(LED_PIN10, OUTPUT);
      pinMode(LED_PIN11, OUTPUT);
      pinMode(LED_PIN12 , OUTPUT);
      pinMode(LED_PIN13, OUTPUT);
      prevTime=millis();

    bouncer .attach(LED_PIN2);
    bouncer .interval(5);
    bouncer1 .attach(LED_PIN3);
    bouncer1 .interval(5);
    }
    void loop() {
    if (bouncer.update())
    {
    if (bouncer.read()==0)
    {
    blinkLed();
    }
    }
    if (bouncer1.update())
    {
    if (bouncer1.read()==0)
    {
    linLed();
    }
    }

    }

    void linLed(){
    static unsigned char var;

    switch(var)
    {
      case 0:
    digitalWrite(LED_PIN5, HIGH);
      if(millis()-prevTime>HIGH_INTERVALLIN){
        prevTime=millis();
         digitalWrite(LED_PIN5, LOW);
          digitalWrite(LED_PIN6, HIGH);
          var++;
      } break;
      case 1:
        if(millis()-prevTime>HIGH_INTERVALLIN){                                          
        prevTime=millis();
         digitalWrite(LED_PIN6, LOW);
         digitalWrite(LED_PIN7, HIGH);
         var++;
      }break;
      case 2:
       if(millis()-prevTime>HIGH_INTERVALLIN){
        prevTime=millis();
         digitalWrite(LED_PIN7, LOW);
         digitalWrite(LED_PIN8, HIGH);
         var++;
      }break;
      case 3:
       if(millis()-prevTime>HIGH_INTERVALLIN){
        prevTime=millis();
         digitalWrite(LED_PIN8, LOW);
          digitalWrite(LED_PIN9, HIGH);
         var++;
      }break;
      case 4:
       if(millis()-prevTime>HIGH_INTERVALLIN){
        prevTime=millis();
         digitalWrite(LED_PIN9, LOW);
         if(++var==5)var=0;
      }break;
      default: var=0; break;
    }
      }
    void blinkLed(){
    static unsigned long period= LOW_INTERVAL; // текущий интервал мигания
    static unsigned long prevMillis=0;
      if( (millis()-prevMillis)>=period){
        prevMillis=millis();
         digitalWrite(LED_PIN12,!digitalRead(LED_PIN12));
         period=(period==LOW_INTERVAL)?HIGH_INTERVAL: LOW_INTERVAL;  // чередуем LOW_INTERVAL/HIGH_INTERVAL
      }
      }
     
    Последнее редактирование: 28 апр 2018
  2. b707

    b707 Гуру

    строчка, прямо скажем, глупая :) Поччему не написать просто var=0; ?

    остальное не смотрел
     
  3. ostrov

    ostrov Гуру

    Остальное тоже не смотрел, но почему эта строчка глупая? Обычный циклический счетчик.
     
    Последнее редактирование: 28 апр 2018
  4. Та по этой части все работает как надо.

    void blinkLed и void linLed - работают. Кнопки убираешь - все нормально.
    Именно по части кнопок какая то туфта. Посмотрите пожалуйста обработку кнопок и дребезг.
     
    Последнее редактирование: 28 апр 2018
  5. ostrov

    ostrov Гуру

    Кнопки к чему нибудь притянуты резисторами?
     
  6. Ну да, 1 кнопка, пин-резистор-кнопка-gdn, 2 рая пин-кнопка-резистор-gdn, ну разницы вроде нет по закону ома. Резистор 10к.

    Получается по коду вроде все ок?
     
  7. ostrov

    ostrov Гуру

    По коду не всматривался. Часто плдключают неправильно и страдают. Я вот по описанию не понял ничего. Схему подключения кнопки нарисуйте.
     
  8. b707

    b707 Гуру

    Потому что условие if(++var==5) стоит внутри ветки switch (var==4) :) это "масло-масляное" получается. Поэтому я и предложил эту строчку выкинуть.
    Ну и остальной код на том же уровне. Его можно сократить раза в три - тогда и ошибки искать удобнее станет.
     
  9. [​IMG] Вторая также, и получается что я их еще подтянул через встроенные резисторы ардуины программно, то есть по сути можно эти резисторы убрать, но пусть будут.
     
  10. Та этот код частично взят с готовых источников. Я новичек в этом деле. Но по сути ошибка где то тут:
    Код (C++):
    void loop() {
    if (bouncer.update())
    {
    if (bouncer.read()==0)
    {
    blinkLed();
    }
    }
    if (bouncer1.update())
    {
    if (bouncer1.read()==0)
    {
    linLed();
    }
    }

    }
    Либо аппаратная ошибка.
    Сами функции работают.
     
  11. Главное что работает) Можно вот так:
    Код (C++):
     void linLed(){
    static unsigned char var;

    if(millis()-prevTime>HIGH_INTERVALLIN){
        prevTime=millis();
    switch(var)
    {
      case 0:
          digitalWrite(LED_PIN5, LOW);
          digitalWrite(LED_PIN6, HIGH);
          var++;
      break;
      case 1:
         digitalWrite(LED_PIN6, LOW);
         digitalWrite(LED_PIN7, HIGH);
         var++;
      break;
      case 2:
         digitalWrite(LED_PIN7, LOW);
         digitalWrite(LED_PIN8, HIGH);
         var++;
      break;
      case 3:
         digitalWrite(LED_PIN8, LOW);
         digitalWrite(LED_PIN5, HIGH);
         var=++;
      break;
    case 4:
         digitalWrite(LED_PIN8, LOW);
         digitalWrite(LED_PIN5, HIGH);
         var=0;
      default: var=0; break;
    }
      }
    }
     
     
  12. b707

    b707 Гуру

    Эти резисторы не подтяжка, а защита пинов. Подтяжку они не дублируют. Убирать не надо, нужны и те и другие.
     
    MolodoyElectric нравится это.
  13. Daniil

    Daniil Гуру

    Может схема должна быть такой? (код не читал, т.к. такая простыня без комментариев и форматирования нечитабельна)
    А то пин висит в воздухе, а как настраивает пин библиотека bouncer надо читать исходники/описание.
    С такой простой вещью как кнопка рекомендую разобраться самостоятельно, т.к. дребезг можно убрать кондёром (как вариант) или читайте исходники.
    Выполнять bounce.update, только для того чтобы потом проверить bounce.read излишне.
    Чему равны значения LOW_INTERVAL, HIGH_INTERVAL, HIGH_INTERVALLIN ?
     
  14. ostrov

    ostrov Гуру

    Ну неправильно же подключено. На пине будет что угодно. Посмотрите пример в минипроектах.
     
    Daniil нравится это.
  15. b707

    b707 Гуру

    Посмотри в коде - у него внутренняя подтяжка к питанию используется. Так что. ИМХО, все нормально.
     
  16. b707

    b707 Гуру

    Плохая ссылка и плохая схема. Во-первых, кнопка замыкает пин на +5в, хотя общепринято на GND. Во-вторых, замыкание через кнопку сделано накоротко - что чревато. Вообще, схема ТС куда как более грамотная, чем по этой ссылке.
     
  17. Daniil

    Daniil Гуру

    Тут?:
    Код (C++):
    pinMode(LED_PIN2, INPUT);
    Тут или тут упоминается о подтяжке, но для её использования нужно использовать другой аргумент у функции pinMode.
    Мне кажется, что по ссылке кнопка замыкает питание на землю через резистор, который можно переместить, желательно чтобы ТС думал. (всё равно я не люблю "художественные" схемы, т.к. они неудобны)
    Принято, но не согласен.

    Я не идеализирую ту схему, просто кинул первую попавшуюся из гугла, убедившись, что там в цепи участвуют и питание, и земля для работы с кнопкой при помощи библиотеки как у ТС.
     
  18. b707

    b707 Гуру

    вы немного плаваете в синтаксисе. Встроенную подтяжку к питанию можно включить двумя способами. Один из них - использование конструкции
    Код (C++):
    pinMode(LED_PIN2, INPUT);
    digitalWrite(LED_PIN2, HIGH);
    как это сделано у ТС
     
  19. Daniil

    Daniil Гуру

    Спасибо, не знал!

    Как ещё вариант, может, внешний резистор взять по-меньше, а то в такой системе (внутренний 20кОм) на нём (внешнем) падает треть от 5 В, а это граница логического нуля для атмеги.
     
  20. b707

    b707 Гуру

    согласен, 10к многовато, лучше поменьше. 1к нормально будет