#include <Keypad.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define speaker 12
#define OLED_RESET -1 // Reset pin for the OLED display
Adafruit_SSD1306 display(128, 64, &Wire, -1);
const int relayPinSending = 10; // Relay pin for sending
const int relayPinReceiving = 11; // Relay pin for receiving
// Define the keypad layout
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A6, A7, A8, A9}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Morse code mappings
const char* morseCode[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", // ABCDEFGHI
".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", // JKLMNOPQR
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", // STUVWXYZ
"-----", ".----", "..---", "...--", "....-", // 01234
".....", "-....", "--...", "---..", "----." // 56789
};
// Variable to store the received Morse code message
String receivedMessage = "";
void setup() {
// Initialize the display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Morse Code Sender");
display.display();
// Set relay pins as output
pinMode(relayPinSending, OUTPUT);
pinMode(relayPinReceiving, INPUT);
pinMode(speaker, OUTPUT);
}
void loop() {
// Check for Morse code reception
if (digitalRead(relayPinReceiving) == HIGH) {
// Receive Morse code
receiveMorseCode();
displayReceivedMessage();
delay(2000);
display.clearDisplay();
}
char key = keypad.getKey();
if (key) {
// Print the pressed key on the display
display.clearDisplay();
display.setCursor(0, 0);
display.println("Sending Message:");
display.print(key);
display.display();
// Send Morse code
sendMorseCode(key);
// Show the sent Morse code on the display
display.clearDisplay();
display.setCursor(0, 0);
display.println("Sent Message:");
display.print(key);
display.display();
}
}
void sendMorseCode(char character) {
// Convert the character to Morse code
int index = character - 'A';
if (index >= 0 && index < 26) {
const char* morse = morseCode[index];
// Send the Morse code using relay
for (int i = 0; morse[i] != '\0'; i++) {
if (morse[i] == '.') {
digitalWrite(relayPinSending, HIGH);
digitalWrite(speaker, HIGH);
tone(speaker, 450);
delay(200);
digitalWrite(relayPinSending, LOW);
digitalWrite(speaker, LOW);
noTone(speaker);
delay(200);
} else if (morse[i] == '-') {
digitalWrite(relayPinSending, HIGH);
digitalWrite(speaker, HIGH);
tone(speaker, 450);
delay(600);
digitalWrite(relayPinSending, LOW);
digitalWrite(speaker, LOW);
noTone(speaker);
delay(200);
}
}
// Delay between characters
delay(400);
}
}
void receiveMorseCode() {
// Receive the Morse code using relay
String morseCode = "";
unsigned long timeout = millis() + 3000; // Timeout after 3 seconds of no signal
while (millis() < timeout) {
if (digitalRead(relayPinReceiving) == HIGH) {
delay(100);
if (digitalRead(relayPinReceiving) == HIGH) {
morseCode += "-";
}
} else {
delay(100);
if (digitalRead(relayPinReceiving) == LOW) {
morseCode += ".";
}
}
// Check if the Morse code is complete
if (morseCode.endsWith(".......")) {
break;
}
}
// Convert the Morse code to text
String decodedMessage = decodeMorseCode(morseCode);
// Set the received message
receivedMessage = decodedMessage;
}
String decodeMorseCode(String morseCode) {
String decodedMessage = "";
String currentCode = "";
for (int i = 0; i < morseCode.length(); i++) {
if (morseCode[i] == '.' || morseCode[i] == '-') {
currentCode += morseCode[i];
} else if (morseCode[i] == ' ') {
if (currentCode.length() > 0) {
decodedMessage += decodeMorseCharacter(currentCode);
currentCode = "";
}
decodedMessage += " ";
}
}
if (currentCode.length() > 0) {
decodedMessage += decodeMorseCharacter(currentCode);
}
return decodedMessage;
}
char decodeMorseCharacter(String morseCharacter) {
for (int i = 0; i < 26; i++) {
if (morseCharacter == morseCode[i]) {
return 'A' + i;
}
}
return '?';
}
void displayReceivedMessage() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Received Message:");
display.println(receivedMessage);
display.display();
}