RisalDash RisalDash

مشروع · مدينة ذكيّة · مراقبة

حاوية قمامة ذكيّة تستدعي الشاحنة بنفسها

شاحنة تزور حاويات نصف فارغة تحرق الوقود؛ وحاوية تفيض تصنع فوضى. الحلّ حسّاس فوق صوتيّ بدولارين على الغطاء مع ESP32: قِس امتلاء كلّ حاوية، واعرض كلّ المواقع على لوحة واحدة، وارفع تنبيهًا لحظة حاجة الحاوية للتفريغ. إليك البناء كاملًا — ويمكنك تشغيله أوّلًا بلا أيّ عتاد إطلاقًا.

مشروعمدينة ذكيّةHC-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 الواجهة كاملةً بنفسه (بلا سحابة ولا تطبيق): مقياس شريطيّ لكلّ حاوية، وشارة حالة ثلاثيّة (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() الحقيقيّ. هذا هو أسلوب الحسّاسات الوهميّة. المثال الكامل مع المكتبة: examples/04_Templates/TrashBin.

التوسّع إلى حيّ كامل

ESP لكلّ حاوية (LoRa أو Wi-Fi حيث يتوفّر)، أو ESP واحد لكلّ موقع يراقب ثلاث حاويات كما في الكود. كلّ أداة هي أيضًا أداة MCP — فيجيب وكيل ذكاء اصطناعيّ عن «أيّ الحاويات تحتاج تفريغًا؟» مباشرةً من العتاد. وللأسطول ينشر الكود نفسه إلى MQTT ويظهر في Home Assistant تلقائيًّا.

قائمة المكوّنات

القطعةالدور~التكلفة
ESP32 DevKit (أو ESP8266)الدماغ + Wi-Fi + اللوحة$3–5
HC-SR04 / JSN-SR04Tمستوى الامتلاء$1–4
LED + جرس (اختياريّ)مؤشّر «ممتلئ» في الموقع$1
18650 + TP4056 أو مزوّد 5 Vالطاقة$2–4

صمّم اللوحة كاملةً الليلة — ولتصل الحاويات لاحقًا.