Отобразить на ** секунд и погаснуть

Всем привет. Есть кусок кода, который отображает на дисплее время и гаснет через i от 0 до 100. Это ужасная практика, как можно все это переделать на миллис или хотя уйти от while ??? Пытался через несколько millis вместо delay, но на индикаторе отображается ерунда (((

Сам исходный код такой:

void mode_display_time(){    //функция отображения текущего времени
    RTC.read(tm);
    int i = 0;
   
    while(i < 100) {
      now_time = tm.Hour*100 + tm.Minute; 
      
      int a = now_time/ 1000;
      int b = now_time % 1000/100;
      int c = now_time % 100/10;
      int d = now_time % 10;
      
                digitalWrite(DIGIT_1PIN,HIGH);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(a);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,HIGH);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(b);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,HIGH);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(c);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,HIGH);
                show_number(d);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);  
                i++;
     }
     display_digits_off();
     numMenu = 0;
}

А для чего while и 4 дилэя?

Через while таким образом отключаю отображение сегментов через промежуток времени. Delay - отображение символов на 4- символьном 7 сегментом индикаторе поочередно.

Внимательно читайте вопрос:

Как именно пытался? Где скетч попытки?

Ждём ответа.

Пока мы этого не увидим, считаем, что не пытался никак, просто хочется, чтобы кто-то на халяву переделал.

На халяву и весь код, точно не надо !!! Сейчас сделаю то, что пытался сделать .

Вот такое не работает

unsigned long task1Interval = 1000;  
unsigned long task2Interval = 1000;   
unsigned long task3Interval = 1000;   
unsigned long task4Interval = 1000;
unsigned long task5Interval = 1000;     

unsigned long previousTask1Millis = 0;
unsigned long previousTask2Millis = 0;
unsigned long previousTask3Millis = 0;
unsigned long previousTask4Millis = 0;
unsigned long previousTask5Millis = 0;

void mode_display_time(){    //функция отображения текущего времени
    RTC.read(tm);

      now_time = tm.Hour*100 + tm.Minute; 
      
      int a = now_time/ 1000;
      int b = now_time % 1000/100;
      int c = now_time % 100/10;
      int d = now_time % 10;

      if (millis() - previousTask1Millis >= task1Interval) {
      previousTask1Millis = millis(); 
                digitalWrite(DIGIT_1PIN,HIGH);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(a);
      }

    if (millis() - previousTask2Millis >= task2Interval) {
    previousTask2Millis = millis(); 
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,HIGH);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(b);
    }

        if (millis() - previousTask3Millis >= task3Interval) {
    previousTask3Millis = millis(); 
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,HIGH);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(c);
    }

    
        if (millis() - previousTask4Millis >= task4Interval) {
    previousTask4Millis = millis(); 

                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,HIGH);
                show_number(d);
    }

            if (millis() - previousTask5Millis >= task5Interval) {
    previousTask5Millis = millis(); 

                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);  
    }

 
     display_digits_off();
     numMenu = 0;
}
  

Скетч неполный, потому ничего сказать нельзя. Как часто вызывается функция mode_display_time? Если типа “один раз и должна показать”, то и не должно работать.

… дальше рассуждать не буду, ибо скетча не вижу и не хочу “вилами в воду” тыкать.

1 лайк

Тебе на Романовскую 55, там еще и скидка

1 лайк