#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PW ""
#define MQTT_SERVER "broker.mqtt-dashboard.com"
#define MQTT_PORT 1883
#define MQTT_USER "Alex"
#define MQTT_PASSWORD "Alex1"
#define DHTPIN 16
#define DHTTYPE DHT22
#define BUTTON_PIN 33
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 2 * 3600
#define UTC_OFFSET_DST 3600
const int LED_PINS[] = {27, 26, 25}; // Зміна масиву LED_PINS на константний
const int LED_COUNT = sizeof(LED_PINS) / sizeof(LED_PINS[0]);
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo servo1, servo2;
DHT dht(DHTPIN, DHTTYPE);
bool leds_state[LED_COUNT] = {0}; // Масив стану світлодіодів
int led_flag = 0;
float humidity, temperature;
void setupWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PW);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void setupMQTT() {
client.setServer(MQTT_SERVER, MQTT_PORT);
while (!client.connected()) {
client.connect("ESP_GM", MQTT_USER, MQTT_PASSWORD);
}
client.subscribe("button");
client.subscribe("pz1");
client.subscribe("pz2");
client.subscribe("pz3");
client.subscribe("rs1");
client.subscribe("rs2");
}
void setupLCD() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Connecting to WiFi...");
delay(1000);
lcd.clear();
}
void blinkStatus() {
static unsigned long prevMillis = 0;
if (millis() - prevMillis >= 1000) {
prevMillis = millis();
lcd.setCursor(19, 0);
lcd.write(WiFi.status() == WL_CONNECTED ? 0 : 1);
lcd.setCursor(18, 0);
lcd.write(client.connected() ? 2 : 3);
}
}
void readDHT() {
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (!isnan(humidity) && !isnan(temperature)) {
client.publish("hum", String(humidity).c_str());
client.publish("temp", String(temperature).c_str());
lcd.setCursor(0, 2);
lcd.print("Temp:" + String(temperature, 1) + "C Hum:" + String(humidity) + "%");
}
}
void setServoPositions() {
int pos1 = map(temperature, 0, 100, 0, 180);
int pos2 = map(humidity, 0, 100, 0, 180);
Serial.print("Setting Servo1 to: ");
Serial.println(pos1);
servo1.write(pos1);
client.publish("sr1", String(pos1).c_str());
lcd.setCursor(0, 3);
lcd.print("Servo1:" + String(pos1));
Serial.print("Setting Servo2 to: ");
Serial.println(pos2);
servo2.write(pos2);
client.publish("sr2", String(pos2).c_str());
lcd.setCursor(10, 3);
lcd.print("Servo2:" + String(pos2));
}
void controlLEDs() {
leds_state[led_flag] = !leds_state[led_flag]; // Змінюємо стан світлодіода
digitalWrite(LED_PINS[led_flag], leds_state[led_flag]); // Зміна стану світлодіода
led_flag = (led_flag + 1) % LED_COUNT; // Перейти до наступного світлодіода
}
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) message += (char)payload[i];
if (String(topic) == "button" && message == "1") {
controlLEDs();
}
}
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
for (int pin : LED_PINS) pinMode(pin, OUTPUT);
setupWiFi();
setupMQTT();
setupLCD();
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
client.setCallback(callback);
servo1.attach(18);
servo2.attach(5);
}
void loop() {
client.loop();
blinkStatus();
// Читання стану кнопки
if (digitalRead(BUTTON_PIN) == LOW) { // Якщо кнопка натиснута
delay(200); // Затримка для уникнення шуму
if (digitalRead(BUTTON_PIN) == LOW) { // Перевірка ще раз
controlLEDs(); // Керуємо світлодіодами
while (digitalRead(BUTTON_PIN) == LOW); // Чекаємо, поки кнопку відпустять
}
}
readDHT();
setServoPositions();
}