Время работы по включению и выключению

ard-20
Offline
Зарегистрирован: 05.10.2020

###

nik182
Offline
Зарегистрирован: 04.05.2015

Поймите, от подключения зависит очень много, особенно для контроля трёх фаз. Если подключено без фильтра, то на входе мы имеем импульсы длиной 10 миллисекунд и сважностью 2, со сдвигом фаз 20мс/3 = 6.(6) мс. Если нужно отслеживать только отключение напряжения, то на входе ставят выпрямители с RC фильтрами и постоянная времени фильтра выпрямителя определяет с какой скоростью устройство реагирует на отключение напряжения. Зато второй способ хорошо подходит для устройств учёта времени отсутствия напряжения. Соответственно подходы к программированию совершенно разные. Ваши 0 и 1 соответствуют есть - нет напряжение или 10 мс инпульсам?   

ard-20
Offline
Зарегистрирован: 05.10.2020

Есть или нет напряжения.

Гриша
Offline
Зарегистрирован: 27.04.2014

nik182 пишет:

Поймите, от подключения зависит очень много, особенно для контроля трёх фаз.

не усложняйте жизнь ТС!!! 

у меня сын, не плохо решает по математике, но с первого до пятого у него сегодня получилось 5 этажей... 

Вот и ТС сперва решит хоть как-то, но согласно своему-же ТЗ.   

Гриша
Offline
Зарегистрирован: 27.04.2014

ard-20 пишет:

Есть или нет напряжения.

пол фазы на диодном детекторе - это есть или нет напряжения? сколько полуфаз считать отсутствием напряжения? или вопрос решен на аппаратном уровне? 

ard-20
Offline
Зарегистрирован: 05.10.2020

###

Гриша
Offline
Зарегистрирован: 27.04.2014

вот зачем вы снова лепите 3 фазы? у вас одна уже работает как нужно?

ard-20
Offline
Зарегистрирован: 05.10.2020

пытаюсь посчитать время пока нет фазы . Пока получается только с помощью while. Интересно наверное пока считает то остальной код не выполняется? Или нет . 

И можно ли для трех фаз так применить

int a,b,c;
unsigned long time_A;
 unsigned long timer1 =0;
unsigned long timer2 =0;
unsigned long timer3 =0;

void setup() {
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
/*
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(6, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(7, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }*/
}  

void loop(){

while (digitalRead(5) ==HIGH)
  {timer2 = millis()/1000;
  a=1;}


  
while (digitalRead(5) ==LOW)
  {timer1 = millis()/1000;
  
  b=1;}

 if (a==1 && b==1 ){
 timer3 = timer1 - timer2;
  
  Serial.println(timer1);
  Serial.println(timer2);
  Serial.println(timer3);
  a=0;
  b=0;
 }
   }

 

nik182
Offline
Зарегистрирован: 04.05.2015

Отлично. Тогда следующий вопрос - что надо получить? Полное время отключения по фазам для одного отключения? Суммарное время отключения по фазам если отключений несколько за определённый отрезок времени? Выдать ошибку , если отключение больше 5 секунд и потом выдать полное время отключения фазы? Могу придумать ещё много вариантов реакции программы на изменения уровня сигналов на входах 5,6,7.   

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

пытаюсь посчитать время пока нет фазы . Пока получается только с помощью while. Интересно наверное пока считает то остальной код не выполняется? Или нет . 

И можно ли для трех фаз так применить

Пока выполняется while, остальной код ждет. Поэтому для трех фаз так работать не будет.

 

вам же выше вроде обьяснили, как считать время отсутсвия фазы. В чем опять проблема-то? Снова ждете, пока вам готовый код напишут?

1.Когда пропала фаза - начинаете считать время.
2. Когда время превысить 5 сек - выводите предупреждение.
3. Как фаза вернулась обратно - выводите прошедшее время.

Пункты 1 и 2 вам уже помогли написать. Неужели так трудно написать п3 по аналогии с п2?

b707
Offline
Зарегистрирован: 26.05.2017

надо было еще на второй странице Деду заплатить, чтоб он закрыл ветку :)

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

