logo
+7 (951) 999-89-94
428003, г. Чебоксары, ул. Федора Гладкова, д.9, оф.319
06.04.2019

Дисплей 1602: Часы

Дисплей 1602: Часы

Теперь соберём часы на дисплее 1602.

Компоненты

  • Плата Arduino Uno
  • Макетная плата
  • USB кабель
  • Дисплей 1602
  • Роторный потенциометр
  • Датчик температуры LM35

Таймер

Таймер может быть установлен так, чтобы произвести прерывание (работы программы) в определенное время. Когда происходит прерывание от таймера, то процессор переходит к выполнению функции прерывания для его обработки. После завершения обработки прерывания микроконтроллер возвращается к выполнению основной программы.

Схема

Соедините дисплей 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(); 
} 

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

 

Предыдущий урок | В начало | Следующий урок