вопрос про millis()

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

  1. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    сдаюсь:mad:.
    написал "исчо" один таймер. это чисто мое изобретение, аналогов в интернете не встречал.
    работает так же с любого места кода, но громоздкий получился.

    Код (C++):
    byte Chasy, Minuty,   ms;
    unsigned long Intermediate_Sekundy, Sekundy_t,Sekundy, Current;

    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    }

    void loop() {
    // Current = millis();
      if (millis() >4568) //это условие для проверки что отсчет начнется с 0
    {
    static unsigned long Intermediate_Sekundy = (millis()/ 1000);

    Sekundy_t = ((millis() / 1000) - Intermediate_Sekundy);
    if (Sekundy_t>59)         //так написал работоспособность что бы проверить. что больше минуты //не будет работать знаю я, просто под рукой был этот огрызок сскетча                        
      {
        Minuty++ ;                                
        Sekundy_t=0;
        Serial.println(Minuty);                                  
      }
    if (Minuty>59)                                    
      {
        Chasy++;                                    
        Minuty=0;                                    
      }
    }
    Serial.println("Sekundy_t");
      Serial.println(Sekundy_t);
        Serial.println("Minuty");
      Serial.println(Minuty);
    }
    работает как ни странно. но к решению как облагородить
    Код (C++):
    static unsigned long Counter_05_sec = millis();
        if (millis() - Counter_05_sec >= 1000)
    так и не пришел. если поделитесь опытом буду благодарен. сам видно не додумаюсь. Все пошел меню дописывать. сегодня уплыло молоко и меня нехорошими словами называли, и грубо интересовались когда я восстанавлю мультиварку.
     
    Последнее редактирование: 11 июл 2017
  2. mcureenab

    mcureenab Гуру

    Код (C++):
    static unsigned long Counter_1_sec = millis(); //static
        if (millis() >= Counter_1_sec ) //if (millis() - Counter_1_sec > 498)
          {
             Counter_1_sec += 1000;      
      Sekundy_t++;
    Serial.println(Sekundy_t);
    if (Sekundy_t>59)                                
      {
        Minuty++ ;                                
        Sekundy_t=0;
        Serial.println(Minuty);                                
      }
    if (Minuty>59)                                    
      {
        Chasy++;                                  
        Minuty=0;                                    
      }


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

    CYITEP_BAC9I Гик

    спасибо спасибо спасибо!!! честно говорю до этого не допер бы. Вот что значит опыт!
    Этот таймер можно даже в вики "Амперки" добавить. простой, надежный и универсальный!!!
     
  4. mcureenab

    mcureenab Гуру

    В этом скетче...

    1. Если программа замешкается, millis () может пройти точку 1000 и тик будет пропушен.
    Было, положим. 2000, потом 2001 и т.д до 2999 и тут программа что то делает 1.5мс. Следующее millis вернет 3001. Тик пропушен.

    2. Второй вызов millis может вернуть на 1мс большее значение.
    Т.е. в момент сравненич таймер показывал 1000999 мкс. millis вернул 1000, но пока if соображал и т.п. таймер тикнул на 1001000. Интервал тиков сдвинулся на 1мкс.

    Код (C++):
    static unsigned long Counter_05_sec = millis(); //static
        if (millis() - Counter_05_sec == 1000) //if (millis() - Counter_05_sec > 498)
          {
             Counter_05_sec = millis();        
      Sekundy_t++;
     
    CYITEP_BAC9I нравится это.
  5. ostrov

    ostrov Гуру

    Юзайте прерывание по таймеру.
     
    CYITEP_BAC9I нравится это.