Теперь соберём часы на дисплее 1602.
Теперь соберём часы на дисплее 1602.
Таймер может быть установлен так, чтобы произвести прерывание (работы программы) в определенное время. Когда происходит прерывание от таймера, то процессор переходит к выполнению функции прерывания для его обработки. После завершения обработки прерывания микроконтроллер возвращается к выполнению основной программы.
Соедините дисплей 1602 с платой Arduino. Мы будем использовать вывод A4 для считывания состояния датчика LM35.
Перед тем как писать код, нам понадобиться библиотека для работы с таймерами FlexiTimer2. Эту библиотеку вы можете скачать на сайте GitHub.
Давайте напишем скетч, в котором на дисплей будет выводиться информация о таймере и состоянии датчика температуры. Кроме этого, время можно будет задавать через монитор последовательного порта.
#include <LiquidCrystal.h> #include <FlexiTimer2.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int tempPin = 4; float tempVal; int hour, minute, second; void setup() { lcd.begin(16, 2); startingAnimation(); FlexiTimer2::set(1000, timerInt); FlexiTimer2::start(); Serial.begin(9600); Serial.println("UNO is ready!"); Serial.println("Input hour,minute,second to set time."); } void loop() { tempVal = analogRead(tempPin) / 1023.0 * 5.0 / 0.01; if (second >= 60) { second = 0; minute++; if (minute >= 60) { minute = 0; hour++; if (hour >= 24) { hour = 0; } } } lcdDisplay(); delay(200); } void startingAnimation() { for (int i = 0; i < 16; i++) { lcd.scrollDisplayRight(); } lcd.print("starting..."); for (int i = 0; i < 16; i++) { lcd.scrollDisplayLeft(); delay(300); } lcd.clear(); } void timerInt() { second++; } void serialEvent() { int inInt[3]; while (Serial.available()) { for (int i = 0; i < 3; i++) { inInt[i] = Serial.parseInt(); } Serial.print("Your input is: "); Serial.print(inInt[0]); Serial.print(", "); Serial.print(inInt[1]); Serial.print(", "); Serial.println(inInt[2]); hour = inInt[0]; minute = inInt[1]; second = inInt[2]; Serial.print("Time now is: "); Serial.print(hour / 10); Serial.print(hour % 10); Serial.print(':'); Serial.print(minute / 10); Serial.print(minute % 10); Serial.print(':'); Serial.print(second / 10); Serial.println(second % 10); } } void lcdDisplay() { lcd.setCursor(0, 0); lcd.print("TEMP: "); lcd.print(tempVal); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("TIME: "); lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(':'); lcd.print(minute / 10); lcd.print(minute % 10); lcd.print(':'); lcd.print(second / 10); lcd.print(second % 10); }
В коде мы объявили три переменные для хранения времени: second, minute, hour.
int hour, minute, second;
Установили цикл обновления таймера 1000 миллисекунд (1 секунда).
FlexiTimer2::set(1000, timerInt); FlexiTimer2::start();
После каждого цикла значение секунд увеличивается на 1:
void timerInt() { second++; }
«::» — это оператор области видимости. Функция после оператора «::» относится к этой области. Это может быть глобальный оператор, оператор класса или оператор области видимости пространства имен. Поскольку функции библиотеки FlexiTimer2 определены в пространстве имен FlexiTimer2, то мы можем найти их в файле библиотеки FlexiTimer2.
Информация на дисплее будет обновляться через установленный интервал времени:
void loop() { ... lcdDisplay(); delay(200); }
В главном цикле loop () нам необходимо контролировать значения: second (секунды), minute (минуты), hour (часы). Как только значение секунд достигнет 60, то нам нужно увеличить минуты на 1 и перезапустить счетчик секунд; как только значение минут достигнет 60, нам надо увеличить часы на 1 и перезапустить счетчик минут; как только значение часов достигнет 24, то нам нужно перезагрузить счетчик часов.
if (second >= 60) { second = 0; minute++; if (minute >= 60) { minute = 0; hour++; if (hour >= 24) { hour = 0; } } }
Функция lcdDisplay() обновляет информацию на дисплее. В этой функции для отображения секунд, минут и часов используются по 2 знака (hour/ 10; hour % 10).
void lcdDisplay() { lcd.setCursor(0, 0); lcd.print("TEMP: "); lcd.print(tempVal); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("TIME: "); lcd.print(hour / 10); lcd.print(hour % 10); lcd.print(':'); lcd.print(minute / 10); lcd.print(minute % 10); lcd.print(':'); lcd.print(second / 10); lcd.print(second % 10); }
Функция прерывания через последовательный порт используется для приема данных, передаваемых с помощью компьютера чтобы настроить время и возвращает данные для подтверждения.
void serialEvent() { int inInt[3]; while (Serial.available()) { for (int i = 0; i < 3; i++) { inInt[i] = Serial.parseInt(); } Serial.print("Your input is: "); Serial.print(inInt[0]); Serial.print(", "); Serial.print(inInt[1]); Serial.print(", "); Serial.println(inInt[2]); hour = inInt[0]; minute = inInt[1]; second = inInt[2]; Serial.print("Time now is: "); Serial.print(hour / 10); Serial.print(hour % 10); Serial.print(':'); Serial.print(minute / 10); Serial.print(minute % 10); Serial.print(':'); Serial.print(second / 10); Serial.println(second % 10); } }
Мы также определяем функцию, которая отображает строку прокрутки, которая будет отображаться во время загрузки платы Arduino.
void startingAnimation() { for (int i = 0; i < 16; i++) { lcd.scrollDisplayRight(); } lcd.print("starting..."); for (int i = 0; i < 16; i++) { lcd.scrollDisplayLeft(); delay(300); } lcd.clear(); }
Скомпилируйте и загрузите код на плату. Сначала на дисплее появится полоса прокрутки, а потом отобразится время и температура. Потом вы можете открыть монитор последовательного порта и установить нужное время.