обнуление таймера через 50 дней, как бороться?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015
void loop()
{ timer1 = millis();
  if (timer1 - timer2 > 10000) { // каждые 10 сек мигаем светодиодом
    timer2 = millis();
    // тут мигаем светодиодом
  }

заводим два таймера и мигаем светодиодом каждіе 10сек.

 через 50 дней перестанет мигать или будет мигать?

как правильно сделать?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Мигать будет, и не поперхнётся. При условии, что timer1 и timer2 объявлены как unsigned long.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

если честно, не могу этого понять, обьявил unsigned long, а как так получится?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Short Circuit пишет:

если честно, не могу этого понять, обьявил unsigned long, а как так получится?

// 4294967294 - 4294967284 = 10
// 4294967295 - 4294967285 = 10
// 0          - 4294967286 = 10
// 1          - 4294967287 = 10
// 2          - 4294967288 = 10
// 3          - 4294967289 = 10
// 4          - 4294967290 = 10
// 5          - 4294967291 = 10
// 6          - 4294967292 = 10
// 7          - 4294967293 = 10
// 8          - 4294967294 = 10
// 9          - 4294967295 = 10
// 10         - 0          = 10
// 11         - 1          = 10
Клапауций 232
Offline
Зарегистрирован: 05.04.2016
void loop() {unsigned long timer1 = millis();
if (timer1 - timer2 > 10000) { // каждые 10 сек мигаем светодиодом
timer2 = timer1;
// тут мигаем светодиодом
}

работает вечно

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

да, вроде дошло уже, все дело в отсутствии у этого числа "минуса", поэтому числа всегда положительные.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Short Circuit пишет:

да, вроде дошло уже, все дело в отсутствии у этого числа "минуса", поэтому числа всегда положительные.

Значит, не дошло!

Напишите вместо unsigned long просто long и НИЧЕГО не изменится. Минусы появятся, но работать будет также.

Если хотите, чтобы действительно дошло, погуглите "дополнительный код" и разберитесь как реализована арифметика в дополнительном коде.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

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

но вероятно как вы пишите, причина более глубже, при случае посмотрю.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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