#include <WiFi.h>
#include <ESP_Mail_Client.h>
#include "DHTesp.h"
#include "PubSubClient.h"
#include <HTTPClient.h>
#include <ESP32Servo.h>
const char * MQTTServer = "broker.emqx.io";
const char * DHT_Topic = "DHTServer";
const char * MQTT_ID = "f9354df8-1937-4876-b207-c48f0d188772";
int Port = 1883;
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define SMTP_HOST "smtp.office365.com"
#define SMTP_PORT 587
#define AUTHOR_EMAIL "[email protected]"
#define AUTHOR_PASSWORD "Cucui_341"
#define RECIPIENT_EMAIL "[email protected]"
#define DHT_PIN 15
#define LED_PIN 2
#define LDR_PIN 35
#define GAS_PIN 32
#define ECHO_PIN 18
#define TRIG_PIN 19
#define BUZZER_PIN 4
#define RAIN_PIN 33
#define SERVO_PIN 21
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
DHTesp dhtSensor;
SMTPSession smtp;
ESP_Mail_Session session;
WiFiClient espClient;
PubSubClient client(espClient);
Servo servo;
char data[128];
bool isDark = false;
bool isDetected = false;
bool readyToSendMail = true;
bool gasWarning = false;
int rainState = -1;
int ledState = 0;
bool isFirst = true;
unsigned long current = 0;
void smtpCallback(SMTP_Status status);
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.print("WiFi connected");
Serial.print(", IP address: ");
Serial.println(WiFi.localIP());
}
void MQTT_Reconnect() {
while (!client.connected()) {
if (client.connect(MQTT_ID)) {
client.subscribe("ledServer");
client.subscribe("servoServer");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
Serial.print("Message: ");
String stMessage;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
stMessage += (char)message[i];
}
if(strcmp(topic, "ledServer") == 0){
Serial.print("Led");
if(stMessage == "on"){
ledState = 1;
digitalWrite(LED_PIN,HIGH);
}else{
ledState = 0;
digitalWrite(LED_PIN,LOW);
}
}else if(strcmp(topic, "servoServer") == 0){
ControlServo(stMessage == "on");
}
Serial.println();
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RAIN_PIN, INPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
servo.attach(21);
WIFIConnect();
client.setServer(MQTTServer, Port);
client.setCallback(callback);
smtp.debug(0);
smtp.callback(smtpCallback);
}
void LED(){
int newLedState;
if(isDark){
newLedState = (int) isDetected;
}else{
newLedState = 0;
}
if(ledState != newLedState){
ledState = newLedState;
digitalWrite(LED_PIN,ledState);
client.publish("ledClient", "");
}
}
void DHT(){
TempAndHumidity dhtValue = dhtSensor.getTempAndHumidity();
float nd = dhtValue.temperature;
float da = dhtValue.humidity;
String jsonStr = "{\"temperature\":\"" + String(nd,0) +"\", \"humidity\":\"" + String(da,0) + "\"}";
jsonStr.toCharArray(data,jsonStr.length() + 1);
client.publish("dhtClient", data);
Serial.print("Nhiet do:"+String(nd,0)+" - ");
Serial.println("Do am:"+String(da,0));
}
void LDR(){
int analogValue = analogRead(LDR_PIN);
float voltage = analogValue / 4096. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
isDark = lux < 100;
String jsonStr = "{\"value\":\"" + String(lux,0) + "\"}";
jsonStr.toCharArray(data,jsonStr.length() + 1);
client.publish("ldrClient", data);
Serial.println("Cam bien anh sang:" + String(lux < 100 ? "Trời tối" : "Trời sáng"));
}
void Gas(){
int gas = analogRead(GAS_PIN);
String jsonStr = "{\"value\":\"" + String(gas) + "\"}";
jsonStr.toCharArray(data,jsonStr.length() + 1);
client.publish("gasClient", data);
Serial.println("Cảm biến gas: "+ String(gas) + " - " + String(gas < 800 ? "An toàn" : "Khí gas cao"));
if(gas > 800){
tone(BUZZER_PIN,260,1500);
gasWarning = true;
}else{
tone(BUZZER_PIN,0,0);
gasWarning = false;
}
}
void Utrasonic() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
isDetected = distance < 100;
String jsonStr = "{\"state\":\"" + String(isDetected) + "\"}";
jsonStr.toCharArray(data,jsonStr.length() + 1);
client.publish("utsClient", data);
Serial.println("Cảm biến sieu am :"+String(isDetected ? " Phát hiện vật cản":"Không phát hiện vật cản"));
}
void Rain(){
int newRainState = (digitalRead(RAIN_PIN) == HIGH);
Serial.print("Cảm biến mưa: ");
Serial.println(newRainState ? "Có mưa" : "Không mưa");
if(rainState == -1 || rainState != newRainState){
rainState = newRainState;
ControlServo(rainState);
String jsonStr = "{\"state\":\"" + String(rainState) + "\"}";
jsonStr.toCharArray(data,jsonStr.length() + 1);
client.publish("rainClient", data);
}
}
void ControlServo(bool isRain){
if(isRain){
// Mở mái che
for (int pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(10);
}
Serial.println("Mái che: mở");
}else{
// Đóng mái che
for (int pos = 180; pos >= 0; pos -= 1) {
servo.write(pos);
delay(10);
}
Serial.println("Mái che: đóng");
}
}
void loop() {
if (!client.connected()) {
MQTT_Reconnect();
}
while(isFirst || (millis() - current) >= 3000 ){
if(isFirst){
isFirst = false;
client.publish("ledState", "");
client.publish("servoState", "");
}else{
DHT();
LDR();
Gas();
Rain();
Utrasonic();
LED();
}
Serial.println("==============-");
current = millis();
}
client.loop();
// delay(200);
}
/* Callback function to get the Email sending status */
void smtpCallback(SMTP_Status status){
/* Print the sending result */
if (status.success()){
ESP_MAIL_PRINTF("Đã gửi mail\n");
}
}
void sendEmail(String subject,String textMsg)
{
ESP_MAIL_PRINTF("Đang gửi mail\n");
ESP_Mail_Session session;
session.server.host_name = SMTP_HOST;
session.server.port = SMTP_PORT;
session.login.email = AUTHOR_EMAIL;
session.login.password = AUTHOR_PASSWORD;
session.login.user_domain = "";
session.time.ntp_server = "pool.ntp.org";
session.time.gmt_offset = 3600 * 7;
session.time.day_light_offset = 0;
SMTP_Message message;
message.sender.name = "NHÀ THÔNG MINH";
message.sender.email = AUTHOR_EMAIL;
message.subject = subject;
message.addRecipient("IOT",RECIPIENT_EMAIL);
message.text.content = textMsg;
message.text.charSet = "utf-8";
message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_low;
if (!smtp.connect(&session /* session credentials */))
return;
if (!MailClient.sendMail(&smtp, &message))
Serial.println("Error sending Email, " + smtp.errorReason());
// smtp.sendingResult.clear();
MailClient.getFreeHeap();
}
Cảm biến
ánh sáng
Cảm biến gas
Cảm biến mưa