· 11 months ago · Feb 20, 2025, 02:15 PM
1
2#include <WiFi.h>
3#include <PubSubClient.h>
4#include <Wire.h>
5#include <LiquidCrystal_I2C.h>
6
7constexpr uint8_t RXD2 = 19; // ESP32 RX pin connected to sensor TX
8constexpr uint8_t TXD2 = 18; // ESP32 TX pin connected to sensor RX
9const int led_green = 14;
10const int led_yellow = 12;
11const int led_red = 13;
12String ledStatus = "";
13const int buzzer = 27;
14
15HardwareSerial mySerial(2);
16
17int currentDistance = 0;
18unsigned long previousMillis = 0;
19const long interval = 3000;
20
21const String ssid = "NON";
22const String password = "";
23const char* mqtt_server = "broker.netpie.io";
24const int mqtt_port = 1883;
25const char* mqtt_Client = "cb4f3261-6069-4943-8541-0640e0208d7c";
26const char* mqtt_username = "qGVw4FoXkEHAEqk8v7mrb2gk3duMGKPm";
27const char* mqtt_password = "8W63Vb5ggdVjCnsJWMSWCQYGxhc95e7x";
28
29WiFiClient espClient;
30PubSubClient client(espClient);
31LiquidCrystal_I2C lcd(0x27, 16, 2);
32char msg[150];
33
34void setup() {
35 Serial.begin(115200);
36 mySerial.begin(9600, SERIAL_8N1, RXD2, TXD2);
37
38 pinMode(led_red, OUTPUT);
39 pinMode(led_yellow, OUTPUT);
40 pinMode(led_green, OUTPUT);
41 pinMode(buzzer, OUTPUT);
42
43 // wifi connection setup and mqtt
44 Serial.println();
45 Serial.print("Connecting to ");
46 Serial.println(ssid);
47 WiFi.begin(ssid, password);
48 while (WiFi.status() != WL_CONNECTED) {
49 delay(500);
50 Serial.print(".");
51 }
52 Serial.println();
53 Serial.println("WiFi connected");
54 Serial.println("IP address: ");
55 Serial.println(WiFi.localIP());
56 // mqtt connection setup
57 client.setServer(mqtt_server, mqtt_port);
58 client.setCallback(callback);
59 //lcd setup
60 lcd.begin();
61 // default value for buzzer
62 digitalWrite(buzzer, HIGH);
63}
64
65void loop() {
66 processSensorData();
67 unsigned long currentMillis = millis();
68 if (currentMillis - previousMillis >= interval) {
69 previousMillis = currentMillis;
70 if (!client.connected()) {
71 reconnect();
72 }
73 client.loop();
74
75 // Prepare the message for MQTT
76 String data = "{ \"data\" : { \"DistanceInCM\": " + String(currentDistance) +", \"led\" : \"" + String(ledStatus) + "\"}}";
77 Serial.println(data);
78 data.toCharArray(msg, (data.length() + 1));
79 // Publish to Netpie
80 client.publish("@shadow/data/update", msg);
81 Serial.println("Publish Success");
82
83 // LED Control based on currentDistance
84 if (currentDistance > 76) {
85 digitalWrite(led_green, HIGH);
86 digitalWrite(led_yellow, LOW);
87 digitalWrite(led_red, LOW);
88 digitalWrite(buzzer, HIGH);
89 ledStatus = "GREEN";
90 } else if (currentDistance > 51 && currentDistance <= 75) {
91 digitalWrite(led_green, LOW);
92 digitalWrite(led_yellow, HIGH);
93 digitalWrite(led_red, LOW);
94 digitalWrite(buzzer, HIGH);
95 ledStatus = "YELLOW";
96 } else if (currentDistance > 26 && currentDistance <= 50) { //ตอนขึ้น Too close สถานะไม่เปลี่ยนอะ
97 digitalWrite(led_green, LOW);
98 digitalWrite(led_yellow, LOW);
99 digitalWrite(led_red, HIGH);
100 digitalWrite(buzzer, LOW);
101 ledStatus = "RED";
102 } else {
103 // Handle cases where the sensor might not provide a valid reading.
104 digitalWrite(led_green, LOW);
105 digitalWrite(led_yellow, LOW);
106 digitalWrite(led_red, LOW);
107 digitalWrite(buzzer, HIGH);
108 ledStatus = "HEE";
109 }
110 lcd.clear();
111 lcd.setCursor(0, 0); lcd.print("LED : " + String(ledStatus));
112 lcd.setCursor(0, 1); lcd.print("DIS : " + String(currentDistance));
113 }
114}
115
116
117void reconnect() {
118 while (!client.connected()) {
119 Serial.print("Attempting MQTT connection...");
120 if (client.connect(mqtt_Client, mqtt_username, mqtt_password)) {
121 Serial.println("connected");
122 client.subscribe("@msg/test");
123 } else {
124 Serial.print("failed, rc=");
125 Serial.print(client.state());
126 Serial.println(" try again in 5 seconds");
127 delay(5000);
128 }
129 }
130}
131
132void callback(char* topic, byte* payload, unsigned int length) {
133 Serial.print("Message arrived [");
134 Serial.print(topic);
135 Serial.print("] ");
136 String message;
137 for (int i = 0; i < length; i++) {
138 message += (char)payload[i];
139 }
140 Serial.println(message);
141}
142
143// distance sensor functions
144void processSensorData() {
145 static uint8_t S1[4];
146 static uint8_t index = 0;
147 while (mySerial.available()) {
148 S1[index] = mySerial.read();
149 if (index == 0 && S1[0] != 0xFF) {
150 return;
151 }
152 if (++index == 4) {
153 index = 0;
154 handleSensorData(S1);
155 }
156 }
157}
158void handleSensorData(uint8_t* S1) {
159 uint8_t checksum = (S1[0] + S1[1] + S1[2]) & 0xFF;
160 if (checksum != S1[3]) {
161 Serial.println("ERROR: Checksum mismatch");
162 return;
163 }
164 uint16_t SensorMM = (S1[1] << 8) | S1[2];
165 if (SensorMM <= 250) {
166 Serial.println("Too Close");
167 currentDistance = 25;
168 return;
169 }
170 // Serial.print("Distance: ");
171 // Serial.print(SensorMM / 10);
172 // Serial.println(" CM");
173 int dis = SensorMM / 10;
174 // Serial.println(dis);
175 currentDistance = dis;
176}
177