#include <TinyWireM.h>
#include <Tiny4kOLED.h>
String x;
const int buttonPin = PB1; // Pin where the button is connected
const int ledPin = PB3; // Pin for an LED to indicate Morse code input
//String translatedText = "";
unsigned long pressStartTime;
unsigned long lastPressTime;
unsigned long press;
bool isPressing = false;
String additionalData = "";
String morseString = "";
String combinedData;
String translatedText;
// Morse code dictionary
const char* morseCode[] = {
"01", // A
"1000", // B
"1010", // C
"100", // D
"0", // E
"0010", // F
"110", // G
"0000", // H
"00", // I
"0111", // J
"101", // K
"0100", // L
"11", // M
"10", // N
"111", // O
"0110", // P
"1101", // Q
"010", // R
"000", // S
"1", // T
"001", // U
"0001", // V
"011", // W
"1001", // X
"1011", // Y
"1100", // Z
"11111", // 0
"01111", // 1
"00111", // 2
"00011", // 3
"00001", // 4
"00000", // 5
"10000", // 6
"11000", // 7
"11100", // 8
"11110", // 9
"010101", // .
"110011", // ,
"001100", // ?
"101011" // !
};
// Corresponding characters
const char lettersNumbersAndSymbols[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,?!";
// Function to translate Morse code to text
char translateMorseToChar(String morse) {
for (int i = 0; i < 40; i++) {
if (morse.equals(morseCode[i])) {
return lettersNumbersAndSymbols[i];
}
}
return '?'; // Return '?' if no match found
}
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
//Serial.begin(9600);
oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
oled.setFont(FONT8X16); //Setting the Font as 8x16
oled.clear(); //Clearing the OLED Display
oled.on(); //Switching on the OLED Display
randomSeed(analogRead(0));
}
void loop(){ggg();}
void ggg() {
randomSeed(analogRead(0));
int buttonState = digitalRead(buttonPin);
//oled.print("State is");
//oled.print(buttonState);
if (buttonState == HIGH && !isPressing) {
isPressing = true;
pressStartTime = millis();
digitalWrite(ledPin, HIGH); // Turn on LED to indicate button press
}
if (buttonState == LOW && isPressing) {
//oled.print("State :Low");
isPressing = false;
digitalWrite(ledPin, LOW); // Turn off LED
unsigned long pressDuration = millis() - pressStartTime;
//oled.print(pressDuration);
if (pressDuration < 4000) {
//oled.print("short duration");
morseString += "0"; // Short press for dot
} else {
//oled.print("long duration");
morseString += "1"; // Long press for dash
}
lastPressTime = millis();
// Indicate Morse code entry completion
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
// Enter additional data using button presses
String additionalData = "";
int additionalDataCount = 0;
while (additionalDataCount < 5) {
buttonState = digitalRead(buttonPin);
//oled.print("read");
//oled.print(buttonState);
if (buttonState == HIGH && !isPressing) {
//oled.print("state:H");
isPressing = true;
pressStartTime = millis();
digitalWrite(ledPin, HIGH); // Turn on LED to indicate button press
}
if (buttonState == LOW && isPressing) {
//oled.print("state:L");
isPressing = false;
digitalWrite(ledPin, LOW); // Turn off LED
pressDuration = millis() - pressStartTime;
if (pressDuration < 4000) {
additionalData += "0"; // Short press for 0
} else {
additionalData += "1"; // Long press for 1
}
oled.clear(); //Clearing the OLED Display
oled.print(additionalDataCount);
additionalDataCount++;
// Indicate additional data entry completion
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
// Check if user wants to stop entering additional data
if (additionalDataCount < 5) {
delay(2000); // Wait for 2 seconds to see if more data is entered
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
break;
}
}
}
}
oled.print("out1");
// Combine Morse code and additional data
String combinedData = morseString + additionalData;
// Indicate combined data entry completion
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
oled.print("n");
oled.clear();
oled.print(morseString);
x = combinedData + morseString;
oled.print(morseString);
// Translate combined data (example translation function)
translatedText += translateMorseToChar(combinedData);
// Indicate translation completion
digitalWrite(ledPin, HIGH);
delay(2000);
digitalWrite(ledPin, LOW);
}
// Check for inactivity (2 seconds)
if (millis() - lastPressTime > 10000 && morseString.length() > 0) {
String currentMorse = "";
for (int i = 0; i < morseString.length(); i++) {
if (morseString[i] == '0' || morseString[i] == '1') {
currentMorse += morseString[i];
} else if (morseString[i] == ' ') {
translatedText += translateMorseToChar(currentMorse);
currentMorse = "";
}
}
translatedText = translatedText + translateMorseToChar(currentMorse); // Translate the last Morse code
oled.print(translatedText); // Output the translated text
morseString = ""; // Clear the Morse code string for new input
};
}