#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));

}
}
$abcdeabcde151015202530354045505560fghijfghij