← До всіх проєктів
Дисплеї Середній

Дисплей Nokia 5110 (PCD8544): термометр з мінімумом, максимумом і шкалою вологості

Екран від легендарного телефона: 84×48 пікселів, споживання менше 1 мА і добре видно на сонці. Підключаємо його програмним SPI, налаштовуємо контраст і з'ясовуємо, чому з Arduino Uno без резисторів він проживе недовго.

Складність
Середній
Час
45 min
Категорія
Дисплеї
Оновлено

Про проєкт

Nokia 5110 — монохромний РК-дисплей 84×48 з контролером PCD8544. На відміну від OLED він не світиться сам, тож майже нічого не споживає (0.3 мА без підсвітки) і чудово читається при яскравому світлі. Для пристрою на батарейці чи вуличного термометра — один із найкращих варіантів.

Що потрібно

  • ESP32 DevKit
  • Модуль Nokia 5110 (червона або синя плата з 8 виводами)
  • Датчик AHT20 (температура і вологість)

Схема

Nokia 5110 ESP32
RST GPIO17
CE (CS) GPIO5
DC GPIO16
DIN GPIO23
CLK GPIO18
VCC 3V3
BL 3V3 (або GPIO для керування підсвіткою)
GND GND
AHT20 VIN → 3V3, GND → GND, SDA → GPIO21, SCL → GPIO22

Порядок виводів на різних платах різний — дивіться на підписи. На деяких червоних модулях підсвітка вмикається, коли BL з'єднати з GND.

Лише 3.3 В

PCD8544 живиться від 2.7–3.3 В, і його входи теж розраховані на 3.3 В. З ESP32 проблем немає. З Arduino Uno підключайте VCC до 3.3V, а на лінії CLK, DIN, DC, RST ставте резистори 10 кОм (на CE — 1 кОм) або перетворювач рівнів. Без них дисплей часто працює, але поступово темніє і вмирає. Симулятор попередить про 5 В на будь-якому виводі.

Контраст

Контраст у різних партій дисплеїв дуже відрізняється. Замало — зображення бліде, забагато — екран сірий суцільно. Почніть з setContrast(55) і змінюйте кроком 5 між 40 і 70. У симуляторі видно, як виглядають крайні значення.

Код

// Термометр на Nokia 5110 (PCD8544): великі цифри, мінімум/максимум і шкала вологості
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Adafruit_AHTX0.h>

const int PIN_CLK = 18, PIN_DIN = 23, PIN_DC = 16, PIN_CE = 5, PIN_RST = 17;
Adafruit_PCD8544 display(PIN_CLK, PIN_DIN, PIN_DC, PIN_CE, PIN_RST);   // програмний SPI
Adafruit_AHTX0 aht;
float tMin = 100, tMax = -100;

void setup() {
  Serial.begin(115200);
  display.begin();
  display.setContrast(55);   // 40–70 залежно від модуля
  display.clearDisplay();
  display.display();
  if (!aht.begin()) {
    display.setCursor(0, 0);
    display.print("No AHT20");
    display.display();
    while (true) delay(1000);
  }
}

void loop() {
  sensors_event_t hum, temp;
  aht.getEvent(&hum, &temp);
  float t = temp.temperature;
  if (t < tMin) tMin = t;
  if (t > tMax) tMax = t;

  display.clearDisplay();
  display.setTextColor(BLACK);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("Temperature");
  display.setTextSize(2);
  display.setCursor(0, 11);
  display.print(t, 1);
  display.print("C");
  display.setTextSize(1);
  display.setCursor(0, 29);
  display.print(tMin, 1);
  display.print(" / ");
  display.print(tMax, 1);
  int w = map((int)hum.relative_humidity, 0, 100, 0, 84);   // вологість — шкала внизу
  display.drawRect(0, 40, 84, 8, BLACK);
  display.fillRect(0, 40, w, 8, BLACK);
  display.display();
  delay(1000);
}

display() передає в дисплей увесь буфер — 504 байти. До цього виклику всі print() і fillRect() малюють лише в пам'яті ESP32, тому екран не мерехтить.

Корисно знати

  • Апаратний SPI. Конструктор Adafruit_PCD8544(DC, CS, RST) використовує апаратний SPI (на ESP32 — CLK 18, DIN 23). Він швидший, але для термометра різниці не видно.
  • Шрифти. Розмір 1 — 14 символів × 6 рядків, розмір 2 — 7 × 3. Кириличних символів у вбудованому шрифті GFX немає: потрібен власний шрифт.
  • Підсвітка. 4 світлодіоди споживають 10–20 мА. Під'єднайте BL до GPIO і вмикайте підсвітку на 10 секунд після натискання кнопки.