Table of Contents

Morse code decoder

Introducere

Prezentarea pe scurt a proiectului vostru:

  • Un mod interactiv pentru traducerea unei fraze din cod morse;
  • Conceperea unei fraze scurte cu ajutorul timer-ului pentru spatiere a cuvintelor;
  • Ajuta lumea intr-un mod interactiv si fun in invatarea codului morse si testarea capacitatilor

Descriere generală

O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. Pe display se afiseaz numele proiectului “Morse Decoder”, iar dupa prima apasare a butonului se pot introduce litere sau cifre in format morse fiind ajutat de un semnal sonor pentru a face diferenta intre ”.” si ”-” astfel se pot scrie diferite mesaje. Pentru a construii diferite cuvinte,ne uitam la 4 digits 7 segment pentru a vedea cat timp trebuie sa asteptam pana se va scrie un caracter gol , un caracter spatiu, in cazul in care nu ne dam seama ca timpul trece la afisajul cu 7 segmente, antetia ne este captata de LED care asigura faptul ca a trecut timpul si se scrie un spatiu. La finalul randului se va goli mesajul transmis pana atunci si se va continua pe acelasi rand.

Schemă bloc:

Hardware Design

Lista piese:

  • Arduino NANO:
  • LCD 16×2;
  • Buzzer;
  • 4 Digits 7 Segments;
  • LED rosu;
  • Buton;
  • Fire;
  • Rezistenta 100Ω;
  • 3 xRezistente 330Ω;

Schema electrica:

Rezultate simulari:

Software Design

Mediu de dezvoltare:

  • Arduino IDE

Librării utilizate:

  • <LiquidCrystal_I2C.h>
  • <Wire.h>

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 ' ';

}

Concluzii

Download

Jurnal

  • 8 mai: mi-au ajuns piesele necesare inceperii proiectului;
  • 11 mai:am inceput implementarea hardware si am amplasat piesele pe breadboard;
  • 15 mai:am montat LCD ul la implementarea hardware(primul era prea mare si nu incapea pe breadboard si avea prea multi pini);
  • 19 mai:am testat functionarea corecta a componentelor implementand bucatile de software;
  • 25 mai:am verificat functionalitatile proiectului invatand cateva litere in codul morse.

Bibliografie/Resurse