101 lines
2.4 KiB
C++
101 lines
2.4 KiB
C++
#include <SPI.h>
|
|
#include <LoRa.h>
|
|
#include <Wire.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
|
|
// Konfigurasi pin LoRa SX1278
|
|
#define LORA_SCK 18
|
|
#define LORA_MISO 19
|
|
#define LORA_MOSI 23
|
|
#define LORA_SS 5
|
|
#define LORA_RST 14
|
|
#define LORA_DIO0 2
|
|
|
|
// Inisialisasi LCD I2C (alamat 0x27, 16 kolom, 2 baris)
|
|
LiquidCrystal_I2C lcd(0x27, 16, 2);
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
|
|
// Inisialisasi LCD
|
|
lcd.begin();
|
|
lcd.backlight();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Inisialisasi...");
|
|
|
|
// Inisialisasi LoRa
|
|
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_SS);
|
|
LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);
|
|
if (!LoRa.begin(433E6)) {
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("LoRa Gagal");
|
|
Serial.println("Gagal memulai LoRa");
|
|
while (1);
|
|
}
|
|
|
|
LoRa.setSyncWord(0xF3);
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("LoRa OK ");
|
|
Serial.println("Receiver siap...");
|
|
delay(2000);
|
|
lcd.clear();
|
|
}
|
|
|
|
void loop() {
|
|
int packetSize = LoRa.parsePacket();
|
|
if (packetSize) {
|
|
String dataMasuk = "";
|
|
while (LoRa.available()) {
|
|
dataMasuk += (char)LoRa.read();
|
|
}
|
|
|
|
int rssi = LoRa.packetRssi();
|
|
String jarak = "Tidak diketahui";
|
|
if (rssi >= -30) jarak = "Dekat";
|
|
else if (rssi >= -100) jarak = "Normal";
|
|
else if (rssi >= -150) jarak = "Jauh";
|
|
else jarak = "Sangat Jauh";
|
|
|
|
// Parsing data (misal: "Temp:28.4C, Hum:65.1%")
|
|
String suhuStr = "";
|
|
String humStr = "";
|
|
|
|
int indexTemp = dataMasuk.indexOf("Temp:");
|
|
int indexHum = dataMasuk.indexOf("Hum:");
|
|
|
|
if (indexTemp != -1 && indexHum != -1) {
|
|
suhuStr = dataMasuk.substring(indexTemp + 5, dataMasuk.indexOf("C"));
|
|
humStr = dataMasuk.substring(indexHum + 4, dataMasuk.indexOf("%"));
|
|
}
|
|
|
|
// Tampilkan di Serial Monitor
|
|
Serial.println("Data diterima: " + dataMasuk);
|
|
Serial.print("Suhu: ");
|
|
Serial.print(suhuStr);
|
|
Serial.println(" C");
|
|
Serial.print("Kelembapan: ");
|
|
Serial.print(humStr);
|
|
Serial.println(" %");
|
|
Serial.print("RSSI: ");
|
|
Serial.print(rssi);
|
|
Serial.print(" dBm, Perkiraan jarak: ");
|
|
Serial.println(jarak);
|
|
Serial.println("---------------------");
|
|
|
|
// Tampilkan di LCD
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("T:");
|
|
lcd.print(suhuStr);
|
|
lcd.print((char)223); // Simbol derajat
|
|
lcd.print("C H:");
|
|
lcd.print(humStr);
|
|
lcd.print("%");
|
|
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("Jarak: ");
|
|
lcd.print(jarak);
|
|
lcd.print(" ");
|
|
}
|
|
}
|