Програмуємо ESP32 для контролю температури і вологості.

Пропонуємо переглянути і опанувати скетч для ESP32, в якому реалізовано підключення двох сенсорів - температури і вологості покази яких передаються на веб-сервер.

На основі них веб-сервер приймає рішення про увімкнення(вимкнення) виконавчих пристроїв, будує графіки, відображає стан системи. Також мікроконтроллер може вмикати виконавчі механізми в ручному режимі.

#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <HTTPClient.h>

const char* ssid = "TP-Link_FDDE";       // Ваша Wi-Fi мережа
const char* password = "55096201"; // Пароль Wi-Fi

// Статична IP-адреса та параметри мережі
IPAddress local_IP(192, 168, 1, 184);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);
IPAddress secondaryDNS(8, 8, 4, 4);

WebServer server(8080);

// Піни для керування реле та сервоприводом
const int gpioPin1 = 5;
const int gpioPin2 = 4;
const int servoPin = 18;
Servo myServo;
int currentAngle = 90;

// Підключення FC-28 (вологість ґрунту)
const int moisturePin = 34;  // A0 на ESP32

// Підключення DS18B20 (температура)
const int oneWireBus = 25;
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);

// URL сервера для передачі даних
const char* serverUrl = "http://159.224.167.221/ecoland/index.php";

void sendDataToServer() {
    sensors.requestTemperatures();
    float temperatureC = sensors.getTempCByIndex(0);
    int moistureValue = analogRead(moisturePin);

    Serial.print("Температура: ");
    Serial.print(temperatureC);
    Serial.print(" °C | Вологість ґрунту: ");
    Serial.println(moistureValue);

    HTTPClient http;
    String url = String(serverUrl) + "?temperature=" + temperatureC + "&moisture=" + moistureValue;
    
    http.begin(url);
    int httpResponseCode = http.GET();
    
    if (httpResponseCode > 0) {
        Serial.print("Дані відправлено, код відповіді: ");
        Serial.println(httpResponseCode);
    } else {
        Serial.print("Помилка відправки: ");
        Serial.println(httpResponseCode);
    }
    
    http.end();
}

void setup() {
    Serial.begin(115200);

    if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
        Serial.println("Неможливо налаштувати статичну IP");
    }

    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Підключення до Wi-Fi...");
    }
    Serial.println("Підключено до Wi-Fi");
    Serial.print("IP-адреса: ");
    Serial.println(WiFi.localIP());

    // Налаштування GPIO
    pinMode(gpioPin1, OUTPUT);
    pinMode(gpioPin2, OUTPUT);
    digitalWrite(gpioPin1, LOW);
    digitalWrite(gpioPin2, LOW);

    // Ініціалізація сервопривода
    myServo.attach(servoPin);
    myServo.write(currentAngle);

    // Ініціалізація датчиків
    sensors.begin();
    pinMode(moisturePin, INPUT);

    // Маршрути веб-сервера
    server.on("/left", []() {
        if (currentAngle > 60) {
            currentAngle -= 30;
            myServo.write(currentAngle);
        }
        server.send(200, "text/plain", "Servo moved left");
    });

    server.on("/right", []() {
        if (currentAngle < 120) {
            currentAngle += 30;
            myServo.write(currentAngle);
        }
        server.send(200, "text/plain", "Servo moved right");
    });

    server.on("/gpio1/on", []() {
        digitalWrite(gpioPin1, HIGH);
        server.send(200, "text/plain", "GPIO1 ON");
    });

    server.on("/gpio1/off", []() {
        digitalWrite(gpioPin1, LOW);
        server.send(200, "text/plain", "GPIO1 OFF");
    });

    server.on("/gpio2/on", []() {
        digitalWrite(gpioPin2, HIGH);
        server.send(200, "text/plain", "GPIO2 ON");
    });

    server.on("/gpio2/off", []() {
        digitalWrite(gpioPin2, LOW);
        server.send(200, "text/plain", "GPIO2 OFF");
    });

    server.begin();
    Serial.println("Веб-сервер запущено");
}

void loop() {
    server.handleClient();
    
    static unsigned long lastSendTime = 0;
    if (millis() - lastSendTime > 30000) {  // Відправляти дані кожні 30 секунд
        sendDataToServer();
        lastSendTime = millis();
    }
}