ruzne:lolin_d32_teplota_vlhkost_a_tlak_vzduchu_srazkomer_smer_a_sila_vetru
Meteostanice s Lolin D32
Autor: Jakub Mareš jakubmares.214@outlook.cz
Měřené veličiny: teplota, vlhkost a tlak vzduchu, srážkoměr, směr a síla větru
Komponenty
Zapojení
Kód
- Meteostanice_ESP32.ino
====== Meteostanice s Lolin D32 ====== **Autor:** Jakub Mareš [[jakubmares.214@outlook.cz]]\\ **Měřené veličiny:** teplota, vlhkost a tlak vzduchu, srážkoměr, směr a síla větru ===== Komponenty ===== * [[https://www.neven.cz/kategorie/elektronicke-soucastky/elektronicky-vyvoj/vyvojove-desky/ostatni/lolin-d32-esp-wroom-32-2-4ghz-vyvojarska-deska-s-wifi-bt/?|Lolin D32]] * [[https://www.laskakit.cz/arduino-senzor-tlaku--teploty-a-vlhkosti-bme280/[|LaskaKit BME280 Senzor tlaku, teploty a vlhkosti vzduchu]] * [[https://www.laskakit.cz/sada-cidel-k-meteo-wh1080-a-wh1090/|Sada čidel k meteostanicím WH1080 a WH1090]] ===== Zapojení ===== {{:ruzne:pasted:20240923-135319.png}} ===== Kód ===== <file c Meteostanice_ESP32.ino> #include <WiFi.h> #include <HTTPClient.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <BH1750.h> #include <SparkFun_Weather_Meter_Kit_Arduino_Library.h> #include <WiFiManager.h> #define BMESDAPin 21 #define BMESCLPin 22 #define rainSensorPin 25 #define windSpeedSensorPin 14 #define windDirectionPin 35 #define BME280_ADDRESS 0x76 const char* domain1 = "http://domena1.tmep.cz/"; // Odesílání teploty, vlhkosti a tlaku const char* domain2 = "http://domena2.tmep.cz/"; // Odesílání rychlosti větru a směru const char* domain3 = "http://domena3.tmep.cz/"; // Odesílání srážek const char* domain4 = "http://domena4.tmep.cz/"; // Odesílání viditelného světla Adafruit_BME280 bme; BH1750 lightSensor; SFEWeatherMeterKit weatherMeterKit(windDirectionPin, windSpeedSensorPin, rainSensorPin); #define NO_RAIN_SAMPLES 2000 volatile long rainTickList[NO_RAIN_SAMPLES]; volatile int rainTickIndex = 0; volatile int rainTicks = 0; int rainLastHour = 0; int rainLastDay = 0; long secsClock = 0; unsigned long previousMillis = 0; const long interval = 60000; // 1 minuta void WiFiConnection() { WiFi.mode(WIFI_STA); WiFiManager wm; wm.setConfigPortalTimeout(180); bool res = wm.autoConnect("Meteo214", "meteostation"); if (!res) { Serial.println("Nepodařilo se připojit k WiFi. Přejdu do restartu."); ESP.restart(); // Restart místo hlubokého spánku } else { Serial.println("Připojeno k WiFi."); Serial.print("IP adresa: "); Serial.println(WiFi.localIP()); } } void setup() { Serial.begin(115200); Wire.begin(BMESDAPin, BMESCLPin); WiFiConnection(); if (!bme.begin(BME280_ADDRESS)) { Serial.println("Nemohu najít BME280 - zkontroluj zapojení!"); return; } Serial.println("BME280 inicializován."); lightSensor.begin(); Serial.println("Senzor BH1750 inicializován."); weatherMeterKit.begin(); Serial.println("Meteostanice v chodu"); // Inicializace senzoru srážek pinMode(rainSensorPin, INPUT); attachInterrupt(digitalPinToInterrupt(rainSensorPin), rainTick, FALLING); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // Čtení dat ze senzorů float tlak = bme.readPressure() / 100.0F; float teplota = bme.readTemperature(); float vlhkost = bme.readHumidity(); float viditelneSvetlo = lightSensor.readLightLevel(); float mnozstviSrazek = weatherMeterKit.getTotalRainfall(); float rychlostVetra = weatherMeterKit.getWindSpeed(); int smerVetra = weatherMeterKit.getWindDirection(); int rssi = WiFi.RSSI(); // Počítání srážek za poslední hodinu a den rainLastHour = 0; rainLastDay = 0; if (rainTicks > 0) { int i = rainTickIndex - 1; // Počítání srážek za poslední hodinu while ((rainTickList[i] >= secsClock - 3600) && rainTickList[i] != 0) { i--; if (i < 0) i = NO_RAIN_SAMPLES - 1; rainLastHour++; } // Počítání srážek za poslední den i = rainTickIndex - 1; while ((rainTickList[i] >= secsClock - 86400) && rainTickList[i] != 0) { i--; if (i < 0) i = NO_RAIN_SAMPLES - 1; rainLastDay++; } } // Odesílání dat if (WiFi.status() == WL_CONNECTED) { HTTPClient http; String url1 = String(domain1) + "send?temperature=" + String(teplota, 1) + "&humidity=" + String(vlhkost, 1) + "&pres=" + String(tlak, 1) + "&rssi=" + String(rssi); http.begin(url1); http.GET(); http.end(); String url2 = String(domain2) + "?winds=" + String(rychlostVetra, 1) + "&windd=" + String(smerVetra) + "&rssi=" + String(rssi); http.begin(url2); http.GET(); http.end(); String url3 = String(domain3) + "?rain=" + String(mnozstviSrazek, 1) + "&rainLastHour=" + String(float(rainLastHour) * 0.0001, 3) + "&rainLastDay=" + String(float(rainLastDay) * 0.0001, 3) + "&rssi=" + String(rssi); http.begin(url3); http.GET(); http.end(); String url4 = String(domain4) + "?visible=" + String(viditelneSvetlo, 1) + "&rssi=" + String(rssi); http.begin(url4); http.GET(); http.end(); } } } // Funkce pro sledování srážek void rainTick(void) { rainTickList[rainTickIndex++] = secsClock; if (rainTickIndex == NO_RAIN_SAMPLES) rainTickIndex = 0; rainTicks++; secsClock++; // Inkrementuj čas }
</file>