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