Снова китайские Ардуины!

Вот код:

void setup() {

  Serial.begin(115200);
  uint32_t a;
  uint32_t b;

  delay(random(100));
  a = millis();
  delay(random(100)+10); 
  b = millis();

  Serial.println ("Что более чем на 10 больше?");
  Serial.print(a);
  Serial.print(" или ");
  Serial.println(b);

  Serial.print(a);
  Serial.print("? ");
  Serial.println(b - a > 10 ? "Yee!": "Oops!");

  Serial.print(b);
  Serial.print("? ");
  Serial.println(a - b > 10 ? "Yee!": "Oops!");
}

void loop() {
}

Наслаждаемся!

Следствия таких ошибок ОЧЕНЬ трудно заметить. Так как ни на первый ни на второй взгляд в коде нет нарушений логики. И тип для таймеров - правильный и условия - тоже… “выглядят” правильно.

Рекомендую добавить куда-то, возможно в Вики, примеры типичных ошибок. Вот таких, или операцию сложения с миллис и аналогичное. А то мы много лет приводим курьёзы на форуме, но новичок не поймет вымученный пример! Только совсем живой, реальный пример!

1 лайк

наверное сразу и объяснять начинающим, в чём косяк:
ЗЫ код для STM32 (лень было плату в компиляторе менять)

void setup() {
  uint32_t a;
  uint32_t b;

  while (!Serial);

  delay(random(100));
  a = millis();
  delay(random(100) + 10);
  b = millis();

  Serial.println ("Что более чем на 10 больше?");
  Serial.print(a);
  Serial.print(" или ");
  Serial.println(b);

  Serial.print(b);
  Serial.print(" ? ");
  Serial.print(a);
  Serial.print(" ");
  Serial.println(((int32_t)b - (int32_t)a > 10)? "Yee!" : "Oops!");

  Serial.print(a);
  Serial.print(" ? ");
  Serial.print(b);
  Serial.print(" ");
  Serial.println(((int32_t)a -  (int32_t)b > 10) ? "Yee!" : "Oops!");
}

void loop() {
}

А можно для непонятливых в чем суть?
И вывод тестовых скетчей посмотреть?

Суть в неаккуратной работе с беззнаковыми числами.
Но в отличие от известного всем примера с переполнением millis() результат можно наблюдать раньше, чем через 49 дней.

“Малое опустошение миллис”

Ниче не понял, в пн поэкспериментирую

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

byte a=127, b=255;
b-a = 128;
a-b = 128;

И кто придумал такую арифметику))

1 лайк

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

4 лайка

И да, совсем начинающие вряд ли смогут понять строку

Serial.println(b - a > 10 ? "Yee!": "Oops!");

лучше сразу дать намек на понятие “тернарная условная операция”.