mirror of
https://github.com/dustinbrun/ESP8266-Morse-Decoder.git
synced 2025-09-15 05:19:57 +02:00
initial software
This commit is contained in:
172
morse_decoder/morse_decoder.ino
Normal file
172
morse_decoder/morse_decoder.ino
Normal file
@@ -0,0 +1,172 @@
|
||||
#include <Arduino.h>
|
||||
#include <U8g2lib.h>
|
||||
#include <Wire.h>
|
||||
|
||||
#include "private/logo_svntk.h"
|
||||
|
||||
#define BUTTON_PIN D5
|
||||
#define BUTTON_ONBOARD_PIN D6
|
||||
#define LED_PIN LED_BUILTIN
|
||||
|
||||
#define DOT_THRESHOLD 250
|
||||
#define LETTER_PAUSE 1500
|
||||
#define TEXT_CLEAR_TIMEOUT 10000
|
||||
|
||||
#define DEBOUNCE_DELAY 30
|
||||
|
||||
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
|
||||
|
||||
String currentMorse = "";
|
||||
String currentWord = "";
|
||||
|
||||
unsigned long pressStartTime = 0;
|
||||
unsigned long lastInputTime = 0;
|
||||
unsigned long lastActivityTime = 0;
|
||||
bool rawButtonState;
|
||||
bool lastButtonState = HIGH;
|
||||
bool debouncedButtonState = HIGH;
|
||||
bool isPressing = false;
|
||||
int pressDuration = 0;
|
||||
unsigned long lastDebounceTime = 0;
|
||||
|
||||
struct MorseSymbol {
|
||||
const char* code;
|
||||
char letter;
|
||||
};
|
||||
|
||||
MorseSymbol morseTable[] = {
|
||||
{".-", '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'},
|
||||
{"-----", '0'}, {".----", '1'}, {"..---", '2'}, {"...--", '3'},
|
||||
{"....-", '4'}, {".....", '5'}, {"-....", '6'}, {"--...", '7'},
|
||||
{"---..", '8'}, {"----.", '9'}
|
||||
};
|
||||
|
||||
char decodeMorse(String code) {
|
||||
for (int i = 0; i < sizeof(morseTable) / sizeof(morseTable[0]); i++) {
|
||||
if (code.equals(morseTable[i].code)) {
|
||||
return morseTable[i].letter;
|
||||
}
|
||||
}
|
||||
return '?';
|
||||
}
|
||||
|
||||
void drawStatus() {
|
||||
u8g2.clearBuffer();
|
||||
u8g2.setFont(u8g2_font_fub17_tr);
|
||||
|
||||
u8g2.drawXBMP(128 - 55, 0, 55, 16, epd_bitmap_logo); // top right corner
|
||||
|
||||
// Zeige Morsezeichen
|
||||
u8g2.drawStr(10, 20, currentMorse.c_str());
|
||||
|
||||
// Zeige dekodierten Text
|
||||
u8g2.drawStr(10, 45, currentWord.c_str());
|
||||
|
||||
// Fortschrittsbalken immer anzeigen (auch wenn nicht gedrückt)
|
||||
u8g2.drawFrame(0, 57, 127, 7);
|
||||
if (isPressing) {
|
||||
int barWidth = map(millis() - pressStartTime, 0, DOT_THRESHOLD, 0, 128);
|
||||
if (barWidth > 128) barWidth = 128;
|
||||
u8g2.drawBox(0, 57, barWidth, 7);
|
||||
}
|
||||
|
||||
u8g2.sendBuffer();
|
||||
}
|
||||
|
||||
void setup() {
|
||||
pinMode(BUTTON_PIN, INPUT_PULLUP);
|
||||
pinMode(BUTTON_ONBOARD_PIN, INPUT_PULLUP);
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
Serial.begin(115200);
|
||||
u8g2.begin();
|
||||
u8g2.enableUTF8Print();
|
||||
drawStatus();
|
||||
Serial.println("Morse Decoder bereit");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
rawButtonState = digitalRead(BUTTON_ONBOARD_PIN);
|
||||
rawButtonState &= digitalRead(BUTTON_PIN);
|
||||
unsigned long now = millis();
|
||||
|
||||
digitalWrite(LED_PIN, debouncedButtonState);
|
||||
|
||||
if (rawButtonState != lastButtonState) {
|
||||
lastDebounceTime = now;
|
||||
}
|
||||
lastButtonState = rawButtonState;
|
||||
|
||||
if ((now - lastDebounceTime) > DEBOUNCE_DELAY) {
|
||||
|
||||
if (rawButtonState != debouncedButtonState) {
|
||||
debouncedButtonState = rawButtonState;
|
||||
|
||||
// Taster gedrückt
|
||||
if (debouncedButtonState == LOW) {
|
||||
pressStartTime = now;
|
||||
isPressing = true;
|
||||
}
|
||||
// Taster losgelassen
|
||||
else {
|
||||
pressDuration = now - pressStartTime;
|
||||
lastInputTime = now;
|
||||
lastActivityTime = now;
|
||||
isPressing = false;
|
||||
|
||||
if (pressDuration < DOT_THRESHOLD) {
|
||||
currentMorse += ".";
|
||||
Serial.println("Eingabe: Punkt (.)");
|
||||
} else {
|
||||
currentMorse += "-";
|
||||
Serial.println("Eingabe: Strich (-)");
|
||||
}
|
||||
|
||||
Serial.print("Aktueller Morsecode: ");
|
||||
Serial.println(currentMorse);
|
||||
}
|
||||
}
|
||||
|
||||
// Buchstabe fertig
|
||||
if (currentMorse.length() > 0 && (now - lastInputTime > LETTER_PAUSE)) {
|
||||
char decoded = decodeMorse(currentMorse);
|
||||
Serial.print("Morse abgeschlossen: ");
|
||||
Serial.println(currentMorse);
|
||||
Serial.print("Dekodiert: ");
|
||||
Serial.println(decoded);
|
||||
|
||||
if (currentMorse.length() > 5) {
|
||||
Serial.println("Morsecode zu lang - Eingabe zurückgesetzt.");
|
||||
currentMorse = "";
|
||||
currentWord = "";
|
||||
lastActivityTime = millis();
|
||||
}
|
||||
currentMorse = "";
|
||||
|
||||
if (decoded != '?') {
|
||||
currentWord += decoded;
|
||||
if (currentWord.length() > 7) {
|
||||
currentWord = currentWord.substring(currentWord.length() - 7);
|
||||
}
|
||||
}
|
||||
|
||||
lastActivityTime = now;
|
||||
Serial.print("Aktueller Text: ");
|
||||
Serial.println(currentWord);
|
||||
}
|
||||
}
|
||||
|
||||
// Text löschen nach Timeout
|
||||
if (currentWord.length() > 0 && (now - lastActivityTime > TEXT_CLEAR_TIMEOUT)) {
|
||||
currentWord = "";
|
||||
Serial.println("Text automatisch gelöscht wegen Inaktivität.");
|
||||
}
|
||||
|
||||
drawStatus();
|
||||
}
|
||||
|
Reference in New Issue
Block a user