Advertisement
NoNnYhA55

GuJabaaa Project

Feb 20th, 2025
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 5.03 KB | Software | 0 0
  1.  
  2. #include <WiFi.h>
  3. #include <PubSubClient.h>
  4. #include <Wire.h>
  5. #include <LiquidCrystal_I2C.h>
  6.  
  7. constexpr uint8_t RXD2 = 19;  // ESP32 RX pin connected to sensor TX
  8. constexpr uint8_t TXD2 = 18;  // ESP32 TX pin connected to sensor RX
  9. const int led_green = 14;
  10. const int led_yellow = 12;
  11. const int led_red = 13;
  12. String ledStatus = "";
  13. const int buzzer = 27;
  14.  
  15. HardwareSerial mySerial(2);
  16.  
  17. int currentDistance = 0;
  18. unsigned long previousMillis = 0;
  19. const long interval = 3000;
  20.  
  21. const String ssid = "NON";
  22. const String password = "";
  23. const char* mqtt_server = "broker.netpie.io";
  24. const int mqtt_port = 1883;
  25. const char* mqtt_Client = "cb4f3261-6069-4943-8541-0640e0208d7c";
  26. const char* mqtt_username = "qGVw4FoXkEHAEqk8v7mrb2gk3duMGKPm";
  27. const char* mqtt_password = "8W63Vb5ggdVjCnsJWMSWCQYGxhc95e7x";
  28.  
  29. WiFiClient espClient;
  30. PubSubClient client(espClient);
  31. LiquidCrystal_I2C lcd(0x27, 16, 2);
  32. char msg[150];
  33.  
  34. void 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.  
  65. void 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.  
  117. void 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.  
  132. void 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
  144. void 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. }
  158. void 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.  
Tags: Arduino
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement