#include "WiFi.h"     //เรียกใช้งานไลบรารี่ wifi
#include <WiFiUDP.h>  //เรียกใช้งานไลบรารี่ UDP
#include <Wire.h>     //เรียกใช้งานไลบรารี่การรับ-ส่งข้อมูล
const int pingPin = 13;
int inPin = 12;
const char *ssid = "Freewifi";       //ชื่อ wifi ที่ต้องการเชื่อมต่อ
const char *password = "123456789";  //password ที่ต้องการเชื่อมต่อ
unsigned int UDPPort = 2390;         // เปิดใช้งานพอร์ต 2390
const char *host = "192.168.1.2";    //ใส่ IP อุปกรณ์แม่ข่าย(Server)ที่จะส่งข้อมูล
int Status_LED = 2;
int packetSize;
int Gas_analog = 32;
int Gas_analog2 = 33;
int rain = 26;
String BufferString;
int len;
String data1, data2, data3, data4;
WiFiUDP Udp;                              //เปิดใช้ฟังชั่น UDP
IPAddress local_ip = { 192, 168, 1, 3 };  //ตั้งค่า IP
IPAddress gateway = { 192, 168, 1, 1 };   //ตั้งค่า IP Gateway
IPAddress subnet = { 255, 255, 255, 0 };  //ตั้งค่า Subnet
void setup() {
  pinMode(rain, INPUT);
  Serial.begin(9600);
  pinMode(Status_LED, OUTPUT);
  Serial.print("Connecting to ");          //แสดงข้อความ "Connecting to"
  Serial.println(ssid);                    //แสดงข้อความ ชื่อ wifi
  WiFi.begin(ssid, password);              // เชื่อมต่อ wifi
  while (WiFi.status() != WL_CONNECTED) {  //รอจนกว่าจะเชื่อมต่อสําเร็จ
    delay(500);
    Serial.print(".");
  }
  Serial.print("WiFi UDP Mode : ");
  Serial.println(WiFi.localIP());          //แสดงหมายเลข IP ของ ESP32
  Udp.begin(UDPPort);                      //เริ่มใช้งานฟังชั่น UDP
  Serial.print("Connecting to ");          //แสดงข้อความ "Connecting to"
  Serial.println(ssid);                    //แสดงข้อความ ชื่อ wifi
  WiFi.begin(ssid, password);              // เชื่อมต่อ wifi
  while (WiFi.status() != WL_CONNECTED) {  //รอจนกว่าจะเชื่อมต่อสําเร็จ
    delay(500);
    Serial.print(".");
  }

  WiFi.config(local_ip, gateway, subnet);  //set ค่า IP
  Serial.println("");
  Serial.println("WiFi connected");  //แสดงข้อความเชื่อมต่อสําเร็จ
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());  //แสดงหมายเลข IP ของ ESP32
}

void loop() {
  long duration, cm;

  pinMode(pingPin, OUTPUT);


  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(inPin, INPUT);
  duration = pulseIn(inPin, HIGH);

  cm = microsecondsToCentimeters(duration);

  data1 = cm;  //ข้อมูลที่ต้องการส่ง
  data2 = analogRead(Gas_analog);
  data3 = analogRead(Gas_analog2);
  data4 = digitalRead(rain);
  String dataToSend = String(data1) + "," + String(data2) + "," + String(data3) + "," + String(data4);
  Serial.println(dataToSend);
  Udp.beginPacket(host, UDPPort);
  Udp.print(dataToSend);                               //คําสั่งส่งข้อมูล
  Udp.endPacket();                                     //ปิดการส่งข้อมูล
  digitalWrite(Status_LED, !digitalRead(Status_LED));  //แสดงสถานะการส่งด้วย LED
  delay(500);                                          //หน่วงเวลาการส่งข้อมูล
    //Serial.println(data1);
}
long microsecondsToCentimeters(long microseconds) {
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}