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

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

  1. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    угу пару дублирующих условий проверки дублируется. написал на йиффах. стало немного короче 167 строк против 390 на switch case. прикольный момент. когда было на switch 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 Test_cycle = 1;

    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);
    Serial.begin(9600);
    }

    void loop() {

      while (Test_cycle == 1)
     

      {
        int all_cool_IN;
        int all_cool_OUT;
        int TestIN = analogRead(pin_TestIN); //Led_IN_yellow Led_IN_blue Led_OUT_yellow Led_OUT_blue
        int TestOUT  = analogRead(pin_TestOUT);
       
    //обработка данных входного датчика
    if  (TestIN < 409 )
    { digitalWrite (Led_IN_yellow, 0);
        all_cool_IN=0;
        static unsigned long previousMillis7 = 0;
        if (millis() - previousMillis7 > 300)
        {
        previousMillis7 = millis();
        digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue));
        }
    }

    else if (TestIN > 409 && TestIN < 450 )
    {
        all_cool_IN=1;
        digitalWrite (Led_IN_blue, 1);      
        digitalWrite (Led_IN_yellow, 0);
     
    }

    else if (TestIN > 450 && TestIN < 471 )
    {
        all_cool_IN=1;
        digitalWrite (Led_IN_blue, 1);      
        digitalWrite (Led_IN_yellow, 1);
    }
    else if (TestIN > 471 && TestIN < 512 )
    {
        all_cool_IN=1;
        digitalWrite (Led_IN_blue, 0);      
        digitalWrite (Led_IN_yellow, 1);
    }

    else if (TestIN > 512 )
    {
        all_cool_IN=0;
        digitalWrite (Led_IN_blue, 0);      
        static unsigned long previousMillis21 = 0;
        if (millis() - previousMillis21 > 300)
        {
        previousMillis21 = millis();
        digitalWrite(Led_IN_yellow, !digitalRead(Led_IN_yellow));
        }
    }

    //обработка данных выходного датчика
    if  (TestOUT < 409 )
    {
           all_cool_OUT=0;
          digitalWrite (Led_OUT_yellow, 0);
          static unsigned long previousMillis1 = 0;
          if (millis() - previousMillis1 > 300)
          {
           previousMillis1 = millis();
          digitalWrite(Led_OUT_blue, !digitalRead(Led_OUT_blue));
          }


    }

    else if (TestOUT > 409 && TestOUT < 450 )
    {
         all_cool_OUT=1;
         digitalWrite (Led_OUT_blue, 1);
         digitalWrite (Led_OUT_yellow, 0);
     
    }
    else if (TestOUT > 450 && TestOUT < 471 )
    {
         all_cool_OUT=1;
         digitalWrite (Led_OUT_blue, 1);
         digitalWrite (Led_OUT_yellow, 1);
    }
    else if (TestOUT > 471 && TestOUT < 512 )
    {
        all_cool_OUT=1;
        digitalWrite (Led_OUT_blue, 0);
        digitalWrite (Led_OUT_yellow, 1);
    }

    else if (TestOUT > 512 )
    {
        all_cool_OUT=0;
        digitalWrite (Led_OUT_blue, 0);    
        static unsigned long previousMillis3 = 0;
        if (millis() - previousMillis3 > 300)
        {
         previousMillis3 = millis();
        digitalWrite(Led_OUT_yellow, !digitalRead(Led_OUT_yellow));
        }
    }
    //выходить лучше по нажатию кнопки а не автоматом. или придумать что бы при первой загрузке был какой то флаг
    //и по нему выходить
    if (all_cool_IN == 1 && all_cool_OUT==1)
    {
            digitalWrite (Led_IN_blue, 1);
            digitalWrite (Led_IN_yellow, 1);
            digitalWrite  (Led_OUT_blue, 1);
            digitalWrite (Led_OUT_yellow, 1);
            delay(300);
            digitalWrite (Led_IN_blue, 0);
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite  (Led_OUT_blue, 0);
            digitalWrite (Led_OUT_yellow, 0);
            delay(300);
            digitalWrite (Led_IN_blue, 1);
            digitalWrite (Led_IN_yellow, 1);
            digitalWrite  (Led_OUT_blue, 1);
            digitalWrite (Led_OUT_yellow, 1);
            delay(300);
            digitalWrite (Led_IN_blue, 0);
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite  (Led_OUT_blue, 0);
            digitalWrite (Led_OUT_yellow, 0);
            delay(300);
            digitalWrite (Led_IN_blue, 1);
            digitalWrite (Led_IN_yellow, 1);
            digitalWrite  (Led_OUT_blue, 1);
            digitalWrite (Led_OUT_yellow, 1);
            delay(300);
            digitalWrite (Led_IN_blue, 0);
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite  (Led_OUT_blue, 0);
            digitalWrite (Led_OUT_yellow, 0);
         
           // Test_cycle =0;
        }
      }
    }
    Странно суть кода одна и та же, а такая интересная разница. правда подглючивает маленько. вчера загнал скетч в сам хронограф столкнулся что нежное прикосновение к проводами идущих от датчиков тут же показывает сигнал превышения напряжения. надо будет подумать как это устранить( а может и не надо, в конце концов любительскую весч делаю. жалко сильно занят буду ближайшие дни придется сборку скетча отложить опять. хочется скорее допинать эту балалайку и начать думать над "авиагоризонтом" условий у людей мало). главное размер, вес, надежность
     
  2. mcureenab

    mcureenab Гуру

    Тут дырка в условиях. Значение 409 выколото.

    Код (C++):
    if  (TestOUT < 409 )
    {
    ....
    }

    else if (TestOUT > 409 && TestOUT < 450 )
     
    Если его вернуть в диапазон, то проверка TestOUT > 409 станет избыточной в контексте else if:




    Код (C++):
    if  (TestOUT < 409 )
    {
    ....
    }

    else if ( TestOUT < 450 )  // здесь гарантировано 409 <= TestOUT.
    {

    }
     
     
    CYITEP_BAC9I нравится это.
  3. mcureenab

    mcureenab Гуру

    Еще изящнее будет занести пороги и реакции в массив и просто находить в нем нужный элемент.

    Но на Arduino такой массив нужно будет поместить во FALSH память, чтобы не занимать оперативную память. Доступ к нему будет затруднен. Так что иногда лучше написать больше кода.... чем данных.
     
    CYITEP_BAC9I нравится это.
  4. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    длолго думал но придумал как на массивах и проверках и подстановках через for все организовать. но это будет перебор:).
    сегодня подержал в руках настоящий авиагоризонт. узнал как он работает. понял увы что максимум получится сделать игрушку с имитацией авиагоризонта и не более. http://amperka.ru/product/troyka-accelerometer и http://amperka.ru/product/troyka-magnetometer-compass не подойдут никак. первый может свести с ума долгий разворот, второй чувствителен к измененю магнитного поля и помех. создавать на таких сенсорах прибор. глупо даже для любительских целей. в интернете видел 2 попытки сделать подобное на stm32. и этих датчиках. в результате люди пришли к тому же выводу, что с любительским подходом и компонентами, это почти невыполнимо(тихо молчу про настроку и калибровку). Так что эту идею отставляю. те более вознаграждение предлагали в пределах 50 енотов. (при этом все комплектующие за мой счет).
     
  5. mcureenab

    mcureenab Гуру

    Если добавить электронный гироскоп и GPS , должно быть не плохо.
     
    CYITEP_BAC9I нравится это.
  6. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Здравствуйте всем! собрал игрушку.

    [​IMG] скеч же не хочет собираться. редиска.
    в циклах по короткому нажатию кнопки Mode_button переходит в следующий цикл по кольцу. а по длинному нажатию выходит в режим набора веса пульки. короткое нажатие работает прекрасно. а вот когда долго жмешь кнопку больше 2 секунд. Дуня говорит пока пока и виснет. пока не могу дотямать где подвох.
    код не весь что бы было проще для понимания оставил только обработку нажатия кнопки.
    Код (C++):



    int i =0;

    }

    void loop() {

      //================================================================================================
    //тест датчиков
    //====================================================================================================

    while (Test_cycle == 1)
    {
       //-----выход из цикла нажатиями кнопок----------------------------------------------------------------------------
    if(First_boot ==1||First_boot ==0 ) // если это не перый проход цикла посде загрузки то выход только нажатиями кнопок
       {
    bool NazgatieBM1 =0;
    if (digitalRead(Mode_button) ==HIGH && Flag_MBc ==0 )//если кнопка воборов режима нажата
        {
         StartMillis=millis();//засекаем время нажатия
         Flag_MBc = 1; }
     
    if (digitalRead(Mode_button) ==LOW  && Flag_MBc ==1)//если кнопка выбора режима отжата
        {
         StopMillis = millis();//засекаем время отжатия
         NazgatieBM1 =1; //флаг что было нажатие
         Flag_MBc =0; }



    if (StopMillis - StartMillis >20 && StopMillis - StartMillis <2000 && NazgatieBM1 ==1)   //если было короткое нажатие на кнопку выбора режима переходим в след режим
    {StartMillis = 0;
    StopMillis = 0;
       First_boot =1;
    NazgatieBM1 =0;
    digitalWrite (Led_IN_blue, 0);
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite  (Led_OUT_blue, 0);
            digitalWrite (Led_OUT_yellow, 0);
    OUT_cycle = 0;
    Speed_cycle = 0;
    Energy_cycle = 0;
    Test_cycle = 0; // переходим в тест цикл
    Meas_num_cycle = 0;
    IN_cycle = 1 ;
    }


    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >2000 && NazgatieBM1 ==1)
    { StartMillis = 0;
      StopMillis = 0;
      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;

       }
        if (long_press ==1) // если есть флаг длинного нажатия
        {
      First_boot =1;
      long_press =0;
      digitalWrite (Led_IN_blue, 0);
            digitalWrite (Led_IN_yellow, 0);
            digitalWrite  (Led_OUT_blue, 0);
            digitalWrite (Led_OUT_yellow, 0);
      IN_cycle = 0 ;
    OUT_cycle = 0;
    Speed_cycle = 0;
    Test_cycle = 0;
    Meas_num_cycle = 0;
    Energy_cycle = 1;    // перходим в цикл ввода веса пульки

    }
       }

      }
    //====================================================================================================================================
    //входной цикл
    while(IN_cycle == 1)//ждем срабатывания датчиков на "входном" пине
        {

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



    if (StopMillis - StartMillis >20 && StopMillis - StartMillis <2000 && NazgatieBM1 ==1)   //если было короткое нажатие на кнопку выбора режима переходим в след режим
    {StartMillis = 0;
    StopMillis = 0;  
    NazgatieBM1 =0;

    OUT_cycle = 0;
    Speed_cycle = 0;
    Energy_cycle = 0;
    Test_cycle = 0; // переходим в тест цикл
    IN_cycle = 0 ;
    Meas_num_cycle = 1;
    }


    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >2000 && NazgatieBM1 ==1)
    { StartMillis = 0;
      StopMillis = 0;
      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;

       }
        if (long_press ==1) // если есть флаг длинного нажатия
        {

      long_press =0;
      digitalWrite (Led_IN_blue, 0);
       
      IN_cycle = 0 ;
    OUT_cycle = 0;
    Speed_cycle = 0;
    Test_cycle = 0;
    Meas_num_cycle = 0;
    Energy_cycle = 1;    // перходим в цикл ввода веса пульки

    }
        }
     
    // обработка сигнала выходного датчика
    //==============================================================================================================================
        while(OUT_cycle == 1)
        {
       
    }

    //вывод показаний на дисплей и расчет энергии
    //========================================================================================================
      while (Speed_cycle == 1 )
        {
       
        }
     
    //отображение результатов сохраненных измерений
    //=============================================================================================================================
    while( Meas_num_cycle == 1)

    {Serial.println("Meas_num_cycle");

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



    if (StopMillis - StartMillis >20 && StopMillis - StartMillis <2000 && NazgatieBM1 ==1)   //если было короткое нажатие на кнопку выбора режима переходим в след режим
    {StartMillis = 0;
    StopMillis = 0;
      i = reservation   ; //возвращаем i значение которое было до выхода в режим показа сохраненных измерений
    NazgatieBM1 =0;
    IN_cycle = 0 ;
    OUT_cycle = 0;
    Speed_cycle = 0;
    Energy_cycle = 0;
    Test_cycle = 1; // переходим в тест цикл
    Meas_num_cycle = 0;
    }


    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >2000 && NazgatieBM1 ==1)
    { StartMillis = 0;
      StopMillis = 0;

      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;


        if (long_press ==1) // если есть флаг длинного нажатия
        {
      i = reservation   ;
      long_press =0;
      IN_cycle = 0 ;
    OUT_cycle = 0;
    Speed_cycle = 0;
    Test_cycle = 0;
    Meas_num_cycle = 0;
    Energy_cycle = 1; // перходим в цикл ввода веса пульки

    }
    }
    }
    }
     
    Конечно сам стараюсь допереть где фикус порылся. но если кому то явно в глаза бросится причина буду благодарен.
     
  7. ostrov

    ostrov Гуру

    Меня смущает такая запись составных условий:
    Код (C++):
    if (StopMillis - StartMillis >20 && StopMillis - StartMillis <2000 && NazgatieBM1 ==1)  
    Уверены, что без скобок каждое условие просчитывается верно?

    В частности вот это точно сперва вычитает а потом сравнивает?
    Код (C++):
    StopMillis - StartMillis <2000
     
    CYITEP_BAC9I нравится это.
  8. mcureenab

    mcureenab Гуру

    CYITEP_BAC9I нравится это.
  9. ostrov

    ostrov Гуру

    Да видел таблицу, но все же все же...
     
    CYITEP_BAC9I нравится это.
  10. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    вечер добрый. тут что то не то(. надо будет с самого начала по блокам внимательно все собрать. возможно дуне не нравится что обработку нажатий с одними и теми же переменными я вставлял в разные циклы. попробую в каждом цикле свою переменную для сохранения времени и свои отдельные флаги. обявить не в глобальных переменных, а в самом цикле. вообще странно, что такого я написал, что при длинном нажатии дуня впадает в стопор и зависает. постораюсь дойти до истины. Как вариант что то физической природы(это моя реанимированная дуня). кстати сегодня китайскин фототранзистры пошутили сильно. днем было 35 в тени, все окна открыты. начал играться с хронографам, а у него чуйка пропала. реагировал только на большие и медленно летящие предметы типо спичечного коробка. расстроился сильно, думал все, накрылся компаратор. потом включил кондиционэр и через некоторое время снова включил на удачу. случилось чудо!!! он опять стал отлавливать пролетающие спичечные головки. снова вынес на жару(в тень естественно) опять не работает. в общем у этих отстойных фототранзисторов есть тяготение к прохладе).
     
  11. mcureenab

    mcureenab Гуру

    Если все в скобках, то это Lisp а не C++.;)
     
  12. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Всем здравствуйте. перепробовал кучу вариантов. и с millis и delay вставлял готовые примеры в скетч. все одно. написал чисто с циклами скетч без ничего. Прогнал через симулятор построчно, явных ошибок нет. короткие нажатия отрабатываются прекрасно. стоит только нажать на длинное нажатие, все даже у симуляторной дуни все циклы начинают хаотично переключаться и нет возможности выйти из этого состояния без перезагрузки. Или я что то еще не вкурил про циклы или с чем то неведомым столкнулся. ну не работает длинное нажатие и все тут. причем когда тот же кусок скетча елси достать его из цикла whileи просто запустить работает адекватно. ужас короче. пойду еще раз проштудирую блокнот программиста.
    Код (C++):
    bool Energy = 1;
    bool IN_cycle  = 0;
    bool OUT_cycle = 0;
    bool Test_cycle = 0;
    #define knobka 7
    bool Flag_S_up =0;
    uint32_t ms_button = 0;
    unsigned long StartMillis = 0;
       unsigned long StopMillis = 0;
       bool  NazgatieBM1 =0;
    bool long_press =0;
      bool Flag_MBc =0;


    void setup() {
    pinMode(knobka, INPUT);
    Serial.begin(9600);
    }

    void loop() {

      //===============================================================================================================
    while (Energy == 1)
    {Serial.println("Energy");
    if ( digitalRead(knobka)==1 && Flag_MBc ==0   )//е&&(ms-ms_button)>15сли кнопка воборов режима нажата
        { //ms_button= ms;
      delay(20);
     
         StartMillis=millis();//засекаем время нажатия
          Flag_MBc = 1;
       
      Serial.println("NAZGATIE");
          }
       
    if (digitalRead(knobka) ==0  && Flag_MBc ==1 )//&& (ms-ms_button)>15если кнопка выбора режима отжата
        {//ms_button= ms;
      delay(20);
      Serial.println("OTZGATIEEEEE");
         StopMillis = millis();//засекаем время отжатия
         NazgatieBM1 =1; //флаг что было нажатие
         Flag_MBc =0;
       
    }

    if (StopMillis - StartMillis <1000&& NazgatieBM1 ==1 )   //если было короткое нажатие на кнопку выбора режима переходим в след режим
    {StartMillis = 0;
    StopMillis = 0;
      Serial.println("KOROTCOE");

    Energy = 0;
    IN_cycle  = 1;
    NazgatieBM1 =0;}

    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >1000 && NazgatieBM1 ==1) //
    {      StartMillis = 0;
      StopMillis = 0;
      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;
     
      Serial.println("DLINNOE");
       }
        if (long_press ==1)
        {
          long_press = 0;
       Test_cycle =0;  
      IN_cycle  = 0;
    OUT_cycle = 1;
    Energy = 0;

    }  

    }


    //====================================================================================================
    while (IN_cycle  == 1)
    {
    Serial.println("IN_cycle ");
    if ( digitalRead(knobka)==1 && Flag_MBc ==0   )//е&&(ms-ms_button)>15сли кнопка воборов режима нажата
        { //ms_button= ms;
      delay(20);
     
         StartMillis=millis();//засекаем время нажатия
          Flag_MBc = 1;
       
      Serial.println("NAZGATIE");
          }
       
    if (digitalRead(knobka) ==0  && Flag_MBc ==1 )//&& (ms-ms_button)>15если кнопка выбора режима отжата
        {//ms_button= ms;
      delay(20);
      Serial.println("OTZGATIEEEEE");
         StopMillis = millis();//засекаем время отжатия
         NazgatieBM1 =1; //флаг что было нажатие
         Flag_MBc =0;
       
    }

    if (StopMillis - StartMillis <1000&& NazgatieBM1 ==1 )   //если было короткое нажатие на кнопку выбора режима переходим в след режим
    {StartMillis = 0;
    StopMillis = 0;
      Serial.println("KOROTCOE");

    Energy = 1;
    IN_cycle  = 0;
    NazgatieBM1 =0;}

    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >1000 && NazgatieBM1 ==1) //
    {      StartMillis = 0;
      StopMillis = 0;
      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;
      Serial.println("DLINNOE");
       }
        if (long_press ==1)
        {
         
    long_press = 0;
    OUT_cycle = 1;
    IN_cycle  = 0;
    }
    }
     


    while (OUT_cycle == 1)
    {
    Serial.println("OUT_cycle");
    if ( digitalRead(knobka)==1 && Flag_MBc ==0   )//е&&(ms-ms_button)>15сли кнопка воборов режима нажата
        { //ms_button= ms;
      delay(20);
     
         StartMillis=millis();//засекаем время нажатия
          Flag_MBc = 1;
       
      Serial.println("NAZGATIE");
          }
       
    if (digitalRead(knobka) ==0  && Flag_MBc ==1 )//&& (ms-ms_button)>15если кнопка выбора режима отжата
        {//ms_button= ms;
      delay(20);
      Serial.println("OTZGATIEEEEE");
         StopMillis = millis();//засекаем время отжатия
         NazgatieBM1 =1; //флаг что было нажатие
         Flag_MBc =0;
       
    }

    if (StopMillis - StartMillis <1000&& NazgatieBM1 ==1 )   //если было короткое нажатие на кнопку выбора режима переходим в след режим
    {StartMillis = 0;
    StopMillis = 0;
      Serial.println("KOROTCOE");

    Energy = 1;
    OUT_cycle = 0;
    NazgatieBM1 =0;}

    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >1000 && NazgatieBM1 ==1) //
    {      StartMillis = 0;
      StopMillis = 0;
      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;
      Serial.println("DLINNOE");
       }
        if (long_press ==1)
        {
       long_press = 0;  
    Test_cycle = 1;
    OUT_cycle = 0;

    }

    }

    //===============================================================================================
    while (Test_cycle == 1)
    {
    Serial.println("Test_cycle");
    if ( digitalRead(knobka)==1 && Flag_MBc ==0   )//е&&(ms-ms_button)>15сли кнопка воборов режима нажата
        { //ms_button= ms;
      delay(20);
     
         StartMillis=millis();//засекаем время нажатия
          Flag_MBc = 1;
       
      Serial.println("NAZGATIE");
          }
       
    if (digitalRead(knobka) ==0  && Flag_MBc ==1 )//&& (ms-ms_button)>15если кнопка выбора режима отжата
        {//ms_button= ms;
      delay(20);
      Serial.println("OTZGATIEEEEE");
         StopMillis = millis();//засекаем время отжатия
         NazgatieBM1 =1; //флаг что было нажатие
         Flag_MBc =0;
       
    }

    if (StopMillis - StartMillis <1000&& NazgatieBM1 ==1 )   //если было короткое нажатие на кнопку выбора режима переходим в след режим
    {StartMillis = 0;
    StopMillis = 0;
      Serial.println("KOROTCOE");
    Test_cycle = 0;
    Energy = 1;
    NazgatieBM1 =0;}

    // если зафиксировано длинное нажатие
    if (StopMillis - StartMillis >1000 && NazgatieBM1 ==1) //
    {      StartMillis = 0;
      StopMillis = 0;
      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;
      Serial.println("DLINNOE");
       }
        if (long_press ==1)
        {
        long_press = 0;  
    Test_cycle = 0;
    OUT_cycle = 1;

    }
    }
    }
     
     
    Последнее редактирование: 15 июн 2017
  13. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    нашел причину!!!!! никакой мистики)) не там обнулял флаг длинного нажатия long_press =0;
    когда переставил его за скобки все заработало. из за такой мелочи столько времени потерял. правильный вариант.
    Код (C++):
    if (StopMillis - StartMillis >1000 && NazgatieBM1 ==1) //
    {      StartMillis = 0;
      StopMillis = 0;
      long_press = 1;  // флаг длинного нажатия
       NazgatieBM1 =0;
      Serial.println("DLINNOE");
       }
        if (long_press ==1)
        {
         
    Test_cycle = 0;
    OUT_cycle = 1;

    }
    long_press = 0;
    }
    господа можете подсказать алгоритм как избавится от delay при выводе на дисплей данных
    Код (C++):
    disp.display(0,a);
         disp.display(1,b);
     
        delay(1000);
         if(bullets_weight > 0)
        {
        Energy = (bullets_weight* (Speed*Speed))/2;
        disp.display(Energy);
        delay(2000);
        }
        else
        {
        disp.display(Speed);
        delay(4000);
          disp.display(0,NumTab[17]); //убираем идикацию с дисплея
        disp.display(1,NumTab[17]);
        disp.display(2,NumTab[17]);
        disp.display(3,NumTab[17]);
       
        InPort_mcs=0;
    примеров как в таком случае перевести на millis не нашел. мне хотя бы алгоритм как это на миллис будет выглядеть. пытлся сам. но ничего кроме зацикливания индикации не получил. смысл в следующем сначала выводиться номер измерения ==> пауза 1 сек ==> энергия==>пауза 2 секунды==>скорость измерения==>пауза 4 секунды==> убираем индикацию с экрана. deley неудобен тут
     
  14. CYITEP_BAC9I

    CYITEP_BAC9I Гик

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

    TM1637 disp(CLK,DIO);


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

    }

    void loop()
    {


    unsigned long time_ =0 ; // переменная для храниния времени
     

    bool nomer = 1; // флаги для управления циклами
    bool energija =0;
    bool skorost =0;
      int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,};

    while(nomer ==1) // индикация номера 1 сек
    {disp.display(0,0);
    disp.display(1,0);
    disp.display(2,0);
    disp.display(3,0);
      if (millis() - time_>1000) // как только время будет больше 1 сек
    { time_=millis();  // запоминаем новое значение
    nomer =0;  // выходим из этого цикла
    energija =1; // входим в следующий
    }
    }
    while(energija ==1)
    {
    disp.display(0,1);
      disp.display(1,1);
    disp.display(2,1);
    disp.display(3,1);
      if (millis() - time_>2000)
    { time_=millis();
    skorost =1;
    energija =0;
    }
    }
    while(skorost ==1)
    {
      disp.display(0,8);
      disp.display(1,8);
    disp.display(2,8);
    disp.display(3,8);
      if (millis() - time_>4000)
    { time_=millis();
    skorost =0;
    nomer =1;
    }
    }

    }
     
    уже лучше чем deley но по прежнму не фонтан. в каждом цикле придется ставить условие выхода по нажатию кнопки. может кто знает как это проще реализовать?
     
  15. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    вечер бобрый. в посте выше был в полушаге от решения. и я его решил!!! Кстати такого способа смены индикации ни где не встречал) получается вроде как открытие). может Нобелевскую премею дадуть).
    Код (C++):
    #include "TM1637.h" // Подключаем библиотеку
    #define CLK 12 // К этому пину подключаем CLK
    #define DIO 13 // К этому пину подключаем DIO

    TM1637 disp(CLK,DIO);

    bool prohod =0;
    bool nomer = 1;
    bool energija =0;
    bool skorost =0;

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

    }

    void loop()
    {


    static unsigned long time_ =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(nomer ==1)
    {disp.display(0,0);
    disp.display(1,0);
    disp.display(2,0);
    disp.display(3,0);
      if (millis() - time_>1000)
    { time_=millis();
    disp.display(0,1);
      disp.display(1,1);
    disp.display(2,1);
    disp.display(3,1);
    nomer =0;
    energija =1;
    skorost =0;
    }
    }
    if(energija ==1)
    {
      if (millis() - time_>2000)
    { time_=millis();
    disp.display(0,8);
      disp.display(1,8);
    disp.display(2,8);
    disp.display(3,8);
    nomer =0;
    energija =0;
    skorost =1;
    }
    }
    if(skorost ==1)
    {
      if (millis() - time_>3000)
    { time_=millis();
    nomer =1;
    energija =0;
    skorost =0;
    }
    }

    }
     
    и все прекрасно работает. кнопки кнопятся, циклы циклятся. единственно еще пара переменных добавилась, что бы входить выходить из этого режима, но это мелочи по сравнению с простотой решения и отказа от deley. пойду кваса напьюсь на радостях. ну и о' крошки вкушу)

    уважаемые гуру и им приближенные. посоветуйте книжку на ночь о C++. мне не хватает уже базового курса Ардуиньщика. Все чаще сталкиваюсь с вопросами на которые в методичках стартового уровня нет ответа. В то же время хочется не распыляться, а поучить С++ именно ориентированногона программирование МК.
     
  16. mcureenab

    mcureenab Гуру

    CYITEP_BAC9I нравится это.
  17. ostrov

    ostrov Гуру

    Так на глаз, вот это пишется одной строкой:
    Код (C++):
    if(skorost ==1)
    {
      if (millis() - time_>3000)
    {
     
    CYITEP_BAC9I нравится это.
  18. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    всем спасибо Большое. попробую еще один подход сделать по сборке скетча.
     
    Последнее редактирование: 15 июн 2017
  19. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Вечер добрый.собрал все вместе. в целом уже работает. теперь плюшки настраиваю. печалит рассчет энергии выстрела Energy = (bullets_weight* (Speed*Speed))/2; получается отрицательное число и неверное притом. переменная Energy - float (другой тип компилятор сам недает установить). честно говоря уже лень сегодня разбираться. то что если одно число в выражении имеет float тип, то и на выходе тоже имеем float. но что в данном случае сделать??? bullets_weight и Speed типа int. На...ался сегодня с выводом индикации, чтоб работало и не тормозило другие функции, все получилось, но думать уже лень сегодня)
    если кто сможет, подскажите пожалуйста, как сделать, чтобы в результате получилась число типа int, да еще и положительное. А то завтра самому придется думать)
     
  20. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    господа я понял что у меня с математикой что то не то. Сечас начал C++ читать может пойму что нибудь [​IMG]

    но почему?????
    Округлил коряво Int -ом переменную энргии с результатом 3.00 вместо 4.00. это я понимаю почему и исправлю. Но откуда там берется минус??? все исходные числа целые (до деления) положительные. к тому же не всегда отрицательный результат иногда и положительные проскакивают. Просьба, хотяб ы в кратце разжуйте как такое возможно.