Прокачайте свою DIY-консоль: оживляем игру звуковыми эффектами и сохраняем лучшие результаты в памяти ESP32.
В первой части мы создали основу игры ESP32 Dino Run: настроили графику на OLED-дисплее и прописали физику прыжка. Но какая игра обойдется без звука «Пип!» при прыжке и соревновательного элемента? Сегодня мы добавим пьезо-пищалку (Buzzer) и научим игру запоминать ваш High Score даже после выключения питания.
Новые компоненты для ESP32 Dino Run
Для этого этапа нам понадобятся всего два дополнительных элемента:
Список компонентов:
Схема подключения компонентов
Для подключения мы используем интерфейс I2C. Это стандарт для OLED-дисплеев, который требует всего два сигнальных провода, помимо питания.
Важно: В коде мы будем использовать внутреннюю подтяжку пина кнопки (INPUT_PULLUP), поэтому дополнительный резистор на кнопку ставить не обязательно — просто подключаем её напрямую между пином 15 и землей (GND).
| Компонент | Пин дисплея / кнопки | Пин ESP32 (GPIO) | Описание |
|---|---|---|---|
| OLED Display | VCC | 3.3V | Питание дисплея |
| OLED Display | GND | GND | Общий минус |
| OLED Display | SCL | GPIO 22 | Тактовая линия I2C |
| OLED Display | SDA | GPIO 21 | Линия данных I2C |
| Кнопка | Pin 1 | GPIO 15 | Сигнал прыжка |
| Кнопка | Pin 2 | GND | Замыкание на землю |
| Buzzer | Резистор 100-220 Ом | GPIO 25 | Выход звукового сигнала |
| Buzzer | Negative (-) | GND | Общая земля |
Симуляция в Wokwi: Тестируем без железа
Перед тем как брать в руки паяльник, я рекомендую проверить всё в онлайн-симуляторе. Это сэкономит время на отладку.
Попробовать игру в браузере:
Работа с памятью EEPROM (Preferences)
Особенность ESP32 Dino Run во второй части — использование библиотеки Preferences.h. В отличие от старой EEPROM, она позволяет сохранять данные в виде пар «ключ-значение» во флеш-память. Это значит, что ваш рекорд не сотрется при перезагрузке.
Логика работы с рекордами:
Исходный код: ESP32 Dino Run (Часть 2)
Скопируйте этот код в Arduino IDE. Обратите внимание на использование функции tone() для генерации звука.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Preferences.h> // Библиотека для сохранения рекордов
// Настройки дисплея и звука
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define BUZZER_PIN 25
#define BUTTON_PIN 15
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Preferences preferences;
int dinoY = 45;
int velocity = 0;
bool isJumping = false;
int obstacleX = 128;
int score = 0;
int highScore = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Работа с рекордами
preferences.begin("dino-game", false);
highScore = preferences.getInt("highscore", 0);
showStartScreen();
}
void playSound(int freq, int duration) {
tone(BUZZER_PIN, freq, duration);
}
void loop() {
// Прыжок и звук
if (digitalRead(BUTTON_PIN) == LOW && !isJumping) {
velocity = -12;
isJumping = true;
playSound(600, 100); // Звук прыжка
}
// Физика и логика препятствий (как в Части 1)
// ... (код перемещения кактуса)
// Проверка столкновения
if (obstacleX > 15 && obstacleX < 25 && dinoY > 35) {
handleGameOver();
}
drawGame();
delay(30);
}
void handleGameOver() {
playSound(150, 500); // Грустный звук проигрыша
if (score > highScore) {
highScore = score;
preferences.putInt("highscore", highScore); // Сохраняем рекорд
}
// Вывод экрана Game Over...
}
void drawGame() {
display.clearDisplay();
// Отрисовка Score и High Score
display.setCursor(0,0);
display.print("S: "); display.print(score);
display.setCursor(60,0);
display.print("HI: "); display.print(highScore);
// Отрисовка Дино и Кактуса...
display.display();
}Почему звук важен для ESP32 Dino Run?
Звуковой фидбек улучшает игровой опыт (UX). Игрок лучше чувствует момент прыжка и столкновения. В следующей части мы пойдем еще дальше и заменим пищалку на полноценную музыку!

AndiBond.com
Поддержите проект AndiBond
Создание качественных гайдов, поиск рабочих решений и отладка кода занимают много времени. Все мои проекты остаются открытыми и бесплатными, чтобы каждый мог войти в мир электроники с минимальным порогом входа.
Если этот туториал сэкономил ваше время или помог запустить вашу первую игру на ESP32, вы можете поддержать развитие блога. Ваша поддержка помогает мне покупать новые датчики, дисплеи и контроллеры для будущих обзоров.
Каждый донат — это топливо для новых статей и видео. Спасибо, что вы со мной!»




