Дисплей Nokia 5110 (PCD8544): термометр з мінімумом, максимумом і шкалою вологості
Екран від легендарного телефона: 84×48 пікселів, споживання менше 1 мА і добре видно на сонці. Підключаємо його програмним SPI, налаштовуємо контраст і з'ясовуємо, чому з Arduino Uno без резисторів він проживе недовго.
Про проєкт
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 секунд після натискання кнопки.