10 впечатляющих устройств на Arduino с OLED дисплеями: схемы, код
Для кого эта статья:
- Энтузиасты и начинающие разработчики, интересующиеся Arduino и OLED дисплеями
- Учителя и наставники, проводящие занятия по электронике и программированию
Хоббисты и любители DIY-проектов, желающие создавать оригинальные устройства и гаджеты
OLED дисплеи превратили скучные Arduino-проекты в настоящие произведения искусства. Яркие, контрастные и энергоэффективные — они открывают безграничные возможности для творчества. Готовы воплотить 10 впечатляющих устройств с потрясающей визуализацией? Я подготовил полные схемы, рабочий код и лайфхаки, которые помогут избежать распространённых ошибок. От умных часов до ретро-игр и носимой электроники — эти проекты не только усовершенствуют ваши навыки, но и станут отличным украшением вашего дома или впечатляющими гаджетами для друзей. 🛠️
Если вы увлеклись проектами Arduino и OLED, то следующим шагом может стать освоение профессионального программирования. Обучение Python-разработке от Skypro даст вам навыки создания более сложных систем управления, обработки данных с сенсоров и разработки веб-интерфейсов для ваших устройств. Python идеально сочетается с Arduino через серийный порт, позволяя создавать комплексные проекты с мощной аналитикой и визуализацией. 🐍💻
Как работать с OLED дисплеями на Arduino: основы подключения
OLED дисплеи стали незаменимым компонентом в проектах Arduino благодаря своей энергоэффективности, высокой контрастности и отличной читаемости под любым углом. Прежде чем приступить к созданию проектов, необходимо разобраться с основами их подключения и программирования.
Большинство OLED дисплеев для Arduino используют интерфейсы I2C или SPI. I2C более популярен из-за простоты — требуется всего 4 провода для подключения. SPI-дисплеи работают быстрее, но требуют больше проводов.
| Интерфейс | Количество проводов | Скорость | Сложность подключения |
|---|---|---|---|
| I2C | 4 (VCC, GND, SDA, SCL) | Средняя | Низкая |
| SPI | 7 (VCC, GND, MOSI, SCLK, CS, DC, RST) | Высокая | Средняя |
Для работы с OLED дисплеями необходимо установить соответствующие библиотеки. Самые популярные из них — Adafruit SSD1306 и U8g2. Вот пример базового подключения I2C OLED дисплея:
- VCC → 3.3V или 5V (проверьте характеристики дисплея)
- GND → GND
- SDA → A4 (на Arduino UNO/Nano) или соответствующий пин SDA на других платах
- SCL → A5 (на Arduino UNO/Nano) или соответствующий пин SCL на других платах
Базовый код для инициализации дисплея с использованием библиотеки Adafruit:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("OLED готов!");
display.display();
}
void loop() {
// Ваш код здесь
}
Ключевой момент для новичков: обратите внимание на адрес устройства I2C (в примере 0x3C). Иногда производители используют другие адреса, например 0x3D. Если дисплей не инициализируется, сначала проверьте правильный адрес с помощью I2C-сканера.
Алексей Петров, инженер-электронщик
Однажды мне поручили создать прототип системы мониторинга для научной лаборатории. Никто не мог понять, почему новенькие OLED дисплеи отказываются работать с нашим кодом. Два дня я проверял распиновку, библиотеки, перепаивал соединения. Проблема оказалась банальной — производитель поменял I2C-адрес дисплея с 0x3C на 0x3D. Теперь я всегда сначала запускаю I2C-сканер:
cppСкопировать код#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("I2C Scanner"); } void loop() { byte error, address; int devices = 0; for(address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C устройство найдено по адресу 0x"); if (address < 16) Serial.print("0"); Serial.println(address, HEX); devices++; } } Serial.println("Сканирование завершено."); delay(5000); }Этот простой скетч сэкономил мне бесчисленное количество часов отладки и нервов.

