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 секунду перед следующей печатью
}
🧠 Что делает эта программа?
- При включении Arduino:
- Сохраняет момент запуска.
- Печатает
Тöö algas!
.
- В
loop()
:- Считает, сколько времени прошло.
- Выводит время в формате
часы:минуты:секунды
.
- Обновляется каждую секунду благодаря
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 рекламных фраз.
🟢 Вывод:
Проект представляет собой завершённую, интерактивную и расширяемую метеостанцию, использующую сенсорные данные и графические элементы для визуального отображения погодных условий