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:

  • Avem un mesaj cu numele proiectului ca un starting screen pe LCD;
  • Dupa prima apasare de buton putem incepe sa introducem caractere in format morse si se vor afisa pe LCD sub forma literelor din alfabetul latin sau cifre.
  • La fiecare apasare a butonului in functie de tipul de apasare un buzzer v-a scoate sunet.
  • Ne folosim de un 4 digits 7 segments display si un LED pentru a arata cand se scrie un caracter liber creeand spatiu intre litere/cuvinte/cifre.
  • La terminarea randului se va curata tot randul astfel se va lua de la capat un mesaj nou.

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:

  • Funtii pentru a arata cifrele pe display folosind 2 cifre

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:

  • Folosind constante pentru litere si cifre reusim sa citim datele transmise de la apasarea butonului si sa reusim sa le afisam pe LCD

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

  • Am reusit sa duc la bun sfarsit acest proiect, reusind sa fac din ceva simplu, ceva putin mai complicat imbinand elemente din laboratoare cu elemente noi.
  • Am invatat sa fac chestii mici legate de Hardware care au fost interesante si am invatat multe chestii din aceasta experienta.
  • Mi-a placut cum am reusit sa leg ceva de cultura generala(Vorbitul prin codul morse) cu un proiect de facultate, experienta fiind una placuta.
  • Am renuntat la un LCD cu butoane doarece am avut un breadboard prea mic si nu aveam loc sa il pun si am optat pentru optiunea cu un LCD si un buton.
  • Pe vara intentionez sa mai adaug un modul bluetooth sau WiFi pentru a trimite mesajele scrise la finalul randului sau adaugarea unui LCD mai mare si ulterior trimiterea unui mesaj mult mai lung.

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

pm/prj2024/amocanu/rares_mihai.florea.txt · Last modified: 2024/05/27 16:12 by rares_mihai.florea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0