#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
#include <ThingSpeak.h>
#include <DHT.h>
//VUON
#define pin_SDA 20
#define pin_SCL 21
LiquidCrystal_I2C lcd(0x27,20,4);
const int minValue = 1680;
const int maxValue = 3620;
#define IR_SENSOR_PIN 45
#define SOIL_SENSOR 46
const char* MQTT_ID = "59cdf1b9-3e1c-4596-a324-5df25100e3d9";
//AO
#define pH_pin 42
const float p_threshold = 5.5;
#define water_pin 14
#define relay_pin 17
const int w_threshold = 50;
const int myChannelNumber = 2697971;
const char* myApiKey = "MG2S6KKTD6KGB87K";
//CHUONG
#define DHTPIN 1
#define DHTTYPE DHT22
DHT dht(DHTPIN,DHTTYPE);
#define LIGHT_SENSOR_PIN 2
#define BUZZER 3
#define LED1 4
const char* MQTTServer = "broker.emqx.io";
int Port = 1883;
const char* MQTT_Topic = "Soil_IR";
const char* MQTT_Topic1 = "DHT";
const char* MQTT_Topic2 = "LDR";
WiFiClient espClient;
PubSubClient client(espClient);
void WIFIConnect() {
Serial.println("Connecting to SSID: Wokwi-GUEST");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void MQTT_Reconnect() {
while (!client.connected()) {
if (client.connect(MQTT_ID)) {
Serial.print("MQTT Topic: ");
Serial.print(MQTT_Topic);
Serial.println(" connected");
client.subscribe(MQTT_Topic);
Serial.print("MQTT Topic1: ");
Serial.print(MQTT_Topic1);
Serial.println(" connected");
client.subscribe(MQTT_Topic1);
Serial.print("MQTT Topic2: ");
Serial.print(MQTT_Topic2);
Serial.println(" connected");
client.subscribe(MQTT_Topic2);
Serial.println("");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WIFIConnect();
client.setServer(MQTTServer, Port);
//VUON
Wire.begin(pin_SDA, pin_SCL);
lcd.init();
lcd.backlight();
analogReadResolution(12);
lcd.print("HELLO NHI");
pinMode(IR_SENSOR_PIN, INPUT);
pinMode(SOIL_SENSOR, INPUT);
//AO
pinMode(pH_pin, INPUT);
pinMode(water_pin, INPUT);
pinMode(relay_pin, OUTPUT);
digitalWrite(relay_pin, LOW);
ThingSpeak.begin(espClient);
//CHUONG
pinMode(LIGHT_SENSOR_PIN, INPUT);
dht.begin();
pinMode(BUZZER, OUTPUT);
noTone(BUZZER);
pinMode(LED1, OUTPUT);
digitalWrite(LED1, LOW);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected! Reconnecting...");
WIFIConnect();
}
if (!client.connected()) {
MQTT_Reconnect();
}
client.loop();
bc();
publishData();
ao();
delay(10000);
}
void bc() {
float giatri = analogRead(35);
int i = analogRead(34);
float lux = giatri/4095*1000;
float da = (float)(i - minValue) / (maxValue - minValue) * 100;
String chuoiDuLieu = "{\"dat\":\"" + String(da) + "\",\"ir\":\"" + String(lux) + "\"}";
Serial.println(chuoiDuLieu);
if (client.publish(MQTT_Topic, (char*)chuoiDuLieu.c_str())) {
Serial.println("Dữ liệu gửi thành công!");
} else {
Serial.println("Gửi dữ liệu thất bại!");
}
String msg = da < 30 ? "KHO" : da > 70 ? "AM UOT" : "PHU HOP";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Trang thai: ");
lcd.print(msg);
lcd.setCursor(0, 1);
lcd.print("Do am dat: ");
lcd.print(da, 2);
lcd.print("%");
if (da < 30 || da > 70) {
tone(BUZZER, 1000, 500);
} else {
digitalWrite(BUZZER, LOW);
}
lcd.setCursor(0, 2);
lcd.print("Gia tri: ");
lcd.print(lux);
if (lux > 500) {
digitalWrite(LED1, HIGH);
lcd.setCursor(0, 3);
lcd.print("Co vat the");
} else {
digitalWrite(LED1, LOW);
lcd.setCursor(0, 3);
lcd.print("Khong co vat the");
}
delay(5000);
}
void ao() {
int pHValue = analogRead(pH_pin);
//float pHVal = map(pHValue, 0, 4095, 0, 14);
int pHVal = random(0, 15);
int waterValue = analogRead(water_pin);
//float waterPercentage = map(waterValue, 0, 4095, 0, 100);
int waterPercentage = random(0, 100);
Serial.print("pH: ");
Serial.println(pHVal);
Serial.print("Water Value: ");
Serial.print(waterPercentage);
Serial.println("%");
if (pHVal < p_threshold) {
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
}
ThingSpeak.setField(1, pHVal);
ThingSpeak.setField(2, waterPercentage);
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
if (waterPercentage > w_threshold) {
digitalWrite(relay_pin, HIGH);
Serial.println("Relay ON");
} else {
digitalWrite(relay_pin, LOW);
Serial.println("Relay OFF");
}
if (x == 200) {
Serial.println("GUI DU LIEU THANH CONG!");
} else {
Serial.println("LOI: " + String(x));
}
Serial.println("---KET THUC VIEC GUI---");
ThingSpeak.writeField(myChannelNumber, 1, pHVal, myApiKey);
ThingSpeak.writeField(myChannelNumber, 2, waterPercentage, myApiKey);
}
void publishData() {
float temp = dht.readTemperature(); // Nhiệt độ (°C)
float hum = dht.readHumidity(); // Độ ẩm (%)
float ldr = analogRead(33);
float lux1 = 1000 * (4095.0 - ldr) / 4095.0;
String chuoiDuLieu1 = "{\"nd\":\"" + String(temp) + "\",\"da\":\"" + String(hum) + "\"}";
Serial.println(chuoiDuLieu1);
if (client.publish(MQTT_Topic1, (char*)chuoiDuLieu1.c_str())) {
Serial.println("Dữ liệu gửi thành công!");
} else {
Serial.println("Gửi dữ liệu thất bại!");
}
String chuoiDuLieu2 = "{\"as\":\"" + String(lux1) + "\"}";
Serial.println(chuoiDuLieu2);
if (client.publish(MQTT_Topic2, (char*)chuoiDuLieu2.c_str())) {
Serial.println("Dữ liệu gửi thành công!");
} else {
Serial.println("Gửi dữ liệu thất bại!");
}
// Hiển thị trên LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nhiet do: "); lcd.print(temp,2); lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Do am: "); lcd.print(hum,2); lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Anh sang: "); lcd.print(lux1,2); lcd.print("Lux");
// Điều khiển LED2 (LDR ánh sáng < 600 lux)
if (lux1 < 600) {
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
}
// Điều khiển BUZZER2 (độ ẩm ngoài khoảng 40% - 70%)
if (hum < 40 || hum > 70) {
tone(BUZZER, 1000, 500);
} else {
digitalWrite(BUZZER, LOW);
}
// Điều khiển LED3 (nhiệt độ ngoài khoảng 18°C - 30°C)
if (temp < 18 || temp > 30) {
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
}
// Delay 5 giây trước khi đọc lại
delay(5000);
}