Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <WiFi.h>
- #include <PubSubClient.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- constexpr uint8_t RXD2 = 19; // ESP32 RX pin connected to sensor TX
- constexpr uint8_t TXD2 = 18; // ESP32 TX pin connected to sensor RX
- const int led_green = 14;
- const int led_yellow = 12;
- const int led_red = 13;
- String ledStatus = "";
- const int buzzer = 27;
- HardwareSerial mySerial(2);
- int currentDistance = 0;
- unsigned long previousMillis = 0;
- const long interval = 3000;
- const String ssid = "NON";
- const String password = "";
- const char* mqtt_server = "broker.netpie.io";
- const int mqtt_port = 1883;
- const char* mqtt_Client = "cb4f3261-6069-4943-8541-0640e0208d7c";
- const char* mqtt_username = "qGVw4FoXkEHAEqk8v7mrb2gk3duMGKPm";
- const char* mqtt_password = "8W63Vb5ggdVjCnsJWMSWCQYGxhc95e7x";
- WiFiClient espClient;
- PubSubClient client(espClient);
- LiquidCrystal_I2C lcd(0x27, 16, 2);
- char msg[150];
- void setup() {
- Serial.begin(115200);
- mySerial.begin(9600, SERIAL_8N1, RXD2, TXD2);
- pinMode(led_red, OUTPUT);
- pinMode(led_yellow, OUTPUT);
- pinMode(led_green, OUTPUT);
- pinMode(buzzer, OUTPUT);
- // wifi connection setup and mqtt
- Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- // mqtt connection setup
- client.setServer(mqtt_server, mqtt_port);
- client.setCallback(callback);
- //lcd setup
- lcd.begin();
- // default value for buzzer
- digitalWrite(buzzer, HIGH);
- }
- void loop() {
- processSensorData();
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval) {
- previousMillis = currentMillis;
- if (!client.connected()) {
- reconnect();
- }
- client.loop();
- // Prepare the message for MQTT
- String data = "{ \"data\" : { \"DistanceInCM\": " + String(currentDistance) +", \"led\" : \"" + String(ledStatus) + "\"}}";
- Serial.println(data);
- data.toCharArray(msg, (data.length() + 1));
- // Publish to Netpie
- client.publish("@shadow/data/update", msg);
- Serial.println("Publish Success");
- // LED Control based on currentDistance
- if (currentDistance > 76) {
- digitalWrite(led_green, HIGH);
- digitalWrite(led_yellow, LOW);
- digitalWrite(led_red, LOW);
- digitalWrite(buzzer, HIGH);
- ledStatus = "GREEN";
- } else if (currentDistance > 51 && currentDistance <= 75) {
- digitalWrite(led_green, LOW);
- digitalWrite(led_yellow, HIGH);
- digitalWrite(led_red, LOW);
- digitalWrite(buzzer, HIGH);
- ledStatus = "YELLOW";
- } else if (currentDistance > 26 && currentDistance <= 50) { //ตอนขึ้น Too close สถานะไม่เปลี่ยนอะ
- digitalWrite(led_green, LOW);
- digitalWrite(led_yellow, LOW);
- digitalWrite(led_red, HIGH);
- digitalWrite(buzzer, LOW);
- ledStatus = "RED";
- } else {
- // Handle cases where the sensor might not provide a valid reading.
- digitalWrite(led_green, LOW);
- digitalWrite(led_yellow, LOW);
- digitalWrite(led_red, LOW);
- digitalWrite(buzzer, HIGH);
- ledStatus = "HEE";
- }
- lcd.clear();
- lcd.setCursor(0, 0); lcd.print("LED : " + String(ledStatus));
- lcd.setCursor(0, 1); lcd.print("DIS : " + String(currentDistance));
- }
- }
- void reconnect() {
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- if (client.connect(mqtt_Client, mqtt_username, mqtt_password)) {
- Serial.println("connected");
- client.subscribe("@msg/test");
- } else {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" try again in 5 seconds");
- delay(5000);
- }
- }
- }
- void callback(char* topic, byte* payload, unsigned int length) {
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- String message;
- for (int i = 0; i < length; i++) {
- message += (char)payload[i];
- }
- Serial.println(message);
- }
- // distance sensor functions
- void processSensorData() {
- static uint8_t S1[4];
- static uint8_t index = 0;
- while (mySerial.available()) {
- S1[index] = mySerial.read();
- if (index == 0 && S1[0] != 0xFF) {
- return;
- }
- if (++index == 4) {
- index = 0;
- handleSensorData(S1);
- }
- }
- }
- void handleSensorData(uint8_t* S1) {
- uint8_t checksum = (S1[0] + S1[1] + S1[2]) & 0xFF;
- if (checksum != S1[3]) {
- Serial.println("ERROR: Checksum mismatch");
- return;
- }
- uint16_t SensorMM = (S1[1] << 8) | S1[2];
- if (SensorMM <= 250) {
- Serial.println("Too Close");
- currentDistance = 25;
- return;
- }
- // Serial.print("Distance: ");
- // Serial.print(SensorMM / 10);
- // Serial.println(" CM");
- int dis = SensorMM / 10;
- // Serial.println(dis);
- currentDistance = dis;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement