Не стабильное поведение arduino uno

Тема в разделе "Arduino & Shields", создана пользователем redven, 9 апр 2016.

  1. redven

    redven Нерд

    Третий вопрос на форуме и наверное самый обширный.

    У меня есть код под arduino uno.
    В нём использую:
    Arduino Uno
    Relay Shield (4 канала по 5 А)
    MP3-плеер
    Troyka Shield
    Четырёхразрядный индикатор (Troyka-модуль)
    Датчик Холла (Troyka-модуль)
    Резисторы на 10 кOm

    В общем, как понимаете товарищи, плата моя по пинам занята вся:)
    О самом это проекте расскажу позже, с более полным описанием. Есть у меня мечта написать пару-тройку полезных (очень надеюсь, что они будут полезны всему сообществу) статей.

    Но сейчас о другом. Наваял значит Валера код этот, собрав воедино все свои познания и советы мудрецов и даже всё начало работать.. но начал тестировать на стабильность.. И тут выявилась проблема. Не всегда стабильно работает последний этап. Как ни пробовал - не получается. И вот вновь взываю к мудрому сообществу за мудростью.

    Научите, как привести в порядок код и укажите что не так сделал я.
    Вот сам код:
    Код (C++):
     
    #include <QuadDisplay.h>              // подключаем библиотеку дисплея
    #define PIN 16                        // аналоговый пин А2 для дисплея
    #include <CapSense.h>                 // подключаем библиотеку тач сенсора
    #include <SoftwareSerial.h>
    #include <DFPlayer.h>        // подключаем библиотеки необходимые для мп3 плеера
    #define INTERVAL_PLAY 10000           // интервал вывода информации в Serial
    #define INTERVAL_SERIAL 1000          // погрешность на случайные наводки датчика

    int vodorod = 0;
    int kislorod = 0;
    int knopka = 0;
    int kolibrovka = 0;
    int avtopilot = 0;
    int artefakt = 0;
    int dver = 0;
    int stik = 0;

    unsigned long time;

    SoftwareSerial mySerial(2, 3);       // инициализируем новый последовательный порт (RX 2, TX 3)
    CapSense   cs_8_9 = CapSense(8,9);     // клавиша 1 между 4-м и 2-м пином
    CapSense   cs_8_10 = CapSense(8,10);   // клавиша 1 между 4-м и 3-м пином
    CapSense   cs_11_12 = CapSense(11,12); // клавиша 1 между 5-м и 6-м пином

    void setup () {

        Serial.begin (9600);
        mySerial.begin(9600);          // для нормальной работы DFPlayer
            mp3_set_serial(mySerial); // выбор Serial для упрапвления DFPlayer
            mp3_set_volume(30);  // установка громкости и к ней задержка

            cs_8_9.set_CS_AutocaL_Millis(0xFFFFFFFF); // выключает автокалибровку на 1-й клавише.
             pinMode(4,OUTPUT); // назначаем 4 пин на выход
             digitalWrite(4, LOW); // состояние на 4 пине  выключено
             pinMode(5,OUTPUT); // назначаем 5 пин на выход
             digitalWrite(5, LOW); // состояние на 5 пине  выключено
             pinMode(6,OUTPUT); // назначаем 6 пин на выход
             digitalWrite(6, LOW); // состояние на 6 пине  выключено
             pinMode(7,OUTPUT); // назначаем 7 пин на выход
             digitalWrite(7, HIGH); // состояние на 7 пине  включено
     
            displayInt(PIN, 30);
      delay(1000);
        displayInt(PIN, 29);
      delay(1000);
        displayInt(PIN, 28);
      delay(1000);
        displayInt(PIN, 27);
      delay(1000);
        displayInt(PIN, 26);
      delay(1000);
        displayInt(PIN, 25);
      delay(1000);
        displayInt(PIN, 24);
      delay(1000);
        displayInt(PIN, 23);
      delay(1000);
        displayInt(PIN, 22);
      delay(1000);
        displayInt(PIN, 21);
      delay(1000);
        displayInt(PIN, 20);
      delay(1000);
        displayInt(PIN, 19);
      delay(1000);
        displayInt(PIN, 18);
      delay(1000);
        displayInt(PIN, 17);
      delay(1000);
        displayInt(PIN, 16);
      delay(1000);
        displayInt(PIN, 15);
      delay(1000);
        displayInt(PIN, 14);
      delay(1000);
        displayInt(PIN, 13);
      delay(1000);
        displayInt(PIN, 12);
      delay(1000);
        displayInt(PIN, 11);
      delay(1000);
        displayInt(PIN, 10);
      delay(1000);
        displayInt(PIN, 9);
      delay(1000);
        displayInt(PIN, 8);
      delay(1000);
        displayInt(PIN, 7);
      delay(1000);
        displayInt(PIN, 6);
      delay(1000);
        displayInt(PIN, 5);
      delay(1000);
        displayInt(PIN, 4);
      delay(1000);
        displayInt(PIN, 3);
      delay(1000);
        displayInt(PIN, 2);
      delay(1000);
        displayInt(PIN, 1);
      delay(1000);            // делаем обратный отсчет
      displayClear(PIN);
      delay(1000);
            mp3_play (1);  // запуск первого трека
            delay(70000);          
    }


    //
    void loop ()
    {
          int kn = digitalRead(5);      // считываем
          int art = digitalRead(4);
          int dv = digitalRead(6);

          int sensorValue = analogRead(A0);
          float voltage = sensorValue;
          int sensorValue_1 = analogRead(A1);
          float voltage_1 = sensorValue_1;       // подключаем датчики
          int sensorValue_2 = analogRead(A5);
          float voltage_2 = sensorValue_2;         // подключаем датчики 2
       
          int sensorValue_3 = analogRead(A3);
          float magnit_1 = sensorValue_3;
          int sensorValue_4 = analogRead(A4);
          float magnit_2 = sensorValue_4;         //  подключаем датчики холла

        long start = millis();
        long valore =  cs_8_9.capSense(30);
        long valore1 =  cs_8_10.capSense(30);
        long valore2 =  cs_11_12.capSense(30);   // присваиваем имена к сенсорным кнопкам
        Serial.println(millis() - start);
          delay (20);
        Serial.print(vodorod);       // информация по счётчику подключения водорода (измеряется в циклах ардуины)
        Serial.print("\t");      // делаем отступ
        Serial.print(kislorod);     //  информация по счётчику подключения (измеряется в циклах ардуины)
        Serial.print("\t");        // делаем отступ
        Serial.print(knopka);        // информация по счётчику длительности нажатия кнопки (измеряется в циклах ардуины)
        Serial.print("\t");        // делаем отступ
       
        Serial.print(valore);      // выводим данные с сенсора 1
        Serial.print("\t");    // делаем отступ
        Serial.print(valore1);      // выводим данные с сенсора 2
        Serial.print("\t");    // делаем отступ
        Serial.print(valore2);      // выводим данные с сенсора 3
        Serial.print("\t");        // делаем отступ
       
        Serial.print(magnit_1);    // выводим данные с датчика Холла 1
            Serial.print("\t");    // делаем отступ
        Serial.print(magnit_2);    // выводим данные с датчика Холла 2
        Serial.print("\t");  // выводим данные с датчиков холла на пинах А3 и А4
             
        Serial.print(voltage);    //  сенсор подключения 1
        Serial.print("\t");       // делаем отступ
        Serial.print(voltage_1);  // сенсор подключения 2
        Serial.print("\t");      // делаем отступ
        Serial.print(voltage_2); // сенсор нажатия кнопки
        Serial.print("\t   ");
        Serial.print("Time: ");
        time = millis();

       
     
       // вот отсюда начинается логистика
       
      // тут идут счетчики выполненных нажатий или действий
     
       if (voltage > 90)        // если подключили 1
       {
       delay(10);
       vodorod = (vodorod + 1);
       }
     
       if ( voltage_1 > 90)     // если подключили 2
       {
       delay(10);
       kislorod = (kislorod + 1);
       }
     
       if ((vodorod > 3) && (vodorod <= 50) && (kislorod <= 50) && (kislorod > 3))
       {
       delay(10);
       kolibrovka = (kolibrovka + 1);
       }
     
       if ((vodorod > 1) && (kislorod > 1) && (voltage_2 > 90))    
       {
       delay(10);
       knopka = ( knopka + 1);
       }  
     
       if ((knopka >= 1) && (kolibrovka > 1) && ( valore1 > 10000))
       {
         artefakt = (artefakt + 1);
       }
     
          if ((magnit_1 > 600) && (magnit_2 > 600))
       {
         avtopilot = (avtopilot + 1);
       }
     
       if((valore > 1000) && (valore2 > 10000) && (valore1 > 10000)&& ( avtopilot > 1))
       {
         dver = (dver + 1);
       }                
            if (vodorod == 0)  
            {
            mp3_play (2);
            delay(15000);
             }
            if (kislorod == 0)  
            {
            mp3_play (2);
            delay(15000);
            }  
                 
         if (kislorod == 1)  
           {
          mp3_play (3);
          delay (4000);
           }
          if  (vodorod == 1)
           {
          mp3_play (4);
          delay (4000);
           }
           
          if (kolibrovka == 1)
          {
          mp3_play (5);
          delay (9000);
          }
             
          if ((knopka == 1) && (kn == 0))
            {
            digitalWrite(5, HIGH);
            mp3_play (6);
            delay (5000);            
            }
           if ((artefakt == 1) && (art == 0))  
                {
                    digitalWrite(4, HIGH);
                    mp3_play (7);
                    delay (5000);
                }
            if ((avtopilot == 1) && (stik == 0))
            {
             displayInt(PIN, 10);
             delay(500);  
             displayInt(PIN, 20);
             delay(500);
             displayInt(PIN, 30);
             delay(500);  
             displayInt(PIN, 40);
             delay(500);
             displayInt(PIN, 50);
             delay(500);
             displayInt(PIN, 50);
             delay(500);
             displayInt(PIN, 60);
             delay(500);
             displayInt(PIN, 70);
             delay(500);
             displayInt(PIN, 8);
             delay(500);
             displayInt(PIN, 90);
             delay(500);
             displayDigits(PIN, QD_O, QD_n, QD_NONE, QD_NONE); // on
             delay(6000);        
             displayClear(PIN);                      
                           
             mp3_play (8);
             delay (20000);
                           
             mp3_play (9);
             delay (10000);
             stik = ( stik + 1);
             }


            if (dver == 1)
             {
             digitalWrite(6, HIGH);
             mp3_play (0010);
             delay (6000);
                      if (dv == 1)
                      {
                        digitalWrite(6, LOW);
                        delay(3600000);
                      }
            }
    }                    

                       







     
     
  2. ostrov

    ostrov Гуру

    Код (C++):
     delay(1000);
        displayInt(PIN, 29);
      delay(1000);
        displayInt(PIN, 28);
      delay(1000);
        displayInt(PIN, 27);
      delay(1000);
        displayInt(PIN, 26);
      delay(1000);
        displayInt(PIN, 25);
      delay(1000);
        displayInt(PIN, 24);
      delay(1000);
        displayInt(PIN, 23);
      delay(1000);
        displayInt(PIN, 22);
    и так далее уже говорит о том, что в коде реально полное собрание всех советов мудрецов. Даже вникать глубже лениво.
     
  3. redven

    redven Нерд

    Взято из примера. Если "ленива", зачем вообще отвечать? Постебаться? Если бы я был гик и хвалился таким кодом- да..а так, вы просто хвалитесь очевидным. Я знаю, что нуб. Но я учусь и пытаюсь, не сдаюсь. И ещё раз.. публикуя тут посты ждёшь совета, а не чьего-то ленивого сарказма.
     
    Последнее редактирование: 10 апр 2016
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    он клонит к тому, что написать
    Код (C++):
    for(byte i = 30; i > 0; i--)
    {
      displayInt(PIN, i);
      delay(1000);
    }
     
    будет быстрее, чем то, что написано у тебя ;)
     
    ostrov и redven нравится это.
  5. redven

    redven Нерд

    Спасибо большое за совет!) Это ведь цикл правильно называется?
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    почему кнопки подключены как-то странно? Две к одному пину, а третья отдельно.
    Код (C++):

    CapSense   cs_8_9 = CapSense(8,9);  
    CapSense   cs_8_10 = CapSense(8,10);
    CapSense   cs_11_12 = CapSense(11,12);
    это второй трек, а не десятый:
    Код (C++):
    mp3_play (0010);
    после инициализации плеера надо небольшую паузу, недавно писали об этом:
    Код (C++):
    mp3_set_serial(mySerial);
    delay(100);
    тут чего-то не хватает (иначе зачем использовать float?):
    Код (C++):
    int sensorValue_1 = analogRead(A1);
    float voltage_1 = sensorValue_1;  
     
    redven нравится это.
  7. redven

    redven Нерд

    про трек понял - он его в двоичном коде воспринимает. спасибо!
    Я заметил такую странную особенность. Если подключать не более двух сенсорных кнопок на 1 пин, то работает стабильно. Если больше двух, начинает вести себя менее стабильно. Тестировал на вот такой штуке
    и про цикл с обратным отсчетом. Я его использую в setup. И используя ваш код, обратный отсчет не запускается :(
     
    Последнее редактирование: 10 апр 2016
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    i >0

    мне вот это не нравится:
    Код (C++):
          int kn = digitalRead(5);      // считываем
          int art = digitalRead(4);
          int dv = digitalRead(6);
    Считываем состояние кнопок в начале, а используем эти значения хрен знает где в конце. По коду за этот период может пройти десяток секунд.

    P.S. и для digitalRead оптимальнее использовать boolean, а не int.
     
    Последнее редактирование: 10 апр 2016
    redven нравится это.
  9. redven

    redven Нерд

    i - что делает в данном случае? Если русским языком функцию описать?
    Спасибо вам большое за совет и время потраченное на меня! Ваши советы очень важны! И что бы 1 не оставалось на дисплее после обратно отсчета я добавил
    Код (C++):
     for(byte i = 30; i > 0; i--) // цикл тестируем
      {
      displayInt(PIN, i);
      delay(1000);
      displayClear(PIN);
      }
     
    Последнее редактирование: 10 апр 2016
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    i - это переменная, значение которой при каждом проходе цикла становится на единичку меньше.
    Когда условие i>0 перестает выполняться, цикл прерывается.
     
    redven нравится это.
  11. Unixon

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

    Раз, два.
     
    redven нравится это.