#define DEBUG #include #include #include #include #include // Initialize I2C LCD display with address 0x27, 16 columns, and 2 rows LiquidCrystal_I2C lcd(0x27, 16, 2); // Initialize HardwareSerial for LoRa E32 on UART2 HardwareSerial LoRaSerial(2); // Use UART2 // Define buzzer pin const int buzzerPin = 12; // Thinger.io credentials #define USERNAME "akbarwijaya1701" #define DEVICE_ID "TAD3" #define DEVICE_CREDENTIAL "GN&bnQsadgJEKjPL" // WiFi credentials const char* ssid = "rodijayapap"; const char* pass = "ps4jember"; // Variable to store received data String receivedData = "Waiting for data"; // Variables to store SNR, RSSI, and Delay float SNR = 0.0; int RSSI = 0; float delayTime = 0.0; // Use float to store delay in seconds // Thinger.io instance ThingerESP32 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); void setup() { // Initialize serial communication for debugging Serial.begin(57600); // Initialize LCD lcd.init(); lcd.backlight(); // Set buzzer pin as output pinMode(buzzerPin, OUTPUT); // Initialize LoRa E32 communication on UART2 LoRaSerial.begin(9600, SERIAL_8N1, 16, 17); // Baud rate 9600, 8 data bits, no parity, 1 stop bit // Connect to Wi-Fi WiFi.begin(ssid, pass); Serial.print("Connecting to WiFi..."); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("Connected to WiFi"); // Initialize Thinger.io thing.add_wifi(ssid, pass); // Define Thinger.io resources thing["receivedData"] >> [](pson& out){ out = receivedData; }; thing["buzzer"] << [](pson& in){ if (in.is_empty()) { in = digitalRead(buzzerPin); } else { digitalWrite(buzzerPin, in ? HIGH : LOW); } }; // Define Thinger.io resources for SNR, RSSI, and Delay thing["SNR"] >> [](pson& out){ out = SNR; }; thing["RSSI"] >> [](pson& out){ out = RSSI; }; thing["delayTime"] >> [](pson& out){ out = delayTime; }; // Print initial message on LCD lcd.setCursor(0, 0); lcd.print("Waiting for data"); // Print initial message to Serial Monitor Serial.println("Receiver is ready. Waiting for data..."); } void loop() { thing.handle(); if (LoRaSerial.available()) { String data = LoRaSerial.readStringUntil('\n'); unsigned long receiveTime = millis(); // Capture the timestamp // Print received data to Serial Monitor Serial.print("Received: "); Serial.println(data); // Check if the data contains SNR, RSSI, and TIME int snrIndex = data.indexOf("SNR:"); int rssiIndex = data.indexOf("RSSI:"); int timeIndex = data.indexOf("TIME:"); if (snrIndex != -1 && rssiIndex != -1 && timeIndex != -1) { String snrString = data.substring(snrIndex + 4, data.indexOf(',', snrIndex)); String rssiString = data.substring(rssiIndex + 5, data.indexOf(',', rssiIndex)); String timeString = data.substring(timeIndex + 5); // Print parsed values to Serial Monitor Serial.print("SNR string: "); Serial.println(snrString); Serial.print("RSSI string: "); Serial.println(rssiString); Serial.print("Time string: "); Serial.println(timeString); SNR = snrString.toFloat(); RSSI = rssiString.toInt(); unsigned long sendTime = timeString.toInt(); delayTime = (receiveTime - sendTime) / 1000.0; // Convert delay to seconds // Remove additional information from receivedData receivedData = data.substring(0, snrIndex - 1); // Display received data on LCD lcd.clear(); lcd.setCursor(0, 0); lcd.print(receivedData.substring(0, 16)); // Display first 16 characters on the first row if (receivedData.length() > 16) { lcd.setCursor(0, 1); lcd.print(receivedData.substring(16, 32)); // Display next 16 characters on the second row if available } // Print SNR, RSSI, and Delay to Serial Monitor Serial.print("SNR: "); Serial.println(SNR); Serial.print("RSSI: "); Serial.println(RSSI); Serial.print("Delay: "); Serial.println(delayTime); } else { receivedData = data; // Display received data on LCD lcd.clear(); lcd.setCursor(0, 0); lcd.print(receivedData.substring(0, 16)); // Display first 16 characters on the first row if (receivedData.length() > 16) { lcd.setCursor(0, 1); lcd.print(receivedData.substring(16, 32)); // Display next 16 characters on the second row if available } } // Check for distance warning message if (receivedData.indexOf("WARNING: Bahaya!") != -1) { // Turn on the buzzer digitalWrite(buzzerPin, HIGH); } else { // Turn off the buzzer digitalWrite(buzzerPin, LOW); } } else { // No data received, print to Serial Monitor for debugging Serial.println("No data received from LoRa."); } // Brief delay to avoid overwhelming the loop delay(1000); }