@Tiamon

Проблема с таймером Arduino, почему не работает?

Не могу понять, почему не работает код

Выдержки, имеющие отношение к вопросу:

Есть небольшой проект, реле включаются по таймеру. Решил изменить по быстрому.
Сделать так, что бы после включения ардуинки, реле включалось сразу на заданное время, после чего через заданный интервал включалось снова на заданное время и так по циклу.

Вроде сделал всё очень просто, но не работает, не включается, не могу понять почему.

const long DurationCh_2 = 120;                  //ДЛИТЕЛЬНОСТЬ срабатывания реле

const long StartViaCh_2 = 200;                  //Включится через 

int Xer = 0;
int StartRelCn_2;

void loop()                                        // ПРОГРАММЫй безусловный ЦИКЛ
{
  DateTime myTime = RTC.now();                     //Читаем данные времени из RTC

  long utime = myTime.unixtime();                  //сохраняем время в формате UNIX
  utime %= 86400;                                  //Сохраняем в переменной остаток деления на кол-во секнд в сутках,
                                                   //Это дает количество секунд с начала текущих суток


    
   while(Xer < 1)				//Должно выполнятся один раз
      {
        Xer ++;
        StartRelCn_2 = utime;          		//Присвоить текущее время
      }

      
   if ((utime >= StartRelCn_2) &&
       (utime < (StartRelCn_2+DurationCh_2)))
      {
        digitalWrite(RelayChn2,LOW);                 //Устанавливаем на 2 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        StartRelCn_2 = StartRelCn_2 + StartViaCh_2;  // Повторно включаем через заданный интервал времени
      }
    else
      {
          digitalWrite(RelayChn2,HIGH);              //Устанавливаем на 2 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      }
  • Вопрос задан
  • 262 просмотра
Решения вопроса 1
@Tiamon Автор вопроса
Разобрался сам, дело оказалось в "long" то есть мне нужно было указать переменную в этом "формате"
Так как у меня время в нем

void loop()                                        // ПРОГРАММЫй безусловный ЦИКЛ
{
  long utime = myTime.unixtime();                  //сохраняем время в формате UNIX


То есть верный код такой:

int long DurationCh_2 = 120;                  //ДЛИТЕЛЬНОСТЬ срабатывания реле
int long StartViaCh_2 = 200;                  //Включится через 
int Xer = 0;
int long StartRelCn_2;


Тогда идёт корректное сравнение и присваивание переменных
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Верни всё как было, а одноразовое включение сделай в цикле инициализации :)
Xer + 1; ничего не сделает с переменной Xer. Эта строка вычислит результат, но никуда его не присвоит.
Xer ++; или Xer += 1; попробуй ради интереса. Особо в логику не вникал)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы