Компоненты:

  • 1 LCD экран (1602)
  • 1 Потенциометр 
  • 1 Резистор 220 Ω

Схема:

Рис.1 Простая LED схема

Код:

#include <LiquidCrystal.h>
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, 0b01110, 0b00100, 0b00000};

void setup() {

// algväärtustatakse LDC ekraani read ja veerud

lcd.begin(16, 2);

// defineerime erisümbolid

lcd.createChar(1, v2ikesyda);
lcd.createChar(3, armsDown);
lcd.createChar(4, armsUp);
lcd.createChar(5, kass);
lcd.createChar(6, tydruk);
lcd.createChar(7, smiley);

}

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);
}

Описание процессов

Инициализация дисплея и создание символов

  • Подключаем библиотеку LiquidCrystal и настраиваем интерфейс: пины 12,11→RS,E и 5,4,3,2→D4–D7.
  • В setup() вызываем lcd.begin(16, 2) для 16×2-строчного дисплея.
  • С помощью lcd.createChar() загружаем в память шесть пользовательских символов (кошку, девочку, мальчика с опущенными и поднятыми руками, смайлик и маленькое сердечко).

Первый кадр: кот и девочка + мальчик внизу

  • lcd.setCursor(2, 0) — ставим курсор на 1-й строке в колонку 3 (индексация с 0).
  • lcd.write(5) рисуем символ кошки, затем lcd.write(6) — девочку.
  • lcd.setCursor(13, 1) — переходим на 2-ю строку, колонку 14, и lcd.write(3) рисуем мальчика с опущенными руками.

Анимация смайликов вверху

  • Через for от 0 до 9: каждую итерацию
    • lcd.write(1) рисует на текущей позиции маленькое сердечко,
    • затем delay(400) даёт паузу в 0,4 с, чтобы сердца появлялись одно за другим.

Переход к позе «руки вверх» у мальчика

  • После цикла смайликов снова lcd.setCursor(13, 1) и lcd.write(4) заменяет символ мальчика на вариант с поднятыми руками.

Анимация больших сердец, идущих назад

  • for (int koht = 13; koht >= 4; koht--): с позиции 14 по 5 на первой строке ставим смайлик (lcd.write(7)),
  • между ними по 0,4 с delay(400), так что большие сердца «идут» справа налево.

Задержка перед перезапуском

  • В конце delay(400) — пауза и затем цикл loop() повторяется, а всё анимация начинается заново.

Интерактивный информационный экран «Метеостанция»

Компоненты:

  • 1 LCD экран (1602)
  • 1 Потенциометр 
  • 1 Резистор 220 Ω
  • 1 Резистор 10 КΩ
  • Температурный датчик
  • Фоторезистр

Схема:

https://youtube.com/watch?v=dLbPYx6I6Zg%3Ffeature%3Doembed