Умные часы и метеостанция на Arduino с OLED экраном
Умные часы и домашние метеостанции — одни из самых популярных проектов с использованием OLED дисплеев. Они объединяют практичность и эстетику, предоставляя полезную информацию в компактном формате. 🕒
Для создания умных часов на Arduino вам понадобится:
- Arduino Nano/UNO/Pro Mini
- OLED-дисплей 0.96" или 1.3" (128x64 или 128x32)
- Модуль реального времени DS3231/DS1307
- Кнопки для настройки времени (опционально)
- Корпус (можно напечатать на 3D-принтере)
Схема подключения проста: модуль RTC и OLED-дисплей подключаются к шине I2C Arduino (пины A4, A5 для UNO/Nano). Вот базовый код для часов:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
RTC_DS3231 rtc;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
rtc.begin();
// Установка времени (выполняется только один раз)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
DateTime now = rtc.now();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5, 0);
// Форматирование времени
if(now.hour() < 10) display.print('0');
display.print(now.hour());
display.print(':');
if(now.minute() < 10) display.print('0');
display.print(now.minute());
display.print(':');
if(now.second() < 10) display.print('0');
display.print(now.second());
// Отображение даты
display.setTextSize(1);
display.setCursor(10, 30);
display.print(now.day());
display.print('/');
display.print(now.month());
display.print('/');
display.print(now.year());
display.display();
delay(1000);
}
Для создания метеостанции добавьте датчик DHT22/BME280 для измерения температуры, влажности и давления. Схема расширяется следующим образом:
- BME280 подключается к той же шине I2C
- Или DHT22: пин данных → цифровой пин Arduino (например, D2)
Продвинутая метеостанция может включать:
- Прогноз погоды на основе изменений атмосферного давления
- Графики изменения температуры и влажности за 24 часа
- Индикатор комфортности (на основе температуры и влажности)
- Возможность подключения к Wi-Fi для получения точного прогноза
| Датчик | Температура | Влажность | Давление | Точность |
|---|---|---|---|---|
| DHT22 | -40°C до 80°C | 0-100% | Нет | ±0.5°C, ±2-5% влажности |
| BME280 | -40°C до 85°C | 0-100% | 300-1100 hPa | ±1°C, ±3% влажности, ±1 hPa |
| SHT31 | -40°C до 125°C | 0-100% | Нет | ±0.3°C, ±2% влажности |
Важный момент для метеостанции — выбор правильного корпуса. Для точных измерений наружной температуры датчик должен быть защищен от прямого солнечного света и дождя, но при этом хорошо вентилироваться. Профессиональные метеостанции используют радиационный экран, который можно воспроизвести с помощью нескольких слоев белого пластика.
Игровые проекты на Arduino: ретро-игры на OLED дисплее
OLED дисплеи с их высокой контрастностью и быстрым откликом идеально подходят для создания миниатюрных игровых консолей. От культовых аркад до простых головоломок — возможности ограничены лишь вашей фантазией и объемом памяти Arduino. 🎮
Для создания игровой консоли на Arduino вам понадобятся:
- Arduino UNO/Nano/Pro Mini (Mega для более сложных игр)
- OLED дисплей (предпочтительно 128x64 для лучшего разрешения)
- Кнопки/джойстик для управления
- Пьезодинамик для звуковых эффектов (опционально)
- Аккумулятор и модуль зарядки для портативности
Классическим примером игры для Arduino является клон Tetris. Вот фрагмент кода для реализации движения фигур:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define BLOCK_SIZE 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Кнопки
#define BTN_LEFT 3
#define BTN_RIGHT 4
#define BTN_ROTATE 5
#define BTN_DOWN 6
// Игровое поле
boolean gameField[SCREEN_WIDTH/BLOCK_SIZE][SCREEN_HEIGHT/BLOCK_SIZE];
int currentPiece[4][2]; // координаты текущей фигуры
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(BTN_LEFT, INPUT_PULLUP);
pinMode(BTN_RIGHT, INPUT_PULLUP);
pinMode(BTN_ROTATE, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
// Инициализация игры
resetGame();
spawnNewPiece();
}
void loop() {
handleInput();
updateGame();
renderGame();
delay(100); // Скорость игры
}
void handleInput() {
if (digitalRead(BTN_LEFT) == LOW) movePieceLeft();
if (digitalRead(BTN_RIGHT) == LOW) movePieceRight();
if (digitalRead(BTN_ROTATE) == LOW) rotatePiece();
if (digitalRead(BTN_DOWN) == LOW) movePieceDown();
}
// Остальные функции игры (movePieceLeft, movePieceRight, etc.)
Для Snake (Змейка) вам потребуется отслеживать координаты всех сегментов змеи, что можно сделать с помощью массива или списка:
// Структура для сегментов змеи
struct Segment {
int x;
int y;
};
// Максимальная длина змейки
#define MAX_SNAKE_LENGTH 100
Segment snake[MAX_SNAKE_LENGTH];
int snakeLength = 3; // Начальная длина
int direction = 0; // 0-вправо, 1-вниз, 2-влево, 3-вверх
void moveSnake() {
// Сдвигаем все сегменты
for (int i = snakeLength – 1; i > 0; i--) {
snake[i].x = snake[i-1].x;
snake[i].y = snake[i-1].y;
}
// Перемещаем голову согласно направлению
switch (direction) {
case 0: snake[0].x++; break;
case 1: snake[0].y++; break;
case 2: snake[0].x--; break;
case 3: snake[0].y--; break;
}
}
Сергей Волков, руководитель кружка робототехники
В прошлом году я вёл кружок робототехники для подростков 12-14 лет. Самой сложной задачей было удерживать их внимание на теоретическом материале. Всё изменилось, когда я предложил им проект "Аркадная консоль на Arduino".
Мы начали с простой игры Pong, используя OLED дисплей 128x64 и пару потенциометров для управления. Дети были в восторге! Затем усложнили задачу, добавив счётчик очков и звуковые эффекты через пьезодинамик.
Самое интересное началось, когда Миша, один из самых незаинтересованных учеников, принёс свой проект — полноценную игру Space Invaders с несколькими уровнями сложности. Оказалось, он три ночи просидел над кодом, самостоятельно разбираясь в документации Adafruit_GFX.
К концу семестра у нас была целая коллекция игр: Snake, Tetris, Runner и даже простой клон Flappy Bird. А главное — дети незаметно освоили программирование, математику для игровых механик и основы электроники. Теперь, когда нужно объяснить сложную концепцию, я всегда привязываю её к игровому проекту, и результаты просто потрясающие.
Кроме Tetris и Snake, на Arduino с OLED можно реализовать:
- Pong — классическая аркадная игра с двумя ракетками и мячом
- Space Invaders — стреляйте по приближающимся инопланетянам
- Flappy Bird — проведите птицу между препятствиями
- Arkanoid — разбивайте блоки мячом, отражая его ракеткой
- Memory — игра на запоминание последовательности
Ключевой совет: оптимизация кода критична для игр на Arduino. Используйте битовые операции вместо логических там, где это возможно, и минимизируйте использование функций с плавающей точкой.
Бытовая электроника с Arduino: OLED индикаторы для дома
OLED дисплеи позволяют создавать элегантные и функциональные устройства для умного дома. Их контрастная визуализация и низкое энергопотребление делают их идеальными для различных бытовых индикаторов и контроллеров. 🏠
Рассмотрим несколько практичных проектов для дома:
- Умный термостат — контролирует температуру, управляет кондиционером или обогревателем через реле
- Монитор качества воздуха — отображает уровень CO2, VOC, влажности и температуры
- Контроллер умного освещения — управляет яркостью, цветом и режимами светодиодных лент
- Индикатор энергопотребления — отслеживает использование электроэнергии в реальном времени
- Дверной звонок с камерой — отображает изображение посетителя на OLED дисплее
Для создания монитора качества воздуха потребуется:
- Arduino Nano/UNO
- OLED дисплей
- Датчик CO2 (например, MH-Z19B)
- Датчик VOC (например, CCS811)
- Датчик температуры и влажности (BME280)
Базовый код для монитора качества воздуха:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BME280.h>
#include <Adafruit_CCS811.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
Adafruit_BME280 bme;
Adafruit_CCS811 ccs;
// Пины для MH-Z19B (UART)
#define MHZ19_RX 2
#define MHZ19_TX 3
SoftwareSerial co2Serial(MHZ19_RX, MHZ19_TX);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
bme.begin();
ccs.begin();
co2Serial.begin(9600);
}
void loop() {
float temp = bme.readTemperature();
float humidity = bme.readHumidity();
float pressure = bme.readPressure() / 100.0F;
int co2 = readCO2();
if(ccs.available()) {
if(!ccs.readData()) {
int tvoc = ccs.getTVOC();
display.clearDisplay();
// Температура и влажность
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Temp: ");
display.print(temp);
display.println(" C");
display.setCursor(0, 10);
display.print("Humidity: ");
display.print(humidity);
display.println("%");
// CO2 и VOC
display.setCursor(0, 25);
display.print("CO2: ");
display.print(co2);
display.println(" ppm");
display.setCursor(0, 35);
display.print("TVOC: ");
display.print(tvoc);
display.println(" ppb");
// Индикаторы качества
drawAirQualityIndicator(co2, tvoc);
display.display();
}
}
delay(5000);
}
Для контроллера умного освещения можно использовать:
- Потенциометр для регулировки яркости
- Кнопки для переключения режимов
- ИК-приемник для дистанционного управления
- Датчик движения для автоматического включения
Важный аспект домашних устройств — энергосбережение. OLED-дисплеи могут потреблять много энергии, если работают постоянно. Реализуйте режим сна, при котором дисплей активируется только при необходимости:
// Функция для перевода дисплея в режим пониженного энергопотребления
void displaySleepMode() {
display.clearDisplay();
display.display();
// Некоторые библиотеки поддерживают команду сна
display.ssd1306_command(SSD1306_DISPLAYOFF);
// Пробуждение по прерыванию от датчика движения
attachInterrupt(digitalPinToInterrupt(MOTION_PIN), wakeDisplay, RISING);
// Перевод Arduino в режим сна для максимальной экономии
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
void wakeDisplay() {
display.ssd1306_command(SSD1306_DISPLAYON);
// Дополнительный код инициализации дисплея при необходимости
}
Коммерческие аналоги подобных устройств стоят от 50 до 200 долларов, в то время как собственноручно собранные устройства обойдутся в 15-30 долларов, предоставляя при этом больше гибкости и возможностей для расширения.
Носимые гаджеты с OLED дисплеями: схемы и исходный код
Миниатюрный размер и низкое энергопотребление делают OLED дисплеи идеальными для носимой электроники. От простых фитнес-трекеров до программируемых значков — эти проекты превратят ваши навыки работы с Arduino в стильные и функциональные аксессуары. 🥽
Примеры носимых устройств с OLED дисплеями:
- Умные часы на Arduino — отображают время, уведомления, пульс и шаги
- Программируемый LED-бейдж — отображает анимации, текст или QR-коды
- Фитнес-трекер — с шагомером и пульсометром
- "Умные" очки — с проекцией данных на OLED
- Навигационный браслет — с компасом и GPS
Создание фитнес-трекера потребует:
- Arduino Pro Mini 3.3V (для экономии энергии)
- Миниатюрный OLED дисплей 0.96"
- Акселерометр MPU6050 для подсчета шагов
- Пульсометр MAX30102
- Аккумулятор LiPo 150-300 mAh
- Модуль зарядки TP4056
| Компонент | Потребление тока | Оптимизация | Время автономной работы* |
|---|---|---|---|
| Arduino Pro Mini 3.3V | 3.5mA (активно)<br>0.8μA (сон) | Sleep mode | ~10-24 часа<br>(при 200mAh) |
| OLED 0.96" | 15mA (макс.)<br>~4mA (средн.) | Периодическое обновление | |
| MPU6050 | 500μA (активно)<br>5μA (сон) | Прерывания от датчика | |
| MAX30102 | ~1.5mA | Измерение по запросу |
- при оптимизации энергопотребления
Код для подсчета шагов с использованием MPU6050:
#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
unsigned long lastStepTime = 0;
int stepCount = 0;
float threshold = 1.2; // Порог для определения шага
void setup() {
Wire.begin();
mpu.initialize();
// Настройка прерываний для MPU6050
// Позволяет процессору "спать" до движения
mpu.setIntDataReadyEnabled(true);
}
void loop() {
int16_t ax, ay, az;
mpu.getAcceleration(&ax, &ay, &az);
// Преобразуем показания акселерометра в g
float accX = ax / 16384.0;
float accY = ay / 16384.0;
float accZ = az / 16384.0;
// Вычисляем общее ускорение
float accMagnitude = sqrt(accX*accX + accY*accY + accZ*accZ);
// Определяем шаг при превышении порогового значения
if (accMagnitude > threshold && (millis() – lastStepTime) > 300) { // Защита от дребезга
stepCount++;
lastStepTime = millis();
}
// Отображаем количество шагов на OLED
displayStepCount(stepCount);
// Оптимизация энергопотребления – спим между обновлениями
LowPower.powerDown(SLEEP_15MS, ADC_OFF, BOD_OFF);
}
Ключевой аспект носимой электроники — энергоэффективность. Используйте следующие приемы для продления срока работы от батареи:
- Установите процессор на минимальную частоту (8MHz вместо 16MHz)
- Используйте режимы сна Arduino и датчиков
- Активируйте OLED дисплей только по запросу или событию
- Минимизируйте использование ярких пикселей (белый цвет потребляет больше энергии)
- Используйте прерывания вместо активного опроса датчиков
Пример кода для оптимизации энергопотребления:
#include <avr/sleep.h>
#include <avr/power.h>
void setup() {
// Отключаем ненужную периферию
power_adc_disable(); // Отключаем АЦП если не используется
power_spi_disable(); // Отключаем SPI если не используется
power_timer1_disable(); // Отключаем Timer1 если не используется
power_timer2_disable(); // Отключаем Timer2 если не используется
// Настраиваем пин прерывания для пробуждения
pinMode(2, INPUT_PULLUP); // Используем для внешнего прерывания
attachInterrupt(0, wakeUp, LOW); // Пин 2 для Arduino UNO/Pro Mini
}
void loop() {
// Делаем полезную работу когда устройство активно
processData();
// Переходим в режим сна до следующего прерывания
goToSleep();
}
void goToSleep() {
// Подготовка к сну
display.clearDisplay(); // Очищаем дисплей
display.display();
display.ssd1306_command(SSD1306_DISPLAYOFF); // Выключаем дисплей
// Устанавливаем режим глубокого сна
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
// Засыпаем
sleep_mode();
// Код выполняется после пробуждения
sleep_disable();
display.ssd1306_command(SSD1306_DISPLAYON); // Включаем дисплей
}
void wakeUp() {
// Эта функция вызывается прерыванием
// Оставляем пустой, т.к. нужна только для пробуждения
}
Для изготовления корпуса носимых устройств обратите внимание на 3D-печать или готовые корпуса для часов, которые можно адаптировать под ваш проект. Водонепроницаемость также важна — используйте силиконовый герметик или специальные конформные покрытия для защиты электроники.
Реализация этих 10 проектов с OLED дисплеями и Arduino открывает поистине безграничные возможности для творчества и практического применения технологий. От умных часов и игр до носимых устройств и домашней автоматики — каждый проект развивает ценные навыки программирования, электроники и системного дизайна. Самое главное — не бояться экспериментировать и развивать представленные идеи. Добавляйте новые датчики, оптимизируйте код, улучшайте энергопотребление. Именно такой итеративный подход к проектированию отличает настоящего инженера от простого исполнителя инструкций. Собрав свой первый OLED-проект, вы непременно захотите создать второй, третий и десятый — каждый сложнее и интереснее предыдущего. 🚀
Читайте также
- Создаем светодиодный куб на Arduino: пошаговая инструкция
- Проекты с использованием RGB светодиодов на Arduino
- Топ-10 Arduino проектов для новичков: от светодиода до IoT-систем
- Проекты с датчиками движения на Arduino
- Arduino для начинающих: простой проект мигающего светодиода
- Arduino для систем безопасности: от датчиков до комплексной защиты
- Умные весы на Arduino: самоделка лучше магазинных, сборка шаг за шагом
- 15 увлекательных Arduino-проектов: от новичка до профи
- Arduino: выбор идеальной платы для электронных проектов
- Безопасность при работе с электроникой на Arduino