Найти в Дзене

Как я собрал своего первого монстрика, который сам следит за заказами с Ozon и Wildberries

Предыстория Я немного торгую на Ozon и Wildberries по FBS — это когда у тебя дома лежат товары, и как только приходит заказ, ты должен всё упаковать и нести в ближайший пункт приёма. Кайф? Почти. Но есть одна беда — уведомления. У меня китайский телефон, и он, как настоящий мастер интриги, может не прислать ничего. Или прислать, когда уже всё, поезд ушёл и штраф прилетел. А штрафы — это, знаешь ли, совсем не вдохновляют. Я подумал: а что если сделать что-то, что просто мигает, когда есть заказ? Вот прям что-то своё, что само проверяет, и без всяких телефонов и компов. Так родилась идея: собрать визуального монстрика, который будет следить за моими заказами. Честно? Я всегда мечтал собрать что-нибудь с микроконтроллером, но то времени не было, то учиться лень, то вообще непонятно, с чего начать. А тут — новогодние каникулы, свободное время, и нейронки уже умеют писать код. Комбо! Я решил: всё, погружаюсь в электронику и делаю свой первый девайс. Основной функционал: Дополнительный ф
Оглавление

Предыстория

Я немного торгую на 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
ультразвуковой датчик расстояния HC-SR04

Вообще все можно купить на озоне или вб, иногда даже дешевле

Я использовал ультразвуковой датчик расстояния HC-SR04 — это классический Arduino-датчик, который:

  • работает как эхолот: посылает ультразвук и ловит отражение;
  • подключается по двум пинам: TRIG (триггер) и ECHO (эхо);
  • питается от , работает на расстояниях примерно от 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

Подключение пинов по коду:

  1. OLED дисплей (0.96") — I2C:
  • SCL (Clock)GPIO 22
  • SDA (Data)GPIO 21
  • VCC5V
  • GNDGND
  1. Датчик расстояния HC-SR04:
  • TRIG (Trigger)GPIO 14
  • ECHO (Echo)GPIO 13
  • VCC5V
  • GNDGND
  1. Светодиоды:
  • LED_WB (для Wildberries)GPIO 18 (или другой пин, в зависимости от твоего подключения)
  • LED_OZON (для Ozon)GPIO 32 (или другой пин, если поменяешь)
  1. Подключение Wi-Fi:
  • Для подключения к Wi-Fi ты просто настраиваешь соединение в коде с помощью функций библиотеки WiFi.h. Здесь пины не используются напрямую, всё через настройки в коде.
  1. Кнопки (если есть):
  • Пины для кнопок или других устройств (если они есть) подключаются с помощью pinMode, указывая нужный пин в коде.

Если ты хочешь, можешь поменять пины для подключения устройств, просто укажи их в коде, заменив пины в функциях pinMode и подключения к дисплею/датчику.

P.s. Это мой первый опыт в пайке и кодинге! Если что-то не понятно пишите, задавайте вопросы, расскажу