Здравствуйте.
Необходимо увеличивать счетчик секунд stsec каждую секунду. Правильный ли подход к решению этой задачи?
Спасибо.
long stsec=0; // счетчик секунд;
unsigned long t2=0; // момент увеличения счетчика секунд
void loop()
{
if (millis()-t2>=1000)
{
stsec++;
t2=t2+1000;
}
}
Этот вариант я использую через несколько дней, чтобы убедиться в том, что stsec с делением millis() на 1000 нацело не расходится более, чем на секунду. Правда, тип stsec сейчас поменяю.
Даже интересно, как ты это проверишь …
Точность тактового генератора в Ардуино +/- нихера.
При любой попытке измерять реальное время встроенными средствами Ардуино, результат будет отличаться от реального времени, при чем по разному.
Зависеть будет и от питания и от температуры и от конкретного экземпляра.
Ну а как иначе без спец. средств. Только на глаз. +/-.)
У меня обычные часы пикают каждый час. Я же, сидя за компьютером, вижу насколько они спешат/отстают.)
Расходждение с реальным временем меня бы устроило +/- 10 минут. Затем корретировать. Отстали системные часы больше, чем на 10 минут - добавил 10 минут и наоборот.
long stsec=0; // счетчик секунд;
unsigned long t2=0; // эта переменная используется ТОЛЬКО внутри одной функции
// и нигде больше. Что она делает в глобальной области видимости?
void loop()
{
if (millis()-t2>=1000)
{
stsec++;
t2=t2+1000; // идея так себе - довольно дорогая
}
}
Вот так правильнее:
long stsec = 0; // счетчик секунд;
void loop(void) {
{
static unsigned long t2 = 0; // момент увеличения счетчика секунд
const unsigned long currentMillis = millis();
if (currentMillis - t2 >= 1000) {
stsec ++;
t2 = currentMillis;
}
}
}
Зачем, чтобы в случае задержки в loop проскочить мимо значения и пойти на вторую секунду?
Сорри, о таком варианте не подумал. Мне почему-то всё время рисовалось (не знаю, с чего), что нам важно знать момент перехода секунды (типа что-то сделать).
Именно нужен момент перехода секунды. Если в текущем цикле произошло отставание на долю секунды, то в следующем будет опережение на эту же долю. И эти “рывки” stsec вполне устраивают. stsec - это маятник своего рода.
Что за бред…
Если в прошлом цикле произошло отставание, то в следующем его максимум не будет, а скорее всего будет точно такое же отставание.
Или вам нужна корректировка ?
Про это в шапке нет ни слова