Näidis ülesanne
LCD 1602 – подключение и работа с дисплеем
Необходимые компоненты:
- 1× LCD 1602 дисплей
- 1× потенциометр
- 16× проводов (папа–папа)
- 1× резистор 330 Ом
- Ардуино + USB-кабель
Схема в Tinkercad

Подключение:
- LCD дисплей подключается к пинам Arduino:
12, 11, 5, 4, 3, 2
- Потенциометр регулирует контраст
- Контакты A и K — подсветка (подключить к питанию через резистор)
Создание анимации:
- LCD экран состоит из 16×2 символов
- Один символ — 5×8 пикселей
- Можно создавать до 8 пользовательских символов
Программа:
// lisame LiquidCrystal library
#include <LiquidCrystal.h>
// määrame, milliste digitaalpesadega ekraan ühendatud on
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// loome erisümbolid
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() {
// algväärtustatakse LDC ekraani read ja veerud
lcd.begin(16, 2);
// defineerime erisümbolid
lcd.createChar(1, smiley);
lcd.createChar(3, armsDown);
lcd.createChar(4, armsUp);
lcd.createChar(5, kass);
lcd.createChar(6, tydruk);
lcd.createChar(7, v2ikesyda);
}
void loop() {
// koht kuhu hakkame joonistama - 3. veerg, esimene rida
lcd.setCursor(2, 0);
// joonistame kassi
lcd.write(5);
// ja tüdruku
lcd.write(6);
//muudame kursori asukohta: 2. rida 14. veerg
lcd.setCursor(13, 1);
// joonistame poisi
lcd.write(3);
delay(400);
//muudame kursori asukohta: 1. rida 5. veerg
lcd.setCursor(4, 0);
//joonistame for tsükli abil väikese pausiga 10 smaili
for (int koht = 0; koht < 10; koht++) {
lcd.write(1);
delay(400);
}
lcd.setCursor(13, 1);
lcd.write(4);
//loobime südameid
for (int koht = 13; koht >= 4; koht--) {
lcd.setCursor(koht, 0);
lcd.write(7);
delay(400);
}
delay(400);
}
Конспект по проекту “Интерактивная метеостанция”
Исследованные функции
Функция | Назначение |
---|---|
analogRead(pin) | Считывает аналоговое значение с пина (датчик температуры, освещённости) |
lcd.begin(cols, rows) | Инициализация LCD дисплея (16×2 или 20×4) |
lcd.createChar(num, data[]) | Создание пользовательских символов (иконок) |
lcd.setCursor(col, row) | Установка курсора на экране LCD |
lcd.print() | Вывод текста на дисплей |
lcd.write(byte(num)) | Отображение кастомного символа |
delay(ms) | Пауза в миллисекундах |
Serial.print() / Serial.println() | Вывод в монитор порта (для отладки) |
map(value, fromLow, fromHigh, toLow, toHigh) | Преобразование диапазона значения |
constrain(val, min, max) | Ограничение значения в заданных пределах |
Описание работы
Программа реализует простую метеостанцию, которая:
- Показывает температуру воздуха и уровень освещённости;
- Отображает соответствующие текстовые описания и пиктограммы на LCD-дисплее;
- Использует датчики TMP36 (или аналог) и фоторезистор;
- Имеет кастомные иконки: солнце, грустный смайлик, градусы, дождик и улыбающийся смайлик;
- Переключает экран каждые 2 секунды между отображением температуры и света.
Используемые компоненты
Компонент | Назначение |
---|---|
LCD 16×2 | Отображение информации |
Датчик температуры TMP36 | Измеряет температуру |
Фоторезистор (LDR) | Измеряет освещенность |
Резисторы (10kΩ) | Для корректной работы LDR |
Arduino UNO | Основной контроллер |
Соединительные провода | Соединяют все элементы |
Схема подключения

