Veronika Portfoolio

LCD ekraan

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

Основная логика:

  1. Считывает аналоговые значения с температуры и света.
  2. Переводит температуру в градусы Цельсия.
  3. Определяет освещённость и температуру и отображает подходящий текст и иконки.
  4. Меняет экран каждые 2 секунды: сначала показывает описание погоды и температуру, затем – уровень освещённости.

Пользовательские символы:

  • degrees[] – символ °C
  • smile[], sad[] – эмоции
  • rain[], sun[] – погода

Видео

Применение в реальной жизни:

Домашняя погода: индикация на кухне или в коридоре.

Школы и лаборатории: демонстрация климатических условий.

Сельское хозяйство: контроль температуры в теплицах.

Умный дом: активация сценариев в зависимости от температуры/света.

Психологический эффект: добавление эмоций и рекомендаций повышает настроение пользователя.


Заключение

Проект позволяет:

  • Научиться работать с дисплеем и кастомными символами;
  • Использовать аналоговые датчики;
  • Писать логику отображения в зависимости от внешних условий;
  • Повысить креативность — придумать фразы, изображения и оформление.