#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
long lastMsg = 0;
int LDR = 32;
#include <UltrasonicSensor.h> //include คือการนำเข้า Library
UltrasonicSensor ultrasonic1(26, 27); // PIN 26 ต่อที่ขา PIN Trig, PIN 27 ต่อที่ขา PIN Echo ของ Ultrasonic
UltrasonicSensor ultrasonic2(14, 12);
int LED1 = 21;
int c =0;
int f =0;
//-------------------Config------------------------------------
const char* ssid = "Wi-Fi name"; //ชื่อ WiFi
const char* pass = "Wi-Fi password"; //รหัส WiFi
const char* mqtt_server = "broker.mqttdashboard.com"; //HiveMQ broker
WiFiClient espClient;
PubSubClient client(espClient);
//-------------------void_setup------------------------------------
void setup() {
Serial.begin(115200);
WiFi_setup();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
ultrasonic1.setTemperature(22);
ultrasonic2.setTemperature(22);
pinMode(LED1, OUTPUT);
}
//-------------------WiFi_Connect------------------------------------
void WiFi_setup() {
WiFi.begin("Wokwi-GUEST", "", 6);
Serial.println("");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi Connected");
}
//-------------------MQTT_Connect------------------------------------
void MQTT_Connect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("Group 16")) { //เปลี่ยนชื่อ Client_ID **ห้ามซ้ำกัน *************************************************************************
Serial.println("connected");
client.subscribe("Your Subscribe Topic"); // Subscribe Topic ระบุเฉพาะ topic ที่ต้องการ subscribe*********************************************
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 2 seconds");
delay(2000);
}
}
}
//ส่วนในการ Subscribe
int mode;
int count; //สร้างตัวแปรแบบ Global เพื่อนำไปใช้ในส่วนอื่น ๆ ต่อได้
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Received message: ");
if (String(topic) == "Your Subscribe Topic") // Subscribe Topic **********************************************************************************
{
StaticJsonDocument<300> JSONreceive;
deserializeJson(JSONreceive, payload);
mode = JSONreceive["Your key"];
Serial.print("Message from myESP32: ");
Serial.println(mode);
}
}
//-------------------void_loop------------------------------------
void loop() {
if (!client.connected()) {
MQTT_Connect();
}
int LDRVal = analogRead(LDR);
int LDRmap = map(LDRVal,0,4095,1023,0);
Serial.println(LDRmap);
delay(500);
int distance1 = ultrasonic1.distanceInCentimeters();
int distance2 = ultrasonic2.distanceInCentimeters();
client.loop();
//---------------------Sender Topic--------------------------------
long now = millis();
if (now - lastMsg > 5000) { // ต้องการส่งข้อมูลไปทุกๆ 2 วินาที
lastMsg = now;
//Publishing MQTT
StaticJsonDocument<300> JSONdata;
JSONdata["Ultrasonic 1"] = distance1 ;
JSONdata["Ultrasonic 2"] = distance2 ;
JSONdata["LDR"] = LDRmap ;
char JSONmsg[300];
serializeJson(JSONdata, JSONmsg); //จัดเอกสารหรือข้อมูลที่เราจะส่ง
client.publish("Group16/IoT", JSONmsg); // Publisher Topic ตรงนี้คือการส่งข้อมูลออกไป **********************************************************
}
// นำข้อมูลจากการ Subscribe มาใช้ต่อในส่วนนี้
delay(500);
if (LDRmap <= 200 ){
if(distance1 <=200){
c+=1;
digitalWrite(LED1, HIGH);
}
if(distance2<=200){
int i =0;
c-=1;
if(c==i){
digitalWrite(LED1, LOW);
}
if(c<=0){
c=0;
}
}
int value = c; // ค่าที่ต้องการตรวจสอบ
int seconds = 0; // จำนวนวินาทีที่ผ่านไป
while (seconds < 5) {
delay(1000); // หน่วงเวลา 1 วินาที (1000000 ไมครอนวินาที)
// เพิ่มเวลาผ่านไป
seconds++;
// ตรวจสอบว่าค่าเปลี่ยนหรือยัง
if (value == c) {
value++;
}
}
// หากค่ายังคงเป็น 10 หลังจาก 10 วินาที
if (value == c) {
value = 0;
c=0;
digitalWrite(LED1,0);
}
Serial.print("c:");
Serial.println((c));
}
}