Menu
CoddyTech

Время в 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;

Скетч с неправильным типом работает полминуты, а затем начинает работать некорректно, поэтому эту ошибку легко не заметить.

challenge icon

Задание

Легко

Этот скетч выводит время раз в секунду, но через 32 секунды начинает выводить отрицательные числа. Измени тип переменной now, чтобы время отображалось правильно в течение нескольких дней.

Нажми Run и подожди более 33 секунд, чтобы увидеть ошибку, затем исправь её и нажми Check.

Попробуйте сами

void setup() {
  Serial.begin(9600);
}

void loop() {
  int now = millis();   // этот тип слишком мал для хранения времени: замените его
  Serial.println(now);
  delay(1000);
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Отсчёт времени без delay

Потренируйтесь самостоятельно: Песочница Arduino