RisalDash RisalDash

مشروع · طقس · خارجيّ

محطّة طقس كاملة تملكها فعلًا

محطّة الطقس الحقيقيّة بناءان في واحد: نصف داخليّ سهل — BME280 + الضوء — وصارية خارجيّة بـ مقياس مطر وأنيمومتر وحسّاس UV. هذا الدليل يبني الاثنين على ESP32 واحد، مع قراءة حيّة «صحو / غائم / مطر»، وتنبيهات عاصفة وحرّ، ولوحة يقدّمها الشريحة بنفسها — بلا حساب سحابة طقس، بياناتك تبقى لك.

مشروعطقسBME280أنيمومترESP32
مشروع محطّة طقس بـ ESP32: رياح ومطر وUV وضوء وBME280 وتنبيهات عاصفة

الحسّاسات — ماذا يقيس كلّ واحد

الحسّاسيقيسالواجهةملاحظة
BME280حرارة · رطوبة · ضغطI²Cالأساس — اتجاه الضغط يتنبّأ بالمطر
الدلو القلّابالأمطار (مم)نبضةكلّ قلبة = حجم ثابت
أكواب الأنيمومترسرعة الرياح / الهبّاتنبضة (مقاطعة)مفتاح ريد، مرّة كلّ دورة
دوّارة الرياحالاتجاهتناظريّسلّم مقاومات لكلّ جهة
GY-ML8511مؤشّر UVتناظريّالتعرّض للشمس
LDR / BH1750الضوء (لوكس)تناظريّ / I²Cيقود منطق النهار/الليل

يُوصَّل BME280 كأيّ حسّاس I²C — SDA/SCL مع الطاقة. حسّاسات النبض (المطر والرياح) على أطراف تدعم المقاطعات؛ والدوّارة وUV وLDR على أطراف ADC.

BME280 موصّل بـ ESP32 عبر I²C
النصف الداخليّ 4 أسلاك. مبنيّ في BoardLab.

عدّ الرياح — مقاطعة لا loop

يغلق الأنيمومتر مفتاح ريد مرّة كلّ دورة. إن استطلعته في loop ضاع العدّ لحظة انشغال اللوحة — فاعدُد في مقاطعة وحوّل مرّة كلّ ثانية:

// Anemometer: a reed switch pulses once per rotation -> count on an interrupt.
volatile uint32_t pulses = 0;
void IRAM_ATTR onPulse() { pulses++; }
// setup: pinMode(WIND_PIN, INPUT_PULLUP); attachInterrupt(WIND_PIN, onPulse, FALLING);
// each second: wind = pulses * KMH_PER_HZ; pulses = 0;   (KMH_PER_HZ from the cup datasheet)

اللوحة — إعداد واحد يغطّي الصارية

dash.sensor("weather", …) يتمدّد إلى طقم الأنيمومتر + الدوّارة + دلو المطر كاملًا بالوحدات والمديات الصحيحة؛ والباقي مقياس وشارة وسجلّ:

dash.layout("Weather", RICON_WATER);
dash.sensor("weather", &wind, &gust, &dir, &rain); // anemometer · vane · rain preset
dash.gauge("UV index", &uv, 0, 12);
dash.badge("Conditions", &sky).labels("Clear", "Cloudy", "Rain");
dash.led("Weather alert", &alarmOut);              // red LED + buzzer outside
evlog = &dash.log("Alerts", 5);

dash.layout("Ambient", RICON_THERMOMETER);
dash.sensor("bme280", &temp, &hum, &pres).chart(); // T / RH / hPa with history
dash.metric("Light", &lux, "lx");                  // LDR or BH1750
dash.beginAP("RisalDash-Weather", "12345678");

الحالة والتنبيهات — منطق قليل وأثر كبير

«هل تمطر؟» هو مجرّد عدّاد المطر وهو يزيد. «غائم؟» — ضوء النهار تحت عتبة. هبّة عاصفة أو حرّ شديد يُشعلان ليد التنبيه (اربط جرسًا على الطرف نفسه) ويكتبان سطرًا في السجلّ:

// Conditions: raining if the bucket is ticking, else clear vs dim by daylight.
bool raining = rain - rainPrev > 0.01f;
rainPrev = rain;
sky = raining ? 2 : (lux < 8000 ? 1 : 0);

// Alerts: a storm gust or extreme heat trips the LED/buzzer + a log line.
bool trip = gust > 60 || temp > 40;
if (trip && !alarmOut && evlog)
  evlog->print(gust > 60 ? "STORM - gusts over 60 km/h" : "HEAT - over 40 C");
alarmOut = trip;

المثال المرفق (examples/04_Templates/WeatherStation) يشغّل كلّ هذا بلا عتاد: رياح هبّابة، وزخّات عابرة تتراكم، وUV وضوء يتبعان شمسًا افتراضيّة. شاهد الليلة شارة «Rain» وتنبيه العاصفة يعملان، ثمّ بدّل الوهميّات بالمشغّلات الحقيقيّة حسّاسًا حسّاسًا — أسلوب الحسّاسات الوهميّة.

كبِّرها

أضِف النوم العميق وخليّة LiFePO4 لصارية شمسيّة تعمل شهورًا؛ واسحب توقّع Open-Meteo حيًّا (ملفّ المكتبة RisalWeather.h، بلا مفتاح) بجانب قراءاتك؛ أو انشر إلى MQTT لـ Home Assistant. ولشاشة المكتب تعمل أيّ شاشة من دليل الشاشات من المتغيّرات نفسها.

المحطّة كلّها تعمل على الوهميّات اليوم — ولتصل الصارية حسّاسًا بعد حسّاس.