RisalDash RisalDash

Проект · Smart city · Мониторинг

Умная мусорка, которая сама вызывает вывоз

Мусоровоз, объезжающий полупустые баки, жжёт топливо; переполненный бак устраивает свалку. Решение — ультразвуковой датчик за $2 на крышке и ESP32: меряем наполнение каждого бака, показываем все точки на одном дашборде и поднимаем алерт, как только баку нужен вывоз. Вот вся сборка — и сначала её можно запустить вообще без железа.

ПроектSmart cityHC-SR04УльтразвукESP32
Проект умной мусорки на ESP32: ультразвуковой уровень, мульти-бак дашборд и алерты

Как это меряется — датчик бака, наоборот

HC-SR04 под крышкой пингует вниз и сообщает воздушный зазор до мусора. Короткое эхо = полный бак — логика датчика уровня воды, перевёрнутая. Одна строка превращает эхо в то, что нужно диспетчеру:

fill = 100.0 * (1.0 - gapCm / BIN_CM);   // BIN_CM = глубина пустого бака

На улице берите влагозащищённый JSN-SR04T — та же математика, герметичная голова. Подключение — стандартное для HC-SR04 (5 В + делитель на ECHO для 3.3 В пина):

HC-SR04 подключён к ESP32 с делителем напряжения на ECHO
HC-SR04 на ESP32 — TRIG напрямую, ECHO через делитель 1k/2k. Собрано в BoardLab.

Дашборд — все баки на одном экране

ESP отдаёт весь UI сам (без облака и приложения): bar-шкала на каждый бак, трёхуровневый статус-бейдж (OK / Almost / FULL), журнал событий («Bin B FULL — dispatch pickup») и LED-выход, к которому вешается реальная лампа или зуммер. Пороги: предупреждение выше 75 %, тревога выше 90 %.

#include <RisalUI.h>
#include <RisalFake.h>                      // test with no hardware; remove when the sensor arrives

RisalUI dash("Trash Bins");

const float BIN_CM = 60;                    // sensor-to-bottom depth of the bin
float fill[3] = {35, 62, 88};               // fill % per bin
int   state[3] = {0, 0, 0};                 // 0 ok · 1 almost full · 2 full
bool  alarmOut = false;
LogWidget* evlog = nullptr;

void setup() {
  dash.layout("Bins", RICON_HOME);
  dash.gauge("Bin A - Park", &fill[0], 0, 100, "%").variant("bar");
  dash.gauge("Bin B - Market", &fill[1], 0, 100, "%").variant("bar");
  dash.gauge("Bin C - School", &fill[2], 0, 100, "%").variant("bar");
  dash.badge("A status", &state[0]).labels("OK", "Almost", "FULL");
  evlog = &dash.log("Events", 6);
  dash.led("Pickup needed", &alarmOut);
  dash.beginAP("RisalDash-Trash", "12345678");
}

void loop() {
  dash.update();
  // real bin: fill = 100.0 * (1.0 - pingCm() / BIN_CM);
  for (int i = 0; i < 3; i++) {
    int s = fill[i] > 90 ? 2 : (fill[i] > 75 ? 1 : 0);
    if (s == 2 && state[i] != 2 && evlog)
      evlog->print(String("Bin ") + char('A' + i) + " FULL - dispatch pickup");
    state[i] = s;
  }
  alarmOut = state[0] == 2 || state[1] == 2 || state[2] == 2;
}

Скетч работает как есть, ничего не подключая — три симулированных бака наполняются с разной скоростью и «вывозятся» при заполнении, так что пороги и алерты можно отладить сегодня же, а потом заменить одну строку на реальный pingCm(). Это и есть workflow фейк-сенсоров. Полный пример в библиотеке: examples/04_Templates/TrashBin.

Масштаб до района

Один ESP на бак (LoRa или Wi-Fi, где есть), либо один ESP на площадку с тремя баками, как в скетче. Каждый виджет — ещё и MCP-tool: ИИ-агент ответит «какие баки пора вывозить?» прямо от железа. Для парка баков тот же код публикуется в MQTT и автоматически появляется в Home Assistant.

Список компонентов

ДетальРоль~Цена
ESP32 DevKit (или ESP8266)мозг + Wi-Fi + дашборд$3–5
HC-SR04 / JSN-SR04Tуровень наполнения$1–4
LED + зуммер (опц.)индикатор «полный» на месте$1
18650 + TP4056 или БП 5 Впитание$2–4

Соберите весь дашборд сегодня — баки могут приехать позже.