LCD Ekraan

5.1 Katse LCD ekraani kasutamine

Общее описание

Этот скетч управляет LCD-дисплеем (16 символов × 2 строки) и отображает на нём пользовательские символы — например, смайлики, персонажей (девочка, мальчик, кот), и сердечки. Используются самодельные пиксельные графики, которые создаются в коде и отображаются по координатам на экране. Визуально это напоминает небольшую анимацию.

// Подключаем библиотеку для управления LCD-дисплеем
#include <LiquidCrystal.h>

// Создаём объект lcd и указываем пины подключения дисплея к Arduino:
// RS → 12, Enable → 11, D4 → 5, D5 → 4, D6 → 3, D7 → 2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Создаём массивы байт (8 строк по 5 пикселей) для пользовательских символов

// Смайлик 😊
byte smiley[8] = {
  0b00000,
  0b00000,
  0b01010,
  0b00000,
  0b00000,
  0b10001,
  0b01110,
  0b00000
};

// Мальчик с руками вниз
byte armsDown[8] = {
  0b00100,
  0b01010,
  0b00100,
  0b00100,
  0b01110,
  0b10101,
  0b00100,
  0b01010
};

// Мальчик с руками вверх
byte armsUp[8] = {
  0b00100,
  0b01010,
  0b00100,
  0b10101,
  0b01110,
  0b00100,
  0b00100,
  0b01010
};

// Кот 🐱
byte kass[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b10000,
  0b10011,
  0b11111,
  0b01110,
  0b01010
};

// Девочка 👧
byte tydruk[8] = {
  0b00100,
  0b01010,
  0b00100,
  0b11111,
  0b00100,
  0b00100,
  0b01110,
  0b11111
};

// Маленькое сердце ❤️
byte v2ikesyda[8] = {
  0b00000,
  0b00000,
  0b00000,
  0b11011,
  0b11111,
  0b11111,
  0b01110,
  0b00100
};

void setup() {
  // Инициализация дисплея размером 16 символов на 2 строки
  lcd.begin(16, 2);

  // Загружаем пользовательские символы в память дисплея
  lcd.createChar(1, smiley);      // символ 1 = смайлик
  lcd.createChar(3, armsDown);    // символ 3 = мальчик с руками вниз
  lcd.createChar(4, armsUp);      // символ 4 = мальчик с руками вверх
  lcd.createChar(5, kass);        // символ 5 = кот
  lcd.createChar(6, tydruk);      // символ 6 = девочка
  lcd.createChar(7, v2ikesyda);   // символ 7 = сердечко
}

void loop() {
  // Устанавливаем курсор на первую строку, 3-й символ (позиция 2,0)
  lcd.setCursor(2, 0);

  // Выводим кота
  lcd.write(5);

  // Сразу после него — девочку
  lcd.write(6);

  // Устанавливаем курсор на вторую строку, 14-й символ (позиция 13,1)
  lcd.setCursor(13, 1);

  // Рисуем мальчика с опущенными руками
  lcd.write(3);

  // Пауза 400 миллисекунд
  delay(400);

  // Устанавливаем курсор на первую строку, 5-й символ (позиция 4,0)
  lcd.setCursor(4, 0);

  // Цикл от 0 до 9 — рисуем 10 смайликов один за другим
  for (int koht = 0; koht < 10; koht++) {
    lcd.write(1);   // рисуем смайлик
    delay(400);     // задержка 400 мс между смайликами
  }

  // Мальчик поднимает руки
  lcd.setCursor(13, 1);
  lcd.write(4);

  // Бросаем сердечки — от правого края к девочке
  for (int koht = 13; koht >= 4; koht--) {
    lcd.setCursor(koht, 0);
    lcd.write(7);   // рисуем сердце
    delay(400);
  }

  delay(400); // финальная пауза
}

Этот код — анимационная сцена на LCD-дисплее: девочка, кот, мальчик и «летающие» сердечки, смайлики.

Он показывает, как:

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

5.3. Töö kestus milles() abil

Тема задания:

Создание часов/таймера на Arduino без внешнего модуля, используя встроенный таймер millis().


🧩 Компоненты:

  • Arduino Uno
  • ❌ Не используется внешний модуль часов (например, DS1307 или DS3231)
  • ❗ Все вычисления основаны на внутреннем времени, считаемом с помощью функции millis()

⏱ Что такое millis()?

Функция millis() возвращает количество миллисекунд (1 сек = 1000 мс), прошедших с момента запуска или перезапуска Arduino.

Пример:

  • После включения Arduino: millis() = 0
  • Через 1 секунду: millis() = 1000
  • Через 1 минуту: millis() = 60000

Это позволяет отслеживать время без задержек (delay) и без использования внешнего оборудования.

📄 Полный пример кода с комментариями:

unsigned long algusAeg;  // Переменная, где запоминается время старта
unsigned long kestus;    // Сколько времени прошло

void setup() {
  Serial.begin(9600);       // Открываем соединение с компьютером для вывода текста
  algusAeg = millis();      // Сохраняем текущее значение времени — старт отсчёта
  Serial.println("Тöö algas!"); // Сообщаем, что работа началась
}

void loop() {
  kestus = millis() - algusAeg; // Считаем разницу: сколько времени прошло с начала

  unsigned long sekundid = kestus / 1000; // Переводим миллисекунды в секунды
  unsigned int tunnid = sekundid / 3600; // Часы = сколько раз 3600 секунд помещается
  unsigned int minutid = (sekundid % 3600) / 60; // Минуты — остаток от часов
  unsigned int sek = sekundid % 60; // Секунды — остаток от минут

  // Выводим сообщение в формате HH:MM:SS
  Serial.print("Töö kestus: ");

  if (tunnid < 10) Serial.print('0');  // Добавляем ноль перед цифрой
  Serial.print(tunnid);
  Serial.print(':');

  if (minutid < 10) Serial.print('0');
  Serial.print(minutid);
  Serial.print(':');

  if (sek < 10) Serial.print('0');
  Serial.println(sek);

  delay(1000); // Ждём 1 секунду перед следующей печатью
}

🧠 Что делает эта программа?

  1. При включении Arduino:
    • Сохраняет момент запуска.
    • Печатает Тöö algas!.
  2. В loop():
    • Считает, сколько времени прошло.
    • Выводит время в формате часы:минуты:секунды.
  3. Обновляется каждую секунду благодаря delay(1000).

📝 Пример вывода в Serial Monitor:

Töö algas!
Töö kestus: 00:00:01
Töö kestus: 00:00:02
Töö kestus: 00:00:03
...

⚠️ Ограничения:

Что умеетЧего не умеет
✅ Считать время с момента включения❌ Не показывает реальные часы и дату
✅ Не требует дополнительных модулей❌ После перезагрузки счёт идёт с нуля

Ülesanne 5 Interaktiivne infoekraan “Ilmajaam”

📌 Eesmärk / Цель проекта

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


Проект реализует погодную станцию с LCD-дисплеем 16×2, отображающую:

  • погодные фразы (на эстонском),
  • иконки текущих условий (солнце, снег, туман, дождь),
  • часы в реальном времени (через millis()),
  • краткие рекламные фразы.

Система основывается на данных с:

  • датчика освещённости (LDR) — A0,
  • температурного датчика TMP36 — A1.

Сообщения и иконки меняются каждые 5 секунд.


⚙️ Используемые компоненты:

5 пользовательских иконок.

Arduino Uno

LCD-дисплей 16×2 (6-пиновое подключение)

TMP36 (температурный датчик)

Фоторезистор (LDR)

Потенциометр (контрастность)

Полный код с комментариями

#include <LiquidCrystal.h>

// Инициализация LCD-дисплея: RS=12, E=11, D4=5, D5=4, D6=3, D7=2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Аналоговые пины датчиков
const int TMP_PIN = A1;  // TMP36 — температура
const int LDR_PIN = A0;  // Фоторезистор — освещенность

// Переменные времени и состояния экрана
unsigned long lastUpdate = 0;
int displayIndex = 0;

// Погодные фразы
char* ilmTekstid[] = {
  "Paev selge ja soe", 
  "Pime ja vihmane", 
  "Udu piirab nakke", 
  "Riietu soojalt!", 
  "Naudi suvepaeva"
};

// Рекламные фразы (по одной букве из случайной фразы)
char* reklaam[] = {
  "Naerata! :)",
  "Joo teed",
  "Roheline maailm",
  "Paikseenergia!",
  "Ilus ilm!"
};

// Кастомные символы (иконки погоды и часов)
byte sun[8] = {
  0b00100, 0b10101, 0b01110, 0b11111,
  0b01110, 0b10101, 0b00100, 0b00000
}; // ☀️

byte rain[8] = {
  0b00100, 0b01110, 0b10101, 0b00100,
  0b01010, 0b10001, 0b00000, 0b00000
}; // 🌧️

byte snow[8] = {
  0b10101, 0b01110, 0b11111, 0b01110,
  0b10101, 0b00000, 0b10101, 0b00000
}; // ❄️

byte fog[8] = {
  0b00000, 0b11011, 0b00100, 0b11011,
  0b00000, 0b10101, 0b00000, 0b00000
}; // 🌫️

byte clockicon[8] = {
  0b01110, 0b10001, 0b10111, 0b10101,
  0b10001, 0b01110, 0b00000, 0b00000
}; // часы 🕒

void setup() {
  lcd.begin(16, 2);

  // Загрузка иконок в память дисплея
  lcd.createChar(0, sun);
  lcd.createChar(1, rain);
  lcd.createChar(2, snow);
  lcd.createChar(3, fog);
  lcd.createChar(4, clockicon);

  // Приветствие
  lcd.setCursor(0, 0);
  lcd.print("Ilmajaam: PaiksePesa");
  lcd.setCursor(0, 1);
  lcd.print("Laen andmeid...");
  delay(3000);
  lcd.clear();
}

void loop() {
  unsigned long currentMillis = millis();

  // Обновление информации каждые 5 секунд
  if (currentMillis - lastUpdate > 5000) {
    lastUpdate = currentMillis;
    showWeather(displayIndex);          // показать следующее сообщение
    displayIndex = (displayIndex + 1) % 5;
  }
}

void showWeather(int i) {
  // Чтение данных с датчиков
  int light = analogRead(LDR_PIN);
  int tempRaw = analogRead(TMP_PIN);

  float voltage = tempRaw * 5.0 / 1023;
  float temperature = (voltage - 0.5) * 100; // TMP36

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(ilmTekstid[i]); // Погодная фраза

  // Вывод иконки погоды в зависимости от условий
  lcd.setCursor(15, 0);
  if (temperature < 5)
    lcd.write(byte(2)); // ❄️
  else if (light > 800)
    lcd.write(byte(0)); // ☀️
  else if (light > 500)
    lcd.write(byte(3)); // 🌫️
  else
    lcd.write(byte(1)); // 🌧️

  // Отображение времени (часы и минуты)
  lcd.setCursor(0, 1);
  lcd.write(byte(4)); // 🕒
  lcd.print(" ");

  int hours = (millis() / 1000 / 60) % 24;
  int mins = (millis() / 1000) % 60;
  lcd.print(hours);
  lcd.print(":");
  if (mins < 10) lcd.print("0");
  lcd.print(mins);

  // Показываем первую букву случайной рекламной фразы
  lcd.setCursor(12, 1);
  lcd.print("*");
  lcd.print(reklaam[random(0, 5)][0]); // Только первая буква!
}

Reaalsuses teostatud funktsioonid / Что реализовано в проекте

В рамках проекта “Ilmajaam PaiksePesa” была успешно реализована функциональная мини-метеостанция на базе Arduino Uno и LCD-дисплея 16×2


📟 Отображение информации на LCD:

  • Использован LCD-дисплей 16×2 с ручной регулировкой контрастности.
  • Выведено название станции и сообщение о загрузке при запуске.

🌡️ Работа с температурным датчиком (TMP36):

  • Сигнал с аналогового пина A1 преобразуется в значение температуры в °C.
  • В зависимости от температуры отображается снежинка или солнце.

🌞 Работа с фоторезистором (LDR):

  • Измерение уровня освещённости на пине A0.
  • В зависимости от яркости отображаются иконки: ☀️, 🌫️ или 🌧️.

⏰ Встроенные часы:

  • С помощью millis() отображается текущее время (часы и минуты) в нижней строке.
  • Использована кастомная иконка часов 🕒.

💬 5 фраз и 5 иконок:

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

🧠 Рандомные сообщения:

  • В нижней строке выводится символ * и случайная буква из одной из 5 рекламных фраз.

🟢 Вывод:

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