Код:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132#include <LiquidCrystal.h>// Подключение LCD по пинам: RS, E, D4, D5, D6, D7LiquidCrystal lcd(12, 11, 5, 4, 3, 2);constinttempPin = A0;  // TMP36constintldrPin  = A1;  // Фоторезисторunsigned longlastUpdate = 0;unsigned longstartTime;// Кастомные символыbyte snow[8] = {    0b00000,    0b10001,    0b01010,    0b01110,    0b01010,    0b10001,    0b00000,    0b00000};byte sun[8] = {    0b00000,    0b10101,    0b01110,    0b11111,    0b01110,    0b10101,    0b00000,    0b00000};byte rain[8] = {    0b11110,    0b11110,    0b00111,    0b01000,    0b00010,    0b01000,    0b00010,    0b01000};byte tea[8] = {    0b00001,    0b01110,    0b10000,    0b01100,    0b00000,    0b11111,    0b01110,    0b01110};voidsetup() {  lcd.begin(16, 2);  Serial.begin(9600);  // Загрузка масива в память дисплея (ячейки 0–3)  lcd.createChar(0, snow);  lcd.createChar(1, sun);  lcd.createChar(2, rain);  lcd.createChar(3, tea);  // Приветствие  lcd.setCursor(0, 0);  lcd.print("PaiksePesa");  lcd.setCursor(0, 1);  lcd.print("Loading...");  delay(3000);  lcd.clear();}voidloop() {  unsigned longcurrentMillis = millis();  // Температура и свет обновляются каждые 5 секунд  if(currentMillis - lastUpdate >= 5000) {    lastUpdate = currentMillis;    // Температура    inttempValue = analogRead(tempPin);    floatvoltage = tempValue * 5.0 / 1024.0;    floattemperatureC = (voltage - 0.5) * 100;    // Свет    intldrValue = analogRead(ldrPin);    Serial.print("Temp: "); Serial.print(temperatureC);    Serial.print("  Light: "); Serial.println(ldrValue);    // Очистим только верхнюю строку (где погода)    lcd.setCursor(0, 0);    lcd.print("                "); //чтобы стереть пишим пустую строку    lcd.setCursor(0, 0);    // Условия погоды    if(temperatureC < 10) {      lcd.print("Vaga kulm! ");      lcd.write(byte(0));    } elseif(ldrValue >300) {      lcd.print("Vihmane ilm ");      lcd.write(byte(2));    } else{      lcd.print("Soe ja monus ");      lcd.write(byte(1));    }    // Кофе / т.к. С чаем все плохо было    lcd.setCursor(0, 1);    lcd.print("Coffie ");    lcd.write(byte(3));  }  // Отображение часов  unsigned longseconds = (millis() - startTime) / 1000;  unsigned intmins = (seconds / 60) % 60;  unsigned inthrs  = (seconds / 3600);  unsigned intsec  = seconds % 60;  // Часы справа на нижней строке  lcd.setCursor(9, 1);  // после "Coffie"  if(hrs < 10) lcd.print("0");  lcd.print(hrs);  lcd.print(":");  if(mins < 10) lcd.print("0");  lcd.print(mins);  lcd.print(":");  if(sec < 10) lcd.print("0");  lcd.print(sec);}

#include <LiquidCrystal.h>

Подключает библиотеку для работы с LCD 16×2 (или 20×4) дисплеем, который работает по 4-битному интерфейсу.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Указывает, какие пины Arduino подключены к дисплею:

LCD ПинНазначениеArduino Пин
RSРегистр12
EEnable11
D4Данные5
D5Данные4
D6Данные3
D7Данные2

lcd.begin(16, 2);

Запускает дисплей размером 16 символов на 2 строки.

lcd.setCursor(colum, row);

Устанавливает позицию курсора перед тем как печатать текст.

lcd.print("текст");

Печатает строку текста на дисплей с текущей позиции курсора.

lcd.clear();

Очищает весь экран и устанавливает курсор в начало (0,0).

lcd.createChar(номер, массив);

Создаёт символ, например снежинку, солнце или чашку чая.

millis()

Функция Arduino, которая возвращает количество миллисекунд, прошедших с момента включения платы.

1234unsigned longseconds = (millis() - startTime) / 1000;unsigned intmins = (seconds / 60) % 60;unsigned inthrs  = (seconds / 3600);unsigned intsec  = seconds % 60;

Расчёт времени с начала работы

Как пользователь видит работу:

1.Включение

При подключении питания на дисплее появляется:

PaiksePesa Loading...

Заголовок станции и сообщение о загрузке

2. Определение погоды

Через 3 секунды начинается отображение текущей погоды, и пользователь видит:

Пример при холоде:

Vaga kulm! ❄
Coffie ☕ 00:0
0:20
  • Указывает, что очень холодно
  • Советы: выпей чай, грейся

Пример при темноте (дождливая погода):

Vihmane ilm 🌧Coffie ☕  00:00:45

Пример при свете и тёплой температуре:

Soe ja monus ☀Coffie ☕  00:01:29

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

⏰ 3. Часы

Внизу справа отображаются часы с момента включения:

00:12:08

Идут в реальном времени — это добавляет ощущения, что устройство «живое».

Видео

Так же видео как работает в реальности наш проект метеостанция