Uživatelské nástroje

Nástroje pro tento web


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>