- LCD 16×2 подключается по следующим пинам:
- RS – пин 12
- E – пин 11
- D4-D7 – пины 5, 4, 3, 2
- Фоторезистор – A0
- Температурный датчик – A1
- Питание: 5V и GND
Программа
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int temperaturePin = A1;
const int lightPin = A0;
float voltage, degreesC;
char* tempText[] = {
"Cold weather!", // < 15
"Nice weather!", // 15–25
"Heat rising!", // 25–30
"Hot! Drink water!"// >30
};
char* lightText[] = {
"Sunny", // < 85
"Cloudy", // 85–170
"Rainy" // >170
};
byte smile[8] = {
0b00000,
0b01010,
0b01010,
0b00000,
0b10001,
0b01110,
0b00000,
0b00000
};
byte rain[8] = {
0b00100,
0b00100,
0b01010,
0b01010,
0b10001,
0b10001,
0b10001,
0b01110
};
byte degrees[8] = {
0b01110,
0b01010,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
// Солнце вместо сердечка
byte sun[8] = {
0b00100,
0b01010,
0b11111,
0b11111,
0b00100,
0b00100,
0b00000,
0b00000
};
byte sad[8] = {
0b00000,
0b01010,
0b01010,
0b00000,
0b01110,
0b10001,
0b00000,
0b00000
};
void setup() {
Serial.begin(9600);
lcd.begin(16, 2); // Инициализация LCD
lcd.createChar(1, degrees);
lcd.createChar(2, smile);
lcd.createChar(3, rain);
lcd.createChar(4, sun); // Используем солнце вместо сердечка
lcd.createChar(5, sad);
lcd.setCursor(0, 0);
lcd.print("Weather Station:");
lcd.setCursor(0, 1);
lcd.print("Weather Monitor");
delay(1000); // Задержка перед началом работы
}
void loop() {
// --- Temperature ---
voltage = analogRead(temperaturePin) * 0.004882814;
degreesC = (voltage - 0.5) * 100.0;
// --- Light ---
int lightLevel = analogRead(lightPin);
lightLevel = map(lightLevel, 300, 800, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
// Print data to Serial Monitor
Serial.print("Temp: ");
Serial.print(degreesC);
Serial.print(" °C | Light level: ");
Serial.println(lightLevel);
// Text based on temperature
char* tempTextToDisplay;
if (degreesC < 15) {
tempTextToDisplay = tempText[0];
} else if (degreesC < 25) {
tempTextToDisplay = tempText[1];
} else if (degreesC < 30) {
tempTextToDisplay = tempText[2];
} else {
tempTextToDisplay = tempText[3];
}
// Text based on light level
char* lightTextToDisplay;
byte lightIcon;
if (lightLevel > 170) {
lightTextToDisplay = lightText[2];
lightIcon = 3;
} else if (lightLevel > 85) {
lightTextToDisplay = lightText[1];
lightIcon = 5;
} else {
lightTextToDisplay = lightText[0];
lightIcon = 2;
}
// Display temperature and text
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tempTextToDisplay);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1)); // Custom degree symbol
lcd.print("C");
delay(2000);
// Display light information
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(lightTextToDisplay);
lcd.setCursor(strlen(lightTextToDisplay) + 1, 0);
lcd.write(lightIcon);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(degreesC, 1);
lcd.write(byte(1));
lcd.print("C");
delay(2000);
}
Основная логика:
- Считывает аналоговые значения с температуры и света.
- Переводит температуру в градусы Цельсия.
- Определяет освещённость и температуру и отображает подходящий текст и иконки.
- Меняет экран каждые 2 секунды: сначала показывает описание погоды и температуру, затем – уровень освещённости.
Пользовательские символы:
degrees[]
– символ °Csmile[]
,sad[]
– эмоцииrain[]
,sun[]
– погода
Видео

Применение в реальной жизни:
Домашняя погода: индикация на кухне или в коридоре.
Школы и лаборатории: демонстрация климатических условий.
Сельское хозяйство: контроль температуры в теплицах.
Умный дом: активация сценариев в зависимости от температуры/света.
Психологический эффект: добавление эмоций и рекомендаций повышает настроение пользователя.
Заключение
Проект позволяет:
- Научиться работать с дисплеем и кастомными символами;
- Использовать аналоговые датчики;
- Писать логику отображения в зависимости от внешних условий;
- Повысить креативность — придумать фразы, изображения и оформление.