#include #include #include // Define SoftwareSerial for sensor communication SoftwareSerial mySerial(25, 26); // RX, TX // Initialize data array and distance variable unsigned char data[4] = {}; float distance; // Initialize I2C LCD display with address 0x27, 16 columns, and 2 rows LiquidCrystal_I2C lcd(0x27, 16, 2); // Define buzzer pin const int buzzerPin = 12; // Initialize HardwareSerial for LoRa E32 on UART2 HardwareSerial LoRaSerial(2); // Use UART2 void setup() { // Initialize serial communication for debugging Serial.begin(57600); mySerial.begin(9600); // 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 // Print initial message to Serial Monitor Serial.println("Sender is ready. Sending data..."); } void loop() { // Read data from sensor do { for (int i = 0; i < 4; i++) { data[i] = mySerial.read(); } } while (mySerial.read() == 0xff); mySerial.flush(); if (data[0] == 0xff) { int sum = (data[0] + data[1] + data[2]) & 0x00FF; if (sum == data[3]) { distance = (data[1] << 8) + data[2]; unsigned long sendTime = millis(); // Capture the timestamp int snr = random(10, 20); // Simulate SNR int rssi = random(-100, -30); // Simulate RSSI if (distance > 280) { // Print distance to Serial Monitor Serial.print("Jarak: "); Serial.print(distance / 10); Serial.println(" cm"); // Display distance on LCD lcd.clear(); lcd.setCursor(0, 0); lcd.print("Jarak: "); lcd.print(distance / 10); lcd.print(" cm"); // Send distance via LoRa LoRaSerial.print("Jarak: "); LoRaSerial.print(distance / 10); LoRaSerial.print(" cm,SNR:"); LoRaSerial.print(snr); LoRaSerial.print(",RSSI:"); LoRaSerial.print(rssi); LoRaSerial.print(",TIME:"); LoRaSerial.println(sendTime); // Turn off the buzzer digitalWrite(buzzerPin, LOW); } else { // Print warning to Serial Monitor Serial.println("WARNING: Bahaya! Air terlalu tinggi!"); // Display warning on LCD lcd.clear(); lcd.setCursor(0, 0); lcd.print("WARNING: Bahaya!"); lcd.setCursor(0, 1); lcd.print("Air Tinggi"); // Send warning via LoRa LoRaSerial.print("WARNING: Bahaya! Air terlalu tinggi!,SNR:"); LoRaSerial.print(snr); LoRaSerial.print(",RSSI:"); LoRaSerial.print(rssi); LoRaSerial.print(",TIME:"); LoRaSerial.println(sendTime); // Turn on the buzzer digitalWrite(buzzerPin, HIGH); } } else { // Print error to Serial Monitor Serial.println("ERROR"); // Display error on LCD lcd.clear(); lcd.print("ERROR"); // Send error via LoRa LoRaSerial.println("ERROR"); } } // Brief delay between measurements delay(150); }