120 lines
3.2 KiB
C++
120 lines
3.2 KiB
C++
#include <LiquidCrystal_I2C.h>
|
|
#include <SoftwareSerial.h>
|
|
#include <HardwareSerial.h>
|
|
|
|
// 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);
|
|
} |