#include <SPI.h>
#include <LoRa.h>
#include <stdlib.h> /* strtoll */
#define ss 5
#define rst 14
#define dio0 2
const int csPin = 7; // LoRa radio chip select
const int resetPin = 6; // LoRa radio reset
const int irqPin = 1; // change for your board; must be a hardware interrupt pin
byte msgCount = 0; // count of outgoing messages
int interval = 2000; // interval between sends
long lastSendTime = 0; // time of last packet send
// Define LoRa parameters
#define BAND 433E6 // Adjust based on your region
// Definisi Nilai Pin untuk ESP32
#define LED_PIN LED_BUILTIN
#define BUTTON_PIN 4
String SerialData;
void InitializeLoRa(){
Serial.println("Initializing LoRa...");
//setup LoRa transceiver module
LoRa.setPins(csPin, resetPin, irqPin);
LoRa.setFrequency(BAND);
// Initialize LoRa
while (!LoRa.begin(BAND)) {
Serial.print(".");
delay(500);
}
// register the receive callback
LoRa.onReceive(onReceive);
// put the radio into receive mode
LoRa.receive();
}
void onReceive(int packetSize) {
if (packetSize == 0) {
Serial.println("Received 0 packet"); // received a packet
return;
}
// Read packet
String incoming = "";
for (int i = 0; i < packetSize; i++) {
incoming += (char)LoRa.read();
}
// Display information
Serial.print("Message: ");
Serial.println(incoming);
Serial.print("RSSI: ");
Serial.println(LoRa.packetRssi());
Serial.print("SNR: ");
Serial.println(LoRa.packetSnr());
Serial.print("Frequency Error: ");
Serial.println(LoRa.packetFrequencyError());
}
void sendMessage(String outgoing){
LoRa.beginPacket(); // start packet
LoRa.print(outgoing); // add payload
LoRa.endPacket(); // finish packet and send it
msgCount++; // increment message ID
}
String getInputStringLoRa (String desc){
Serial.print(desc);
while(!Serial.available());
String data = Serial.readStringUntil('\n');
Serial.printf("%s\n",data);
return data;
}
void handleCommand(String command){
long sw;
int level, outputPin;
int sf;
long sbw;
int denominator;
long length;
int active;
uint8_t gain;
String outgoing;
String serialData;
if(command == "a") InitializeLoRa();
else if (command == "b"){
sw = getInputStringLoRa("Set Sync Word : ").toInt();
LoRa.setSyncWord(sw);
Serial.printf("Sync Word has been set to %d\n", sw);
}
else if (command == "c"){
Serial.println("Set TX Power");
level = getInputStringLoRa("Level : ").toInt();
outputPin = getInputStringLoRa("Output Pin : ").toInt();
LoRa.setTxPower(level, outputPin);
Serial.printf("TX Power has been set to %d Level at Pin %d\n", level, outputPin);
}
else if (command == "d"){
sf = getInputStringLoRa("Spreading Factor : ").toInt();
LoRa.setSpreadingFactor(sf);
Serial.printf("Spreading Factor has been set to %d\n", sf);
}
else if (command == "e"){
sbw = getInputStringLoRa("Signal Bandwidth : ").toInt();
LoRa.setSignalBandwidth(sbw);
Serial.printf("Signal Bandwidth has been set to %d\n", sbw);
}
else if (command == "f"){
denominator = getInputStringLoRa("Coding Rate : ").toInt();
LoRa.setCodingRate4(denominator);
Serial.printf("Coding Rate has been set to %d\n", denominator);
}
else if (command == "g"){
length = getInputStringLoRa("Preamble Length : ").toInt();
LoRa.setPreambleLength(length);
Serial.printf("Preamble Length has been set to %d\n", length);
}
else if (command == "h"){{
active = getInputStringLoRa("Enable/Disable CRC (1/0) : ").toInt();
if(active){
LoRa.enableCrc();
Serial.println("CRC has been set to active");
}
else{
LoRa.disableCrc();
Serial.println("CRC has been set to disable");
}
}
}
else if (command == "i")
{
active = getInputStringLoRa("Enable/Disable Invert IQ (1/0) : ").toInt();
if(active){
LoRa.enableInvertIQ();
Serial.println("Invert IQ has been set to active");
}
else{
LoRa.disableInvertIQ();
Serial.println("Invet IQ has been set to disable");
}
}
else if (command == "j") LoRa.setGain(gain);
else if (command == "k") LoRa.idle();
else if (command == "l") LoRa.sleep();
else if (command == "m") sendMessage(outgoing);
else{
Serial.println("Invalid Input");
Serial.print("Input : ");
}
}
// Fungsi Input Serial monitor untuk membaca input dari Serial Monitoor
void vTaskSerial(void *parameter) {
Serial.println("LoRa Duplex Communication");
Serial.println("a. Initialize LoRa");
Serial.println("b. Set Sync Word");
Serial.println("c. Set TX Power");
Serial.println("d. Set Spreading Factor");
Serial.println("e. Set Signal Bandwidth");
Serial.println("f. Set Coding Rate");
Serial.println("g. Set Preamble Length");
Serial.println("h. CRC Configuration");
Serial.println("i. InvertIQ Configuration");
Serial.println("j. Set Gain");
Serial.println("k. Set to Idle");
Serial.println("l. Set to Sleep");
Serial.println("m. Send a Message");
Serial.println("Please input the characters only like 'a', 'b', 'c'");
Serial.print("Input : ");
while (1) { // Looping
// See if there are things in the input serial buffer
if (Serial.available() > 0) {
SerialData = Serial.readStringUntil('\n');
SerialData.trim();
Serial.println(SerialData);
handleCommand(SerialData);
SerialData = "";
}
// Delay kecil untuk menghindar busy-wait
vTaskDelay(pdMS_TO_TICKS(10)); // Delay 10 ms
}
}
void setup() {
Serial.begin(115200); // Set Baud Rate ke 9600
while (!Serial);
// Membuat Task Serial
xTaskCreatePinnedToCore(
vTaskSerial,
"Input Serial Monitor Task ",
100000, /* Stack size in words */
NULL, /* Task input parameter */
2, /* Priority of the task */
NULL, /* Task handle. */
0 /* Core where the task should run */
);
vTaskDelete(NULL);
}
void loop() {
// if (millis() - lastSendTime > interval) {
// String message = "HeLoRa World! "; // send a message
// message += msgCount;
// sendMessage(message);
// Serial.println("Sending " + message);
// lastSendTime = millis(); // timestamp the message
// interval = random(2000) + 1000; // 2-3 seconds
// msgCount++;
// }
}