Автономная двухпомповая система на ESP32 — инсулин + дасиглюкагон с OLED-дисплеем, физическими кнопками и веб-панелью управления прямо с телефона
Warning
Это учебный прототип, а не медицинское изделие. Уровень глюкозы в прошивке симулируется, реального датчика нет. Не используйте устройство для введения лекарств людям.
| 🩸 Глюкоза в реальном времени | Уровень, тренд (↑ → ↓) и зона LOW / NORMAL / HIGH — на OLED и на сайте |
| 🤖 Авто-режим | При LOW сам вводит дасиглюкагон, при HIGH — инсулин. Доза считается автоматически: 15 U = 1 ммоль/л |
| 🛡️ Защита | Инсулин заблокирован при LOW, дасиглюкагон — при HIGH; отсчёт 3 с перед авто-уколом и пауза между уколами |
| 📈 График | История глюкозы за 30 минут на <canvas>, с метками каждого впрыска и подсказками при наведении |
| 📱 Веб-панель | Адаптивный тёмный интерфейс: дозы, удалённый впрыск, журнал, кнопка «СТОП». Работает без интернета |
| 🎛️ Кнопки на корпусе | 5 кнопок: уровень, выбор препарата, доза ±, старт. Удержание — быстрая прокрутка (×1 → ×5 → ×10) |
| 🔋 Батарея | Заряд Li-Ion аккумулятора на экране и на сайте, звуковое предупреждение при <15% |
| 📶 Wi-Fi AP + STA | Своя точка доступа всегда включена + подключение к роутеру/телефону с авто-переподключением |
| ⚙️ Шаговые моторы | Неблокирующее управление в отдельной задаче FreeRTOS, обмотки обесточиваются после каждой подачи |
Это тот же самый интерфейс, что зашит в ESP32, только «устройство» симулируется прямо в браузере (моторы ускорены в 5 раз).
| Компонент | Пины ESP32 |
|---|---|
| OLED SH1106 128×64 (I2C) | SDA 21, SCL 22 |
| Мотор 1 — инсулин (28BYJ-48 + ULN2003) | IN1–IN4: 19, 18, 5, 17 |
| Мотор 2 — дасиглюкагон (28BYJ-48 + ULN2003) | IN1–IN4: 13, 12, 14, 27 |
| Кнопка «уровень сахара» | 32 |
| Кнопка «выбор препарата» | 33 |
| Кнопки «доза +» / «доза −» | 25 / 26 |
| Кнопка «старт» | 23 |
| Буззер | 15 |
| Замер батареи (делитель 100к / 100к) | 34 |
Все кнопки — на INPUT_PULLUP, второй контакт на GND.
📐 Полная схема подключения
Моторы питаются отдельными 5 В (step-up от аккумулятора), логика ESP32 остаётся на 3.3 В. Делитель для замера заряда ставится на сыром напряжении батареи — до step-up модуля.
- Установите Arduino IDE и плату ESP32 (Boards Manager →
esp32by Espressif). - Установите библиотеки (Library Manager):
- U8g2 — by oliver
- ESP Async WebServer и Async TCP — by ESP32Async
- Откройте
firmware/DualPump/DualPump.ino, выберите плату ESP32 Dev Module и загрузите. - Подключитесь к Wi-Fi
DualPump(пароль12345678) и откройте http://192.168.4.1.
⚙️ Настройки в начале файла
const char* STA_SSID = ""; // Wi-Fi роутера/телефона (пусто = только своя точка)
const char* STA_PASS = "";
#define MOTOR1_REVERSE false // развернуть направление мотора 1
#define MOTOR2_REVERSE true // развернуть направление мотора 2
#define STEPS_PER_UNIT 512 // калибровка: шагов мотора на 1 единицу дозы
#define MAX_DOSE 150 // максимальная доза, U
#define GLU_LOW_MMOL 3.9f // граница LOW
#define GLU_HIGH_MMOL 10.0f // граница HIGH
#define AUTO_DEFAULT_ON true // авто-режим при включенииКалибровка: запустите подачу, например, 10 U и замерьте, сколько жидкости реально вышло из шприца. Если вышло вдвое больше нужного — уменьшите STEPS_PER_UNIT вдвое, и наоборот.
Веб-панель общается с ESP32 через простой REST — им можно управлять и из своих скриптов.
| Метод | Путь | Параметры |
|---|---|---|
GET |
/api/status |
— текущее состояние (глюкоза, дозы, моторы, батарея, журнал) |
GET |
/api/history |
— история глюкозы для графика |
POST |
/api/inject |
drug (0 — инсулин, 1 — дасиглюкагон), units |
POST |
/api/dose |
drug, units или delta |
POST |
/api/select |
drug — выбрать препарат на устройстве |
POST |
/api/glucose |
value — задать глюкозу, ммоль/л |
POST |
/api/level |
level (0 LOW, 1 NORMAL, 2 HIGH) |
POST |
/api/auto |
on (0/1) |
POST |
/api/stop |
— аварийная остановка обоих моторов |
DualPump/
├── firmware/DualPump/DualPump.ino # прошивка + встроенная веб-панель
├── demo/index.html # интерактивное демо без железа
└── docs/ # скриншоты и схема подключения
