Проблема с длительным таймером ВКЛ ВЫКЛ с использованием 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 секунда... Он работает идеально... Но таймер на часы или минуты просто не работает... он не переключает состояние из включенного в выключенное... Он постоянно остается включенным... В чем может быть проблема... Спасибо!
@Tehseen, 👍1
2 ответа
Лучший ответ:
Вы объявляете interval как целое число, тогда как onTime и offTime — как unsigned long
.
Измените int interval = onTime;
на unsigned long interval = onTime;
Максимальное значение int
составляет всего 32767 (215-1), что составляет всего 33 секунды.
unsigned long
может достигать 4294967296 (232-1). Что составляет около 49,7 дней миллисекунд.
Не следует полагаться на функцию millis() для длительных задержек, вместо этого используйте дополнительный чип RTC (DS3231/DS1307).
Теоретически функция millis() должна выдавать временной интервал в 1 миллисекунду, но это не совсем так. Всегда будет разница; и если вы умножите эту небольшую разницу во времени на большое число, то будет значительная задержка.
- Использовать timer0, не влияя на millis() и micros().
- Сброс Arduino с помощью ПО (каждый день)
- Функция Millis() Arduino
- Нельзя использовать millis() вместо задержки
- Использование millis() и micros() внутри процедуры прерывания
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода