#include <WiFi.h>
#include <HTTPClient.h>
#include <driver/adc.h>
// Definujte vaše WiFi přihlašovací údaje
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
// Definujte analogové vstupy pro rychlost a směr větru
const int windSpeedPin = ADC1_CHANNEL_6; // GPIO34
const int windDirectionPin = ADC1_CHANNEL_7; // GPIO35
// Rozsah 0-20mA převodníku na napětí (předpokládáme 0-3.3V rozsah ESP32)
const float currentRange = 20.0; // mA
const float voltageRange = 3.3; // V
const float adcMaxValue = 4095.0; // ADC maximální hodnota pro 12-bitový převodník
// Převodní konstanty pro rychlost a směr větru
const float maxWindSpeed = 50.0; // Maximální rychlost větru v m/s (upravte podle specifikace senzoru)
const float maxWindDirection = 360.0; // Maximální směr větru v stupních
// Časové intervaly
const unsigned long measurementInterval = 1000; // 1 sekunda
const unsigned long gustInterval = 60000; // 1 minuta
const unsigned long averageInterval = 300000; // 5 minut
unsigned long lastMeasurementTime = 0;
unsigned long lastGustTime = 0;
unsigned long lastAverageTime = 0;
const int numGustMeasurements = gustInterval / measurementInterval;
const int numAverageMeasurements = averageInterval / measurementInterval;
float windSpeedReadings[numAverageMeasurements];
int currentIndex = 0;
float maxGustSpeed = 0;
void setup() {
Serial.begin(115200);
connectToWiFi();
// Nastavení ADC pinu
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11); // GPIO34
adc1_config_channel_atten(ADC1_CHANNEL_7, ADC_ATTEN_DB_11); // GPIO35
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastMeasurementTime >= measurementInterval) {
lastMeasurementTime = currentTime;
// Čtení analogových hodnot
int rawSpeedValue = adc1_get_raw(windSpeedPin);
int rawDirectionValue = adc1_get_raw(windDirectionPin);
// Převod na mA (předpokládáme lineární převodník 0-20mA na 0-3.3V)
float windSpeedCurrent = (rawSpeedValue / adcMaxValue) * currentRange;
float windDirectionCurrent = (rawDirectionValue / adcMaxValue) * currentRange;
// Převod mA na rychlost a směr větru
float windSpeed = (windSpeedCurrent / currentRange) * maxWindSpeed;
float windDirection = (windDirectionCurrent / currentRange) * maxWindDirection;
// Uložení aktuální rychlosti do pole
windSpeedReadings[currentIndex] = windSpeed;
currentIndex = (currentIndex + 1) % numAverageMeasurements;
// Aktualizace nárazu větru
if (windSpeed > maxGustSpeed) {
maxGustSpeed = windSpeed;
}
// Výstup aktuálních hodnot do sériové konzole
Serial.print("Rychlost větru: ");
Serial.print(windSpeed);
Serial.print(" m/s, Směr větru: ");
Serial.print(windDirection);
Serial.println(" stupňů");
}
if (currentTime - lastGustTime >= gustInterval) {
lastGustTime = currentTime;
// Výstup nárazu větru do sériové konzole
Serial.print("Nárazy větru za poslední minutu: ");
Serial.print(maxGustSpeed);
Serial.println(" m/s");
// Uložení nárazu větru každých 5 minut
if (currentTime - lastAverageTime >= averageInterval) {
lastAverageTime = currentTime;
// Výpočet průměrné rychlosti větru
float averageWindSpeed = calculateAverageSpeed();
// Výstup průměrné rychlosti a nárazu větru do sériové konzole
Serial.print("Průměrná rychlost větru za posledních 5 minut: ");
Serial.print(averageWindSpeed);
Serial.print(" m/s, Nárazy větru: ");
Serial.print(maxGustSpeed);
Serial.println(" m/s");
// Resetování nárazu větru
maxGustSpeed = 0;
}
}
}
void connectToWiFi() {
Serial.print("Připojování k ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi připojeno");
Serial.print("IP adresa: ");
Serial.println(WiFi.localIP());
}
float calculateAverageSpeed() {
float sum = 0;
for (int i = 0; i < numAverageMeasurements; i++) {
sum += windSpeedReadings[i];
}
return sum / numAverageMeasurements;
}