Предыстория
Я немного торгую на Ozon и Wildberries по FBS — это когда у тебя дома лежат товары, и как только приходит заказ, ты должен всё упаковать и нести в ближайший пункт приёма. Кайф? Почти.
Но есть одна беда — уведомления.
У меня китайский телефон, и он, как настоящий мастер интриги, может не прислать ничего. Или прислать, когда уже всё, поезд ушёл и штраф прилетел. А штрафы — это, знаешь ли, совсем не вдохновляют.
Я подумал: а что если сделать что-то, что просто мигает, когда есть заказ? Вот прям что-то своё, что само проверяет, и без всяких телефонов и компов. Так родилась идея: собрать визуального монстрика, который будет следить за моими заказами.
Как вообще всё началось?
Честно? Я всегда мечтал собрать что-нибудь с микроконтроллером, но то времени не было, то учиться лень, то вообще непонятно, с чего начать.
А тут — новогодние каникулы, свободное время, и нейронки уже умеют писать код. Комбо!
Я решил: всё, погружаюсь в электронику и делаю свой первый девайс.
Что этот монстрик умеет?
Основной функционал:
- Каждые 15 секунд сам ходит в интернет, запрашивает, есть ли заказы на Ozon и WB.
- Если заказ есть — зажигается диод.
- Инфа выводится на OLED дисплей, где всё наглядно: сколько заказов, откуда, что к чему.
Дополнительный функционал:
- Я добавил датчик расстояния.
- Если провести рукой — монстрик запрашивает отчёт по логистике с Wildberries: сколько товара уехало, сколько едет обратно, сколько лежит.
- Через 5 секунд — снова возвращается к обычному режиму с заказами.
Что я использовал
Корпус? 3D-принтера не было. Я сделал всё на латунных стержнях, которые играют роль и проводов, и каркаса. Немного больно пальцам, конечно, но зато выглядит как арт-объект. Почти киберпанк.
Почему ESP32, а не Arduino?
Arduino — это, конечно, классика.
Но это как брать бабушкин "Мерседес" без колёс, когда рядом стоит спорткар. (более подробно распишу в следующей статье)
ESP32:
- Встроенный Wi-Fi и Bluetooth.
- Мощнее.
- Меньше.
- По цене — почти как Arduino, а возможностей в разы больше.
Как оно работает?
- Монстрик сам раз в 15 секунд отправляет запросы к Ozon и WB.
- Получает, сколько заказов в работе.
- Зажигает нужный светодиод (у меня зелёный и красный из набора).
- И выводит всё на экран.
Плюс:
- Провожу рукой — и он показывает логистику по Wildberries: что на складе, что в пути, что вернулось.
- Через 5 секунд — всё исчезает и возвращается в обычный режим.
Такое вот мини-комбо: индикация + отчёты + автоматизация.
Как я это запрограммировал?
Я понятия не имел, как работают API, что такое запросы, заголовки, JSON и вот это всё.
Я просто пришёл к нейронке и сказал:
"Хочу, чтобы микроконтроллер проверял, есть ли у меня заказы с Озона и Вайлдберриз."
Она говорит: "Ага, давай документацию по API".
Я нашёл на сайтах WB и Ozon, скинул ей — и через 20 минут получил рабочий код.
ESP32, оказывается, может ходить в интернет и делать запросы, как взрослый компьютер, только без системы и вообще размером с печеньку. Это офигенно.
Были ли проблемы? О да.
- Кириллица на дисплее не работала.
- Всё было в иероглифах. Я прям думал: "Ну всё, конец мечте." Но потом нашёл библиотеку, в которой можно было заменить один файл, и она начала понимать русский язык. День жизни на это ушёл, но теперь экран говорит по-человечески.
- Анимация.
- Хотел человечка, который несёт коробку. Я просто описал идею нейронке: "Хочу, чтобы человечек шёл с коробкой."
- Она выдала мне код.
- Я вставил — и он пошёл! Да, немного угловатый, но это было магически круто.
- Сейчас я уже отрисовал нормальные спрайты вручную, но пока не прикрутил. Это всё будет в версии 2.0.
- Запросы шли слишком часто.
- Серверы начали коситься. Пришлось поставить таймеры, чтобы не перегружать API.
А результат?
Этот монстрик стоит у меня на столе. Подключён по Type-C, не глючит, не ломается. Сам всё проверяет, мигает, шуршит.
И главное — за последний месяц я не получил ни одного штрафа. А это уже победа.
Почему я этим горжусь?
Потому что это мой первый девайс в жизни, первый написанный код, первая пайка. Я вообще с нуля всё делал. Часть компонентов паял по два раза — не с первого раза получилось. Пальцы поранил, но оно того стоило.
Хочешь собрать такой же?
Ниже я выложу весь код, с объяснениями по блокам — как он устроен и что делает. Всё можно менять под себя: цвета диодов, тексты, частоту запросов, внешний вид человечка и даже API.
А если что-то не работает — пиши в комментах, помогу.
Скоро сделаю обновлённую версию с красивой графикой и новым корпусом.
Хочешь — уже начнём с блока кода, а хочешь — подредактируем этот текст. Что скажешь?
Отлично! Сейчас сделаю понятное и весёлое описание кода по блокам — как инструкция, но с человеческим лицом. Ниже каждый важный кусок кода будет разжёван: что делает, зачем нужен, и что можно поменять под себя.
Разбор кода моего монстрика ПОЛНОСТЬЮ КОД
Код большой, но пугаться не надо — сейчас всё объясню как есть.
1. Подключение библиотек
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Ultrasonic.h>
#include <WiFi.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
Что делает:
Это набор библиотек, без которых наш монстрик просто чёрный кирпич.
- WiFi.h — даёт ESP32 выход в интернет.
- HTTPClient — позволяет отправлять HTTP-запросы.
- ArduinoJson — помогает разобрать ответы от серверов (типа "сколько заказов?").
- Adafruit_SSD1306 и Adafruit_GFX — управление OLED-дисплеем.
- Ultrasonic — библиотека для работы с датчиком расстояния.
Можно менять:
Если используешь другой дисплей или другой датчик — скорее всего, понадобится заменить библиотеку.
2. Настройка дисплея
Adafruit_SSD1306 display(128, 64, &Wire, -1);
Что делает:
Создаёт объект дисплея с нужным разрешением. У меня 128 на 64 пикселя.
Можно менять:
Если у тебя другой размер дисплея — подправь цифры. Например, 128x32.
3. Настройки Wi-Fi
const char* ssid = "....";
const char* password = ".....";
Что делает:
Подключает монстрика к твоему Wi-Fi.
Можно менять:
Да, ОБЯЗАТЕЛЬНО. Иначе он будет пытаться подключиться к моему роутеру.
4. Координаты для анимации
int personX = 0;
int personY = 56;
int houseX = 100;
int houseY = 45;
bool step = false;
Что делает:
Это переменные для анимации человечка и домика. Человечек идёт к дому — типа заказ собирает.
Можно менять:
Можешь передвинуть дом или человечка, ускорить или замедлить анимацию.
5. Символ иконки Wildberries
const uint8_t marketplaceIcon[] PROGMEM = { ... };
Что делает:
Это кастомная иконка, которую можно вывести на экран (я её пока не использую в интерфейсе, но можно).
Можно менять:
Нарисуй в редакторе пиксельных иконок свою и замени тут.
6. Настройки API
const char* wbUrl = "...";
const char* ozonUrl = "...";
String wbToken = "...";
Что делает:
Это адреса серверов WB и Ozon + твои токены для доступа.
Можно менять:
Токены — ОБЯЗАТЕЛЬНО заменить на свои. Они выдаются в личных кабинетах продавца.
7. Настройка светодиодов
const int LED_WB = 18;
const int LED_OZON = 32;
Что делает:
Определяет, на каких пинах сидят светодиоды.
Можно менять:
Если ты подключил диоды на другие пины — меняй эти цифры.
8. HC-SR04 — датчик расстояния
const int trigPin = 14;
const int echoPin = 13;
Что делает:
Эти пины подключаются к датчику расстояния. Он ловит, когда ты провёл рукой.
Можно менять:
Если ты воткнул его в другие пины — поменяй тут.
9. Состояния приложения
enum AppState { SHOW_ORDERS, REQUEST_REPORT, WAIT_FOR_REPORT, SHOW_REPORT };
Что делает:
Определяет, что сейчас делает монстрик:
- Показывает заказы?
- Запрашивает логистику?
- Ожидает отчёт?
- Показывает отчёт?
Можно менять:
Не нужно. Но если хочешь добавить ещё один режим — делай здесь.
10. Функция setup()
void setup() { ... }
Что делает:
Происходит инициализация всего и вся.
- Подключается к Wi-Fi
- Настраивает дисплей
- Показывает IP
- Синхронизирует время
- Настраивает пины
Можно менять:
Добавь туда свой приветственный экран или звук, если хочешь красоты.
11. Функция loop()
void loop() { ... }
Что делает:
Главный цикл программы. Здесь:
- Обновляются данные каждые 15 секунд.
- Управляются светодиоды.
- Если рука проведена — переключается в режим логистики.
- Через 5 секунд возвращается обратно.
Можно менять:
Частоту обновления (например, с 15 на 30 секунд). Таймеры. Анимацию. Всё тут.
12. Получение заказов с WB и Ozon
uint16_t getWBOrdersCount() { ... }
uint16_t getOzonUnfulfilled() { ... }
Что делает:
Отправляет GET и POST запросы к серверам, получает список заказов.
Можно менять:
Если хочешь изменить фильтрацию, количество заказов — смотри документацию API.
13. Логистика: отчёты Wildberries
void createReport()
void checkReportStatus()
void downloadReport()
void displayReport()
Что делает:
Когда ты машешь рукой, запускается отчёт по логистике WB:
- Создание задачи
- Проверка её статуса
- Получение отчёта
- Отображение на экране
Можно менять:
Можно заменить на другие типы отчётов, если интересно (например, продажи по регионам).
14. Анимация человечка
void drawPersonWithBox(int x, int y, bool step) { ... }
Что делает:
Рисует человечка, который топает с коробкой к домику.
Можно менять:
Хочешь его с ушами? С пакетом? На велосипеде? Рисуй и обновляй.
15. Преобразование текста в кириллицу
String utf8rus(String source) { ... }
Что делает:
Так как OLED-дисплей не умеет по-нормальному отображать русский текст, это функция переводит UTF-8 в win1251.
Можно менять:
Не желательно. Но если хочешь другой шрифт — придётся искать или рисовать самому.
16. Разное: таймеры, переменные, отладка
В коде куча глобальных переменных: previousMillis, lastUpdateTime, state, appState — всё это управляет временем запросов, сменой экранов, состоянием отчёта и т.д.
Можно менять:
Здесь можно тонко настраивать, насколько часто делать запросы, как долго показывать отчёт и т.п.
Что я купил
Я выбрал ESP32 DevKit v1, и вот почему:
🔧 Характеристики ESP32:
- ✅ Два ядра (одно может заниматься Wi-Fi, другое — твоим кодом)
- ✅ Частота до 240 МГц — быстрая!
- ✅ Встроенный Wi-Fi — без всяких модулей
- ✅ Встроенный Bluetooth — пригодится потом
- ✅ Много GPIO-пинов — можно подключить кучу всего
- ✅ Поддержка Arduino IDE — пиши как на обычной Arduino
- ✅ Работает от USB Type-C или microUSB (в зависимости от модели)
- ✅ Стоит дёшево — ~300 ₽ на WB, Ozon или AliExpress
Вообще все можно купить на озоне или вб, иногда даже дешевле
Я использовал ультразвуковой датчик расстояния HC-SR04 — это классический Arduino-датчик, который:
- работает как эхолот: посылает ультразвук и ловит отражение;
- подключается по двум пинам: TRIG (триггер) и ECHO (эхо);
- питается от 5В, работает на расстояниях примерно от 2 до 400 см, но в коде я задал фильтр от 10 до 15 см — чтобы ловить только взмах рукой.
Я использовал OLED-дисплей 0.96 дюйма, подключаемый по I2C.
📌 Полные характеристики дисплея:
- Тип: OLED
- Размер: 0.96 дюйма
- Разрешение: 128 × 64 пикселя
- Цвет: монохромный (обычно белый или синий)
- Интерфейс: I2C (всего 4 пина: VCC, GND, SDA, SCL)
- Контроллер: SSD1306
Подключил пины
VCC - 3.3V или 5V
GND - GND
SDA - GPIO 21
SCL - GPIO 22
📦 Обычно такие дисплеи стоят ~100 рублей и широко поддерживаются библиотеками:
- Adafruit_SSD1306
- Adafruit_GFX
Подключение пинов по коду:
- OLED дисплей (0.96") — I2C:
- SCL (Clock) → GPIO 22
- SDA (Data) → GPIO 21
- VCC → 5V
- GND → GND
- Датчик расстояния HC-SR04:
- TRIG (Trigger) → GPIO 14
- ECHO (Echo) → GPIO 13
- VCC → 5V
- GND → GND
- Светодиоды:
- LED_WB (для Wildberries) → GPIO 18 (или другой пин, в зависимости от твоего подключения)
- LED_OZON (для Ozon) → GPIO 32 (или другой пин, если поменяешь)
- Подключение Wi-Fi:
- Для подключения к Wi-Fi ты просто настраиваешь соединение в коде с помощью функций библиотеки WiFi.h. Здесь пины не используются напрямую, всё через настройки в коде.
- Кнопки (если есть):
- Пины для кнопок или других устройств (если они есть) подключаются с помощью pinMode, указывая нужный пин в коде.
Если ты хочешь, можешь поменять пины для подключения устройств, просто укажи их в коде, заменив пины в функциях pinMode и подключения к дисплею/датчику.
P.s. Это мой первый опыт в пайке и кодинге! Если что-то не понятно пишите, задавайте вопросы, расскажу