Время в unsigned long
Часть раздела Отсчёт времени без delay путешествия по Arduino на Coddy. Урок 2 из 18.
Переменная может хранить числа только до определённого предела, заданного её типом. На Uno тип int хранит значения от -32768 до 32767. Через 32,8 секунды значение millis() становится больше, и int, в который пытаются его записать, переполняется и становится отрицательным числом.
Тип unsigned не хранит отрицательные числа, поэтому его верхний предел вдвое выше: unsigned int хранит значения от 0 до 65535 — это примерно 65 секунд в миллисекундах. Но этого всё ещё недостаточно.
Тип unsigned long хранит значения от 0 до 4,294,967,295. В миллисекундах это больше 49 дней, и именно этот тип возвращает сама функция millis(). Храните время в переменной этого типа:
unsigned long now = millis();
unsigned long startTime = 0;Скетч с неправильным типом работает полминуты, а затем начинает работать некорректно, поэтому эту ошибку легко не заметить.
Задание
ЛегкоЭтот скетч выводит время раз в секунду, но через 32 секунды начинает выводить отрицательные числа. Измени тип переменной now, чтобы время отображалось правильно в течение нескольких дней.
Нажми Run и подожди более 33 секунд, чтобы увидеть ошибку, затем исправь её и нажми Check.
Попробуйте сами
void setup() {
Serial.begin(9600);
}
void loop() {
int now = millis(); // этот тип слишком мал для хранения времени: замените его
Serial.println(now);
delay(1000);
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Отсчёт времени без delay
1millis()
Часы на millis()Время в unsigned longМигание без задержкиДва светодиода, две скоростиМигание и переключение кнопкойСвет по таймеру4Точное измерение времени
Измерение с помощью micros()Когда millis() переполняетсяСекундомер с кнопкойПотренируйтесь самостоятельно: Песочница Arduino