#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <cstring>
const char* ssid = "HoanBao.Co";
const char* password = "1277212016";
// const char* ssid = "Wokwi-GUEST";
// const char* password = "";
//***Set server***
const char* mqttServer = "test.mosquitto.org";
int port = 1883;
const char* event_name = "push_notification_2";
const char* ifttt_key = "h3TN_h-W-AGqUTDJgwj2CTvRx08zgProKvCW9VG-PL2";
bool hasPublished = false;
bool hasNotified = false;
const int pinRelayPump = 23;
#include <Arduino.h>
const int trigPin1 = 2; // Chân Trig cho cảm biến 1
const int echoPin1 = 4; // Chân Echo cho cảm biến 1
const int trigPin2 = 13; // Chân Trig cho cảm biến 2
const int echoPin2 = 14; // Chân Echo cho cảm biến 2
#include <DHT.h>
#define DHTPIN 4 // Thay đổi số chân GPIO nếu cần
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
// Định nghĩa chân cảm biến
// #define RAIN_SENSOR_PIN 34
const int RAIN_SENSOR_PIN = 35;
const int LIGHT_SENSOR_PIN = 34;
// #define LIGHT_SENSOR_PIN 35
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
void wifiConnect() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
}
void mqttConnect() {
while(!mqttClient.connected()) {
Serial.println("Attemping MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if(mqttClient.connect(clientId.c_str())) {
Serial.println("connected");
//***Subscribe all topic you need***
mqttClient.subscribe("21127197/nodered");
mqttClient.subscribe("21127197/pump_pub");
}
else {
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void publishBool(String pub, String field ,bool value) {
// Chuyển đối tượng thành chuỗi JSON
DynamicJsonDocument jsonDoc(200);
jsonDoc[field] = value;
String jsonString;
serializeJson(jsonDoc, jsonString);
// Publish chuỗi JSON lên MQTT
mqttClient.publish(pub.c_str(), jsonString.c_str());
}
int relay_pump(){
Serial.println("jump to relay pump");
digitalWrite(pinRelayPump, HIGH);
delay(3000);
digitalWrite(pinRelayPump, LOW);
publishBool("21127197/pump_sub", "pump", false);
return 0;
}
//MQTT Receiver
void callback(char* topic, byte* message, unsigned int length) {
Serial.println(topic);
String strMsg;
for(int i=0; i<length; i++) {
strMsg += (char)message[i];
}
Serial.println(strMsg);
//***Code here to process the received package***
if(strcmp(topic, "21127197/pump_pub") == 0){
// Serial.println("1");
if(strMsg == "true"){
relay_pump();
}
}
}
float readHumidity() {
// Đọc giá trị độ ẩm từ cảm biến
float humidity = dht.readHumidity();
// Kiểm tra xem đọc giá trị có thành công không
if (isnan(humidity)) {
Serial.println("Không thể đọc dữ liệu từ cảm biến độ ẩm!");
return -1; // Hoặc một giá trị lỗi mà bạn muốn
} else {
Serial.print("humid sensor: ");
Serial.println(humidity);
return humidity;
}
}
// Hàm đọc cảm biến mưa
float readRainSensor() {
float sensorValue = analogRead(RAIN_SENSOR_PIN);
// Chuyển đổi giá trị analog thành giá trị mưa phù hợp
// Ví dụ: Mưa càng nặng, giá trị analog càng thấp
// float rain = map(sensorValue, 0, 1023, 100, 0);
Serial.print("rain sensor: ");
Serial.println(sensorValue);
return sensorValue;
}
// Hàm đọc cảm biến ánh sáng
float readLightSensor() {
float sensorValue = analogRead(LIGHT_SENSOR_PIN);
// Chuyển đổi giá trị analog thành giá trị ánh sáng
// float light = map(sensorValue, 0, 1023, 0, 100);
Serial.print("light sensor: ");
Serial.println(analogRead(LIGHT_SENSOR_PIN));
return analogRead(LIGHT_SENSOR_PIN);
}
bool readUltrasonicDistance() {
//-----------------------------------2 ultrasonic
// Cảm biến 1
digitalWrite(trigPin1, LOW);
delayMicroseconds(2);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
long duration1 = pulseIn(echoPin1, HIGH);
int distance1 = duration1 * 0.034 / 2;
// Cảm biến 2
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
long duration2 = pulseIn(echoPin2, HIGH);
int distance2 = duration2 * 0.034 / 2;
// In kết quả
Serial.print("Distance1: ");
Serial.println(distance1);
Serial.print("Distance2: ");
Serial.println(distance2);
if(distance1 <= 20 || distance2 <= 20){
Serial.println("quay servo");
return true;
}
return false;
}
void publishSensorData(float humid, float rain, float light, bool ultra) {
hasPublished = false;
// Chuyển đối tượng thành chuỗi JSON
// StaticJsonDocument<200> jsonDoc;
DynamicJsonDocument jsonDoc(200);
jsonDoc["humid"] = humid;
jsonDoc["rain"] = rain;
jsonDoc["light"] = light;
jsonDoc["ultra"] = ultra;
String jsonString;
serializeJson(jsonDoc, jsonString);
// Publish chuỗi JSON lên MQTT
mqttClient.publish("21127197/device", jsonString.c_str());
}
void sendIFTTTRequest(String notify) {
// Đối tượng JSON document để chứa dữ liệu
DynamicJsonDocument jsonDoc(200);
jsonDoc["value1"] = notify; // Thay đổi giá trị tùy thuộc vào nhu cầu của bạn
// Chuyển đối tượng thành chuỗi JSON
String jsonString;
serializeJson(jsonDoc, jsonString);
Serial.println("JSON String: " + jsonString); // In ra chuỗi JSON để kiểm tra
// Bắt đầu kết nối HTTP
HTTPClient http;
String url = "https://maker.ifttt.com/trigger/push_notification_2/with/key/h3TN_h-W-AGqUTDJgwj2CTvRx08zgProKvCW9VG-PL2";
http.begin(url);
http.addHeader("Content-Type", "application/json");
String json = "{\"value1\":\"Test\"}";
// Gửi yêu cầu POST với dữ liệu JSON
int httpResponseCode = http.POST(jsonString);
// Đọc và in ra phản hồi từ Webhooks
String response = http.getString();
Serial.println("HTTP Response Code: " + String(httpResponseCode));
Serial.println("Response: " + response);
// Kết thúc kết nối HTTP
http.end();
}
unsigned long lastReadTime = 0; // Lưu thời điểm đọc cuối cùng
const unsigned long readInterval = 7000; // Một giờ = 3600000 mili giây
void setup() {
Serial.begin(9600);
Serial.print("Connecting to WiFi");
dht.begin();
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(LIGHT_SENSOR_PIN, INPUT);
pinMode(RAIN_SENSOR_PIN, INPUT);
wifiConnect();
mqttClient.setServer(mqttServer, port);
mqttClient.setCallback(callback);
mqttClient.setKeepAlive( 90 );
hasPublished = true;
// --------------------------------
pinMode(pinRelayPump, OUTPUT);
}
void loop() {
bool obstacle = false;
if(!mqttClient.connected()) {
mqttConnect();
}
mqttClient.loop();
//***Publish data to MQTT Server***
// mqttClient.publish("21127197/device", "Hello Server");
unsigned long currentTime = millis();
bool ultras = readUltrasonicDistance();
// float light = readLightSensor();
// sireadLightSensor();
// Serial.println("ultra");
// bool obstacle = false;
if(ultra <= 25){
obstacle = true;
Serial.println("quay servo!!!");
}
// Kiểm tra nếu đã trôi qua đủ một giờ
if (currentTime - lastReadTime >= readInterval) {
float humid = readHumidity();
float rain = readRainSensor();
float light = readLightSensor();
// Sử dụng giá trị humid ở đây
lastReadTime = currentTime; // Cập nhật thời điểm đọc cuối cùng
publishSensorData(humid, rain, light, ultras);
}
if(!hasNotified){
sendIFTTTRequest("Nhiệt độ quá cao");
hasNotified = true;
}
delay(2000);
// hasPublished = true;
}