#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
/* LCD I2C 20x4 setup */
LiquidCrystal_I2C lcd(0x27, 20, 4); // Use 0x3F if 0x27 doesn't work
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
/* Preset Messages */
String messages[10] = {
"", // placeholder for index 0
"HELLO",
"HOW'S THE SITUATION?",
"YOUR EST TIME TO ARRIVE?",
"WE WILL SEND YOU BACKUP",
"GO BACK UP",
"GO MORE DEEPER",
"GO TO LEFT",
"GO TO RIGHT",
"BE CAREFUL"
};
String selectedMessage = "";
bool messageReady = false;
void showSplashScreen() {
lcd.setCursor(2, 1);
lcd.print("UNDERWATER IR COMMS");
lcd.setCursor(4, 2);
lcd.print("SYSTEM READY");
delay(2000);
lcd.clear();
}
void displayMenu() {
lcd.setCursor(0, 0);
lcd.print("Press 1-9 to choose");
lcd.setCursor(0, 1);
lcd.print("Msg, #: Send, *:Clr");
}
void sendMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sending Message:");
lcd.setCursor(0, 1);
lcd.print(selectedMessage);
// Simulated IR send (via Serial)
Serial.print("IR SEND: ");
Serial.println(selectedMessage);
lcd.setCursor(0, 3);
lcd.print("Status: Transmitted");
delay(3000);
selectedMessage = "";
lcd.clear();
displayMenu();
}
void setup() {
Wire.begin();
lcd.init();
lcd.backlight(); // <- ✅ FIXED THIS LINE
Serial.begin(9600);
showSplashScreen();
displayMenu();
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key >= '1' && key <= '9') {
int index = key - '0';
selectedMessage = messages[index];
lcd.setCursor(0, 2);
lcd.print("Selected: ");
lcd.setCursor(10, 2);
lcd.print(key);
} else if (key == '#') {
if (selectedMessage.length() > 0) {
sendMessage();
}
} else if (key == '*') {
selectedMessage = "";
lcd.setCursor(0, 2);
lcd.print("Selection cleared ");
}
}
}