// Библиотека для работы с текстовым дисплеем по шине I²C #include // Библиотека для работы с кнопкой #include // Библиотека для работы с датчиком температуры TMP36 #include // Создаём объект для работы с дисплеем // В параметрах передаём I²C-адрес дисплея, кол-во строк и символов LiquidCrystal_I2C lcd(0x38, 16, 2); // Создаём объекты кнопок для управления TroykaButton buttonMinute(2); TroykaButton buttonHour(3); // Создаём объект для работы с датчиком температуры TMP36 // В параметре передаём пин, к которому подключен сенсор TroykaThermometer tmp36(A0); // Переменные для хранения часов, минут и секунд int hours, minutes, seconds; // Переменные для хранения температуры float temparature; long millisLastTime = 0; long millisLastTemp = 0; void setup() { // Инициализируем кнопки buttonMinute.begin(); buttonHour.begin(); // Инициализируем дисплей lcd.init(); // Включаем подсветку lcd.backlight(); // Устанавливаем курсор на первом знакоместе в первой строке lcd.setCursor(0, 0); // Устанавливаем тестовое время 12:45:30 setTime(12, 45, 30); } void loop() { // Обновляем время посекундно updateTime(); // Обновляем время через кнопки updateTimeButtons(); // Обновляем температуру updateTemperature(); // Преобразуем время wrapTime(); // Выводим на дисплее время в формате «чч:мм:сс» printTimeLCD(); } // Функция для установки времени void setTime(int h, int m, int s) { hours = h; minutes = m; seconds = s; } // Функция для отсчёта времени void updateTime() { long millisNowTime = millis(); if (millisNowTime - millisLastTime > 1000) { millisLastTime = millisNowTime; seconds++; } } // Функция для обновления температуры void updateTemperature() { long millisNowTemp = millis(); if (millisNowTemp - millisLastTemp > 500) { millisLastTemp = millisNowTemp; tmp36.read(); temparature = tmp36.getTemperatureC(); } } // Функция для обновления времени через кнопки void updateTimeButtons() { buttonHour.read(); buttonMinute.read(); if (buttonHour.isClick()) { hours++; } if (buttonMinute.isClick()) { minutes++; } } // Функция для форматирования времени // При достижении лимита в 60 секунд, 60 минут и 24 часа отсчёт начинается заново void wrapTime() { if (seconds >= 60) { minutes++; seconds -= 60; } if (minutes >= 60) { hours++; minutes -= 60; } if (hours >= 24) { hours = 0; } } // Функция для вывода на дисплее времени в формате «чч:мм:сс» и температуры void printDataLCD() { lcd.setCursor(0, 0); lcd.print("TIME: "); printTwoDigits(hours); lcd.print(":"); printTwoDigits(minutes); lcd.print(":"); printTwoDigits(seconds); lcd.setCursor(0, 1); lcd.print("TEMP: "); lcd.print(temparature); lcd.print(" C"); } // Функция для вывода на дисплей двух цифр: // на первом знакоместе 0, если цифра меньше 10 void printTwoDigits(int digit) { if (digit < 10) { lcd.print("0"); } lcd.print(digit); }