Проблема с длительным таймером ВКЛ ВЫКЛ с использованием millis()

У меня есть 3 компонента: реле и два светодиода... Мне нужны два таймера с использованием Arduino... В первом таймере реле должно быть выключено и включено; один светодиод выключен; а другой включен... Во втором таймере реле выключено; один светодиод включен; другой выключен... Это мой код:

//const unsigned long onTime = (2 *3600000); // 2 Hours in miliseconds;
const unsigned long onTime = (3 *1000); // 3 seconds;
//const unsigned long onTime = (5 *60000); // 15 minutes;

//const unsigned long offTime = (0.5 *3600000); // 1/2 Hours in miliseconds;
const unsigned long offTime = (2 *1000); // 1 seconds;
//const unsigned long offTime = (5 *60000); // 5 minutes;

const unsigned long start_delay = (5 *60000);  // 5 minute in miliseconds

// Tracks the last time event fired
unsigned long previousMillis=0;

// Interval is how long we wait
int interval = onTime;

// Used to track if relay should be on or off
boolean relayState = true;

void setup() 
{
  pinMode(13, OUTPUT); //Relay
  pinMode(3, OUTPUT); //LED Green for ON
  pinMode(4, OUTPUT); //LED Red for OFF

  digitalWrite(13, LOW);   // Relay Off
  digitalWrite(3, LOW);    // Green LED off 
  digitalWrite(4, LOW);    // Red LED OFF

  //delay (start_delay);  // wait for 5 minute
}
void loop() 
{
  if (relayState == true)
  {
    // Relay ON
    digitalWrite(13, HIGH);   // Relay ON
    digitalWrite(3, HIGH);    // Green LED ON 
    digitalWrite(4, LOW);    // Red LED OFF
  }
  if (relayState == false)
  {
    // Relay OFF
    digitalWrite(13, LOW);   // Relay Off
    digitalWrite(3, LOW);    // Green LED Off 
    digitalWrite(4, HIGH);    // Red LED On
  }

  // Grab snapshot of current time, this keeps all timing
  long currentMillis = millis();

  // Compare to previous capture to see if enough time has passed
  if ((unsigned long)(currentMillis - previousMillis) >= interval)
  {
    // Change wait interval, based on current relay state
    if (relayState) 
    {
      // Relay is currently on, set time to stay off
      interval = offTime;
    } 
    else 
    {
      // Relay is currently off, set time to stay on
      interval = onTime;
    }
    // Toggle the relay's state
    relayState = !(relayState);
    // Save the current time to compare "later"
    previousMillis = currentMillis;
  }
}

Теперь проблема в следующем: когда я создаю таймер на секунды, например, OnTime - 3 секунды, а offTime - 1 секунда... Он работает идеально... Но таймер на часы или минуты просто не работает... он не переключает состояние из включенного в выключенное... Он постоянно остается включенным... В чем может быть проблема... Спасибо!

, 👍1


2 ответа


Лучший ответ:

4

Вы объявляете interval как целое число, тогда как onTime и offTime — как unsigned long.

Измените int interval = onTime; на unsigned long interval = onTime;

Максимальное значение int составляет всего 32767 (215-1), что составляет всего 33 секунды.

unsigned long может достигать 4294967296 (232-1). Что составляет около 49,7 дней миллисекунд.

,

0

Не следует полагаться на функцию millis() для длительных задержек, вместо этого используйте дополнительный чип RTC (DS3231/DS1307).

Теоретически функция millis() должна выдавать временной интервал в 1 миллисекунду, но это не совсем так. Всегда будет разница; и если вы умножите эту небольшую разницу во времени на большое число, то будет значительная задержка.

,