Schema electrica:
Rezultate simulari:
Librării utilizate:
Setup-ul:
void setup() {
// Set segment pins as outputs for (int i = 0; i < 7; i++) { pinMode(segmentPins[i], OUTPUT); digitalWrite(segmentPins[i], LOW); }
// Set digit pins as outputs for (int i = 0; i < 2; i++) { pinMode(digitPins[i], OUTPUT); digitalWrite(digitPins[i], LOW); }
pinMode(buttonPin, INPUT_PULLUP); pinMode(buzzerPin, OUTPUT); pinMode(ledPin, OUTPUT); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Morse Decoder");
}
Loop: Principala logica este urmatoarea:
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) { if (!isPressed) { pressStartTime = millis(); isPressed = true; tone(buzzerPin, 1000); } } else { if (isPressed) { unsigned long pressDuration = millis() - pressStartTime; if (pressDuration > debounceDelay) { if (!ignoreFirstPress) { if (pressDuration > 400) { morseCode += "-"; } else { morseCode += "."; } } } lastPressTime = millis(); isPressed = false; noTone(buzzerPin); // Stop the buzzer when the button is released
if (!firstSignalReceived) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Message: "); firstSignalReceived = true; } ignoreFirstPress = false; } }
// Check if we should decode the Morse code if (morseCode.length() > 0 && millis() - lastPressTime > 1000) { char decodedChar = decodeMorse(morseCode); decodedMessage += decodedChar; morseCode = "";
if (charCount >= 16) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Message: "); lcd.setCursor(0, 1); charCount = 0; }
lcd.setCursor(charCount, 1); // Display decoded message on the second line lcd.print(decodedChar); charCount++; }
// Update the 7-segment display with the elapsed time if first signal received if (firstSignalReceived) { unsigned long elapsedTime = (millis() - lastPressTime) / 100; displayTime(elapsedTime); }
// Check if 3 seconds have passed since the last press if (firstSignalReceived && millis() - lastPressTime > spaceTimeout && morseCode.length() == 0) { if (!isLedOn) { decodedMessage += ' ';
if (charCount >= 16) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Message: "); lcd.setCursor(0, 1); charCount = 0; }
lcd.setCursor(charCount, 1); lcd.print(' '); charCount++;
digitalWrite(ledPin, HIGH); // Turn on the LED when a space is inserted isLedOn = true; ledTurnedOnAt = millis(); } }
if (isLedOn && millis() - ledTurnedOnAt > ledOnTime) { digitalWrite(ledPin, LOW); // Turn off the LED isLedOn = false; lastPressTime = millis(); }
}
4 digits 7 segments display:
void displayTime(unsigned long time) {
// Convert the time to an array of digits int digits[] = { (time / 10) % 10, time % 10 };
// Display each digit for (int i = 0; i < 2; i++) { displayDigit(digits[i], i); }
}
void displayDigit(int digit, int position) {
// Turn off all digits for (int i = 0; i < 2; i++) { digitalWrite(digitPins[i], LOW); }
// Set the segments for the digit for (int i = 0; i < 7; i++) { digitalWrite(segmentPins[i], (digitPatterns[digit] >> i) & 0x01); }
digitalWrite(digitPins[position], HIGH);
delay(5);
}
Descifrare cod morse:
const char* morseLetters[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
const char* morseDigits[] = {
"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."
};
char decodeMorse(String code) {
for (int i = 0; i < 26; i++) { if (code == morseLetters[i]) { return 'A' + i; } } for (int i = 0; i < 10; i++) { if (code == morseDigits[i]) { return '0' + i; } } return ' ';
}