Пропала фаза начинаю считать while считает  а чем еще зафиксировать старт и стоп ?

 

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

Пропала фаза начинаю считать while считает

используя while, вы не сможете контроллировать три фазы одновременно.

ard-20
Offline
Зарегистрирован: 05.10.2020

###

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Вас это чудо тупо уже третий день разводит на код.
Не ведитесь.
Сам он написал ровно ноль целых ноль десятых и даже не пытается въехать в тему, ему это не надо , ему нужен код

ard-20
Offline
Зарегистрирован: 05.10.2020

да не нужен мне код - напишу. 

Нужно понимание 

1 - Как обнулить таймер.

2-запустить по событию.

3- остановить по событию.

И ни кого я не развожу  а пытаюсь понять эти 3 позиции поэтому и спрашиваю у Вас.

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

Нужно понимание 

1 - Как обнулить таймер.

== никак. Да и не нужно этого делать. Вы когда время на часах засекаете - вы их обнуляете разве? - нет, просто запоминаете текущее время. Вот и тут точно также - просто запоминайте значение миллис

Цитата:
2-запустить по событию.

=== опять не нужно. Таймер миллис запущен всегда и уже тикает, опять же как часы на руке

Цитата:
3- остановить по событию.

=== и в третий раз мимо. Не надо останавливать. Смотрите на время - и вычитаете из него значение, запомненое в п1.

 

Ваша ошибка - вы воспринимаете таймер, как секундомер, который надо запускать и останавливать. Это неверно. Вместо этого используйте аналогию с обычными часами.

 

 

ard-20
Offline
Зарегистрирован: 05.10.2020

Да Вы правы поэтому и не могу толком понять. Нужны хоть какие то примеры.

ard-20
Offline
Зарегистрирован: 05.10.2020

###

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

продам горсть будильников. Недораха. 

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

Да Вы правы поэтому и не могу толком понять. Нужны хоть какие то примеры.

возьмите пример с вокзальными часами. На вокзальные часы вы никак не можете повлиять - не можете их пускать и останавливать, менять время. Но это абсолютно не мешает засечь по часам хоть 10 минут. хоть 2 часа.

Или, например,  решить задачу - Сколько минут прошло от ухода электрички до прихода скорого поезда? - ведь это просто. не так ли?

А теперь замените уход электрички на пропадение фазы. а приход поезда - на появление - вы получите алгоритм измерения нужного вам отрезка.

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

продам горсть будильников. Недораха. 

Деда, по мне так это лишнее. Человек должен научиться сам работать с миллис, а ты ему костыль подсовываешь, это решение в стиле гайвера :) (не обижайся. тезка :)

ard-20
Offline
Зарегистрирован: 05.10.2020

факт ухода и прихода электрички как зафиксировать

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

факт ухода и прихода электрички как зафиксировать

пипец...

ard-20 - мы что, по третьему кругу пошли? Вопрос "Как зафиксировать переход HIGH - LOW ?" уже обсуждали на второй странице.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

DetSimen пишет:

продам горсть будильников. Недораха. 

Деда, по мне так это лишнее. Человек должен научиться сам работать с миллис (не обижайся. тезка :)

Акей. :)  Тенболее, он там всёрно нихрена не поймёт. :) 

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Вас это чудо тупо уже третий день разводит на код. Не ведитесь. Сам он написал ровно ноль целых ноль десятых и даже не пытается въехать в тему, ему это не надо , ему нужен код

К сожалению, очень похоже на правду. Человек получил готовый код и даже не потрудился понять, как он работает... при таком подходе что-либо добавить сам он конечно не сможет... отсюда и эта ветка на 200 постов - ТС просто тупо ждет, когда кто-нить психанет и выложит ему готовый скетч... чтобы больше не смотреть на эту тупость.

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

И для трех фаз вроде вышло 


byte last_pin_state1,last_pin_state2, last_pin_state3;
unsigned long timer1 = 0,timer2 = 0,timer3 = 0;

void setup() {
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
/*
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(6, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(7, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }*/
}  

