#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#define status_led 3
const byte bt_rx = 2, bt_tx = 3, bt_en = 4;
const byte btn_output = 9, btn_input = 10;
LiquidCrystal_I2C lcd_display(0x27, 16, 2);
SoftwareSerial bt_serial(bt_rx, bt_tx);
bool is_led_active = false;
unsigned long last_btn_press_time = 0;
const unsigned long debounce_delay = 200;
void setup() {
Serial.begin(9600);
bt_serial.begin(9600);
delay(1000);
pinMode(bt_rx, INPUT);
pinMode(bt_tx, OUTPUT);
pinMode(bt_en, OUTPUT);
pinMode(btn_output, OUTPUT);
pinMode(btn_input, INPUT_PULLUP);
digitalWrite(bt_en, HIGH);
delay(500);
while (bt_serial.available())
bt_serial.read();
lcd_display.begin(16, 2);
lcd_display.print("Initializing...");
delay(2000);
lcd_display.clear();
}
void loop() {
if (digitalRead(btn_input) == LOW && (millis() - last_btn_press_time > debounce_delay)) {
last_btn_press_time = millis();
is_led_active = !is_led_active;
digitalWrite(status_led, is_led_active ? HIGH : LOW);
lcd_display.clear();
if (is_led_active) {
lcd_display.print("BT Connected");
Serial.println("BT Connected");
} else {
lcd_display.print("BT Disconnected");
Serial.println("BT Disconnected");
}
}
if (Serial.available()) {
char serial_input = Serial.read();
bt_serial.write(serial_input);
}
if (bt_serial.available()) {
char bt_data = bt_serial.read();
lcd_display.setCursor(0, 1);
lcd_display.print("Received: ");
lcd_display.print(bt_data);
Serial.print(bt_data);
}
if (Serial.available()) {
String command_to_bt = "";
while (Serial.available()) {
command_to_bt += (char)Serial.read();
}
if (command_to_bt == "AT") {
bt_serial.write("OK\n");
} else if (command_to_bt == "AT+NAME") {
bt_serial.write("GuardianNode\n");
} else if (command_to_bt == "AT+VERSION") {
bt_serial.write("V1.9.1\n");
} else if (command_to_bt == "AT+BAUD") {
bt_serial.write("9600\n");
}
}
delay(1000);
}