Пропонуємо переглянути і опанувати скетч для 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();
}
} 