void loop(){
   
 byte status1 = digitalRead(5);
 if(status1 != last_pin_state1)        // состояние пина поменялось
  {
    last_pin_state1 = status1;         // сохраняем текущее
   if(status1 == LOW)                // включили
    {
      timer1 = millis();               // запоминаем время включения
    }
else                                  // выключили
    {                                   // печатаем продолжительность работы
     Serial.print("Фаза_А: ");
     Serial.println((millis() - timer1)/1000);
    }
  }

 byte status2 = digitalRead(6);
 
 if(status2 != last_pin_state2)        // состояние пина поменялось
  {
    last_pin_state2 = status2;         // сохраняем текущее
   if(status2 == LOW)                // включили
    {
      timer2 = millis();               // запоминаем время включения
    }
else                                  // выключили
    {                                   // печатаем продолжительность работы
     Serial.print("Фаза_B: ");
     Serial.println((millis() - timer2)/1000);
    }
  }

byte status3 = digitalRead(7);
 
 if(status3 != last_pin_state3)        // состояние пина поменялось
  {
    last_pin_state3 = status3;         // сохраняем текущее
   if(status3 == LOW)                // включили
    {
      timer3 = millis();               // запоминаем время включения
    }
else                                  // выключили
    {                                   // печатаем продолжительность работы
     Serial.print("Фаза_C: ");
     Serial.println((millis() - timer3)/1000);
    }
  }

}

 

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

И для трех фаз вроде вышло

насколько я вижу - этот код будет непрерывно спамить в Сериал значения таймеров. вместо того чтоб вывести время один раз на каждую фазу...

Да и задержки в 5 сек в коде нет

 

Вывод - шарились по гуглю, где-то нашли готовый код, в котором, скорее всего. точно так же ничего гне понимаете, как раньше.

Братва, нас ждет вторая серия! - помогите исправить мой новый код :)

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

Попытался написать через функцию и снова в порт печатает постоянно. Подскажите как сделать чтоб печатало1 раз


unsigned long phaseTime=0;
void setup()
{
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
 
/*
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(6, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(7, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }*/
}  


// Главная функция
void loop()
{

  
  unsigned long tim = CheckPhase(5, &phaseTime);
  if(tim > 0)
  {
    if(tim < 5000)
    {
      Serial.print("Фаза 1 - Фазы нет ");
      Serial.println(tim);
    } else
    {
      Serial.println("Фаза 1 - АВАРИЯ ");
      Serial.print(tim);
    }
  }

} // loop()



// Проверка фазы
unsigned long CheckPhase(int numPhase, unsigned long *phaseTime)
{ 
   byte state = digitalRead(numPhase);

   if(state == LOW)
   {
      if(*phaseTime == 0)
      {
        *phaseTime = millis();
      } // if
   } else
   {
      *phaseTime = 0;
   } // if-else
  
   if(*phaseTime != 0)
   {
      return millis() - *phaseTime;
   } else
   {
      return 0;
   }
} // CheckPhase()

 

nik182
Offline
Зарегистрирован: 04.05.2015

Вам же уже говорили - можно сделать с помощью флагов. Индусы вон в большие прошивки для стм до сотни флагов вгоняют, что бы логику работы обеспечить. У Вас должно быть как минимум три - само событие, информация о событии, сброс события. Если событие произошло, то выводим один раз информацию, и пока сброса нет, ничего не выводим.

ard-20
Offline
Зарегистрирован: 05.10.2020

куда их ставить эти флаги ?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ard-20 пишет:

куда их ставить эти флаги ?


Молчать! Господа офицеры!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ard-20 пишет:

куда их ставить эти флаги ?

Я ж тебе писал уже в #39

ard-20
Offline
Зарегистрирован: 05.10.2020

###

b707
Offline
Зарегистрирован: 26.05.2017

ard-20 пишет:

Подскажите как сделать чтоб печатало1 раз

третий раз одно и то же разжевывать?

ard-20
Offline
Зарегистрирован: 05.10.2020

ard-20 пишет:

Попытался написать через функцию и снова в порт печатает постоянно. Подскажите как сделать чтоб печатало1 раз


unsigned long phaseTime=0;
void setup()
{
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
 
/*
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(6, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(7, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }*/
}  


// Главная функция
void loop()
{

  
  unsigned long tim = CheckPhase(5, &phaseTime);
  if(tim > 0)
  {
    if(tim < 5000)
    {
      Serial.print("Фаза 1 - Фазы нет ");
      Serial.println(tim);
    } else
    {
      Serial.println("Фаза 1 - АВАРИЯ ");
      Serial.print(tim);
    }
  }

} // loop()



// Проверка фазы
unsigned long CheckPhase(int numPhase, unsigned long *phaseTime)
{ 
   byte state = digitalRead(numPhase);

   if(state == LOW)
   {
      if(*phaseTime == 0)
      {
        *phaseTime = millis();
      } // if
   } else
   {
      *phaseTime = 0;
   } // if-else
  
   if(*phaseTime != 0)
   {
      return millis() - *phaseTime;
   } else
   {
      return 0;
   }
} // CheckPhase()

 

 

Подскажите куда ставить флаги в этом коде ?

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ard-20 пишет:

ard-20 пишет:

Попытался написать через функцию и снова в порт печатает постоянно. Подскажите как сделать чтоб печатало1 раз


unsigned long phaseTime=0;
void setup()
{
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
 
/*
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(6, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(7, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }*/
}  


// Главная функция
void loop()
{

  
  unsigned long tim = CheckPhase(5, &phaseTime);
  if(tim > 0)
  {
    if(tim < 5000)
    {
      Serial.print("Фаза 1 - Фазы нет ");
      Serial.println(tim);
    } else
    {
      Serial.println("Фаза 1 - АВАРИЯ ");
      Serial.print(tim);
    }
  }

} // loop()



// Проверка фазы
unsigned long CheckPhase(int numPhase, unsigned long *phaseTime)
{ 
   byte state = digitalRead(numPhase);

   if(state == LOW)
   {
      if(*phaseTime == 0)
      {
        *phaseTime = millis();
      } // if
   } else
   {
      *phaseTime = 0;
   } // if-else
  
   if(*phaseTime != 0)
   {
      return millis() - *phaseTime;
   } else
   {
      return 0;
   }
} // CheckPhase()

 

 

Подскажите куда ставить флаги в этом коде ?

 

В ОПУ себе вставь.

wdrakula , я пытался...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ard-20 пишет:

ard-20 пишет:

Попытался написать через функцию и снова в порт печатает постоянно. Подскажите как сделать чтоб печатало1 раз


unsigned long phaseTime=0;
void setup()
{
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
 
/*
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(6, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }
if (pulseIn(7, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
    Serial.print("A Fail");
    return;
  }*/
}  


// Главная функция
void loop()
{

  
  unsigned long tim = CheckPhase(5, &phaseTime);
  if(tim > 0)
  {
    if(tim < 5000)
    {
      Serial.print("Фаза 1 - Фазы нет ");
      Serial.println(tim);
    } else
    {
      Serial.println("Фаза 1 - АВАРИЯ ");
      Serial.print(tim);
    }
  }

} // loop()



// Проверка фазы
unsigned long CheckPhase(int numPhase, unsigned long *phaseTime)
{ 
   byte state = digitalRead(numPhase);

   if(state == LOW)
   {
      if(*phaseTime == 0)
      {
        *phaseTime = millis();
      } // if
   } else
   {
      *phaseTime = 0;
   } // if-else
  
   if(*phaseTime != 0)
   {
      return millis() - *phaseTime;
   } else
   {
      return 0;
   }
} // CheckPhase()

 

 

Подскажите куда ставить флаги в этом коде ?

 

В дупу loop().

Вот ровно также, как ты сделал в CheckPhase(), событие случилось, если ты получил число больше 0 и событие сброшено, если получил 0.

Еще одно событие - печать. Когда напечатал, запоминаешь этот факт в еще одном флаге (флаг===логическая переменная).

Итог примерно такой:

