#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <UniversalTelegramBot.h>
#include <WiFiClientSecure.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Set up Wi-Fi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Telegram bot setup
#define BOT_TOKEN "7710160798:AAGK_HPIrEZlwiWdpEmESuPhkuMZTnGG0jw" // Replace with your Bot token
#define CHAT_ID "6349675113" // Replace with your chat ID
WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);
const int dotButtonPin = 15; // Pin for dot button
const int dashButtonPin = 2; // Pin for dash button
const int resetButtonPin = 4; // Pin for reset button
const int ledPin = 13; // Pin for LED
const int buzzerPin = 5; // Pin for buzzer
String morseAlphabet[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---",
"-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-",
"..-", "...-", ".--", "-..-", "-.--", "--.."
};
char alphabet[] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z'
};
String currentMorse = "";
String currentText = "";
unsigned long lastButtonPressTime = 0;
const unsigned long debounceDelay = 250; // Debounce delay
bool isDotPressed = false;
bool isDashPressed = false;
void setup() {
lcd.init(); // Initialize LCD
lcd.backlight(); // Turn on LCD backlight
pinMode(dotButtonPin, INPUT_PULLUP); // Dot button
pinMode(dashButtonPin, INPUT_PULLUP); // Dash button
pinMode(resetButtonPin, INPUT_PULLUP); // Reset button
pinMode(ledPin, OUTPUT); // LED pin
pinMode(buzzerPin, OUTPUT); // Buzzer pin
lcd.setCursor(0, 0);
lcd.print("Morse: ");
// Connect to Wi-Fi
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
void loop() {
int dotButtonState = digitalRead(dotButtonPin);
int dashButtonState = digitalRead(dashButtonPin);
int resetButtonState = digitalRead(resetButtonPin);
// Handle dot input
if (dotButtonState == LOW && !isDotPressed && millis() - lastButtonPressTime > debounceDelay) {
isDotPressed = true;
currentMorse += ".";
digitalWrite(ledPin, HIGH);
digitalWrite(buzzerPin, HIGH);
lcd.setCursor(6, 0);
lcd.print(currentMorse);
lastButtonPressTime = millis();
delay(100); // Ensure button press is detected
}
if (dotButtonState == HIGH) {
isDotPressed = false;
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW);
}
// Handle dash input
if (dashButtonState == LOW && !isDashPressed && millis() - lastButtonPressTime > debounceDelay) {
isDashPressed = true;
currentMorse += "-";
digitalWrite(ledPin, HIGH);
digitalWrite(buzzerPin, HIGH);
lcd.setCursor(6, 0);
lcd.print(currentMorse);
lastButtonPressTime = millis();
delay(100); // Ensure button press is detected
}
if (dashButtonState == HIGH) {
isDashPressed = false;
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW);
}
// If enough time has passed, interpret Morse code
if (millis() - lastButtonPressTime > 1000 && currentMorse.length() > 0) {
char letter = morseToAlphabet(currentMorse);
currentText += letter;
currentMorse = ""; // Reset Morse for next input
lcd.setCursor(0, 1);
lcd.print("Huruf: " + currentText);
if (letter == '?') {
delay(500); // Display '?' for 500ms
currentText.remove(currentText.length() - 1); // Remove '?'
lcd.setCursor(0, 1);
lcd.print("Huruf: " + currentText + " "); // Clear last position
}
// Send Morse code to Telegram
sendMorseToTelegram(currentMorse);
lcd.setCursor(6, 0);
lcd.print(" "); // Clear Morse line
}
// Handle reset button
if (resetButtonState == LOW) {
currentText = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Morse: ");
lcd.setCursor(0, 1);
lcd.print("Huruf: ");
sendMorseToTelegram("Morse code has been reset"); // Send reset message to Telegram
delay(500); // Ensure reset button is detected clearly
}
}
char morseToAlphabet(String morse) {
for (int i = 0; i < 26; i++) {
if (morse == morseAlphabet[i]) {
return alphabet[i];
}
}
return '?'; // Return '?' if Morse code is invalid
}
void sendMorseToTelegram(String morseCode) {
if (WiFi.status() == WL_CONNECTED) {
String message = "Kode Morse: " + morseCode;
bot.sendMessage(CHAT_ID, message, "");
delay(1000); // To avoid multiple sends too quickly
} else {
Serial.println("WiFi Disconnected, Reconnecting...");
WiFi.begin(ssid, password); // Reconnect WiFi if disconnected
}
}