Loyiha · Ob-havo · Koʻcha
Chindan oʻzingizniki boʻlgan toʻliq meteostansiya
Haqiqiy meteostansiya — bitta ichida ikkita yigʻilma: oson uy yarmi — BME280 + yorugʻlik — va yomgʻir oʻlchagich, anemometr va UV bilan koʻcha machtasi. Bu qoʻllanmada ikkalasi bitta ESP32’da, jonli «Ochiq / Bulutli / Yomgʻir» statusi, boʻron va issiqlik alertlari va chip oʻzi beradigan dashboard bilan — ob-havo bulutisiz, maʼlumotlaringiz oʻzingizniki.
Sensorlar — nima nimani oʻlchaydi
| Sensor | Oʻlchaydi | Interfeys | Izoh |
|---|---|---|---|
| BME280 | harorat · namlik · bosim | I²C | yadro — bosim trendi yomgʻirni bashorat qiladi |
| Agʻdarma chelakcha | yogʻin (mm) | impuls | har agʻdarilish = belgilangan hajm |
| Anemometr kosachalari | shamol / shiddat | impuls (interrupt) | gerkon, aylanishiga bir marta |
| Flyuger | yoʻnalish | analog | har rumbga rezistor zinasi |
| GY-ML8511 | UV-indeks | analog | quyosh taʼsiri |
| LDR / BH1750 | yorugʻlik (lx) | analog / I²C | kun/tun mantigʻini boshqaradi |
BME280 har qanday I²C sensor kabi ulanadi — SDA/SCL va quvvat. Impulsli sensorlar (yomgʻir, shamol) — interrupt GPIO’larga; flyuger, UV va LDR — ADC pinlarga.
Shamolni sanash — loop emas, interrupt
Anemometr aylanishiga bir marta gerkonni yopadi. Loop’da soʻrasangiz, dashboard nafas olishi bilan hisob yoʻqoladi — shuning uchun interrupt’da sanab, soniyada bir konvertatsiya qilamiz:
// 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) Dashboard — machtani bitta preset yopadi
dash.sensor("weather", …) toʻliq anemometr + flyuger + chelakcha toʻplamiga toʻgʻri
birlik va diapazonlar bilan ochiladi; qolgani — shkala, beyj va jurnal:
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"); Status va alertlar — oz mantiq, koʻp foyda
«Yomgʻir yogʻyaptimi?» — bu shunchaki tiklayotgan yogʻin hisoblagichi. «Bulutlimi?» — chegaradan past yorugʻlik. Boʻron shiddat yoki jazirama alert-LED’ni yoqadi (oʻsha pinga zummer ulanadi) va jurnalga yozadi:
// 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; Kutubxonadagi namuna (examples/04_Templates/WeatherStation) hammasini temirsiz yuritadi: shiddatli shamol, oʻtayotgan jalalar, virtual quyoshga ergashgan UV va yorugʻlik. Bugunoq «Rain» beyji va boʻron alerti ishlashini koʻring, keyin fake’larni real drayverlarga sensorma-sensor almashtiring — fake-sensor workflow.
Oʻstirish
Deep sleep va LiFePO4
qoʻshing — oylab ishlaydigan quyosh machtasi; oʻz oʻlchovlaringiz yoniga jonli Open-Meteo prognozini
torting (kutubxonaning RisalWeather.h, kalitsiz); Home Assistant uchun
MQTT ga publish qiling. Stol ekrani uchun
displey qoʻllanmasidagi istalgan ekran oʻsha
oʻzgaruvchilardan ishlaydi.
Butun stansiya bugun fake’larda ishlaydi — machta sensorma-sensor kelsin.