void loop()
{


  static bool printDone = false;
  
  unsigned long tim = CheckPhase(5, &phaseTime);
  if(tim > 0)
  {
    if (!printDone) {
      if(tim < 5000)
      {
        Serial.print("Фаза 1 - Фазы нет ");
        Serial.println(tim);
      } else
      {
        Serial.println("Фаза 1 - АВАРИЯ ");
        Serial.print(tim);
      }
      printDone = true;
    }
  }
  else printDone = false;

} // loop()

 

ard-20
Offline
Зарегистрирован: 05.10.2020

###

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Правильно. Теперь сам измени на ДВА флага. для меньше 5 сек и больше.

Мне нужно весь код написать за тебя? ;))) Мне - не нужно.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

wdrakula пишет:

Правильно. Теперь сам измени на ДВА флага. для меньше 5 сек и больше.

Мне нужно весь код написать за тебя? ;))) Мне - не нужно.

Так он сам ещё ни строчки не написал.

ard-20
Offline
Зарегистрирован: 05.10.2020

Понял буду пробовать.  Спасибо .

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ard-20 пишет:

Понял буду пробовать.  Спасибо .

Одна попробовала, семерых родила.

Неужели ты настолько тупой? Просто интересно. А возраст какой и образование?

Жуть. Вот тебе два флага. Дальше уж сам.

void loop()
{


  static bool printDone = false;
  static bool print5secDone = false;

  
  unsigned long tim = CheckPhase(5, &phaseTime);
  if(tim > 0)
  {
      if (tim < 5000 && !printDone)
      {
        Serial.print("Фаза 1 - Фазы нет ");
        Serial.println(tim);
        printDone = true;
      } 
      if (tim >= 5000 && !print5secDone)
      {
        Serial.println("Фаза 1 - АВАРИЯ ");
        Serial.print(tim);
        print5secDone = true;
      }
  }
  else 
  {
  printDone = false;
  print5secDone = false;
  }

} // loop()

 

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

Неужели ты настолько тупой? Просто интересно. А возраст какой и образование?

Дракула, ТС не тупой, он просто по особому хитрый. Написано же выше - "ТС просто тупо ждет, когда кто-нить психанет и выложит ему готовый скетч..."

Сначала Кактус ему код написал, потом еще кто-то... а теперь и ты повелся.

А ТС знай сидит у речки и ждет, пока очередной код приплывет...

"Дура не дура, а 100 рублей в день имею" (с)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

wdrakula пишет:

Неужели ты настолько тупой? Просто интересно

Развести форум на 200 постов из-за кода в 5 строк ...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Komandir пишет:

wdrakula пишет:

Неужели ты настолько тупой? Просто интересно

Развести форум на 200 постов из-за кода в 5 строк ...

Вот поэтому я и решил, что может дедушка какой старый, которому программирование не дается. Бывают же такие. Столько страниц разводить из-за кода в 5 строк - странно, даже для очень хитрого манипулятора. Цель не оправдывает средства. Если оттачивание навыков манипуляции не является одной из целей ;))).

-------------------

ТС: Вот тебе еще милый эффект - печать сколько не было фазы. Можешь еще чего придумать сам. Если ты реально хочешь учиться и всё выше к тебе не относится.

void loop()
{


  static bool printDone = false;
  static bool print5secDone = false;
  static uint32_t lastTim = 0;

  
  unsigned long tim = CheckPhase(5, &phaseTime);
  if(tim > 0)
  {
      if (tim < 5000 && !printDone)
      {
        Serial.print("Фаза 1 - Фазы нет ");
        Serial.println(tim);
        printDone = true;
      } 
      if (tim >= 5000 && !print5secDone)
      {
        Serial.println("Фаза 1 - АВАРИЯ ");
        Serial.print(tim);
        print5secDone = true;
      }
  
  }
  else 
  {
  if (printDone && !print5secDone)
  {
    Serial.print("Фаза 1 - фазы не было ");
    Serial.print(lastTim);
  }
  
  printDone = false;
  print5secDone = false;
  }
lastTim = tim;
} // loop()