#include <LiquidCrystal_I2C.h> // Includerea bibliotecii LCD1602
#define DOT_DURATION 250 // Durata unui punct în milisecunde
#define DASH_DURATION 3 * DOT_DURATION // Durata unui dash este de 3 ori mai mare decât cea a unui punct
#define SYMBOL_SPACE DOT_DURATION // Durata între simboluri într-un caracter Morse
#define WORD_SPACE 7 * DOT_DURATION // Durata între cuvinte
#define BUTTON_COUNT 4 // Numărul de butoane
#define SPEAKER_PIN 8 // Pinul la care este conectat difuzorul
#define LED_PIN_RED 4 // Pinul la care este conectat LED-ul roșu
#define LED_PIN_GREEN 5 // Pinul la care este conectat LED-ul verde
#define LED_PIN_BLUE 9 // Pinul la care este conectat LED-ul albastru
#define SWITCH_PIN 7 // Pinul la care este conectat comutatorul
// Definirea obiectului pentru LCD1602
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definirea pinurilor butoanelor
const uint8_t buttonPins[BUTTON_COUNT] = {13, 12, 11, 10};
bool switchState;
// Definirea cuvintelor corespunzătoare fiecărui buton
const char* buttonWords[BUTTON_COUNT] = {"UPT", "AC", "INFORMATICA", "SISTEME INCORPORATE"};
// Declarația variabilei lastButtonPressTime în afara buclei loop()
static unsigned long lastButtonPressTime[BUTTON_COUNT] = {0};
void setup() {
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(LED_PIN_RED, OUTPUT);
pinMode(LED_PIN_GREEN, OUTPUT);
pinMode(LED_PIN_BLUE, OUTPUT);
pinMode(SWITCH_PIN, INPUT_PULLUP); // Comutatorul este conectat la GND când este apăsat
// Inițializarea pinilor butoanelor ca input cu pull-up
for (int i = 0; i < BUTTON_COUNT; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
Serial.begin(9600); // Inițializarea comunicării seriale pentru afișarea în consolă
}
void loop() {
// Verificare starea comutatorului
switchState = digitalRead(SWITCH_PIN);
// Dacă comutatorul este în poziția "ON" (dreapta), procesăm butoanele
if (switchState == LOW) {
digitalWrite(LED_PIN_RED, LOW); // Stingem LED-ul roșu
digitalWrite(LED_PIN_GREEN, HIGH); // Aprindem LED-ul verde
lcd.init(); // Inițializarea LCD1602
lcd.backlight(); // Aprinderea backlight-ului LCD1602
displayMessage("Apasa un buton");
// Verificarea fiecărui buton și apelarea funcției transmitMorseWithLCD dacă un buton este apăsat
for (int i = 0; i < BUTTON_COUNT; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
// Verificăm dacă a trecut suficient timp de la ultima apăsare de buton
if (millis() - lastButtonPressTime[i] > 100) {
lastButtonPressTime[i] = millis();
Serial.print("Button pressed: ");
Serial.println(buttonWords[i]);
transmitMorseWithLCD(buttonWords[i]);
}
}
}
} else {
digitalWrite(LED_PIN_GREEN, LOW); // Stingem LED-ul roșu
digitalWrite(LED_PIN_RED, HIGH); // Aprindem LED-ul verde
lcd.noBacklight();
lcd.noDisplay();
}
}
void transmitMorseWithLCD(const char* word) {
// Afisare cuvant pe LCD
lcd.clear();
lcd.print(word);
delay(1000);
// Transmiterea codului Morse și afișarea pe LCD
for (int i = 0; word[i] != '\0'; i++) {
char c = toupper(word[i]); // Convertirea caracterului la majusculă
const char *morseCode = getMorseCode(c);
// Ștergere display
lcd.clear();
// Afișare literă și cod Morse
lcd.print(c);
lcd.print(": ");
lcd.print(morseCode);
// Transmiterea și redarea sunetului corespunzător caracterului
transmitSymbol(morseCode);
delay(SYMBOL_SPACE); // Pauză între semnalele Morse
}
}
void transmitSymbol(const char *symbol) {
for (int i = 0; symbol[i] != '\0'; i++) {
if (symbol[i] == '.') {
transmitDot(); // Transmitere punct
} else if (symbol[i] == '-') {
transmitDash(); // Transmitere cratimă
}
delay(SYMBOL_SPACE); // Pauză între semnalele Morse
}
}
void transmitDot() {
digitalWrite(LED_PIN_BLUE, HIGH);
tone(SPEAKER_PIN, 1000, DOT_DURATION);
delay(DOT_DURATION);
digitalWrite(LED_PIN_BLUE, LOW);
noTone(SPEAKER_PIN);
delay(DOT_DURATION); // Pauză între puncte
}
void transmitDash() {
digitalWrite(LED_PIN_BLUE, HIGH);
tone(SPEAKER_PIN, 1000, DASH_DURATION);
delay(DASH_DURATION);
digitalWrite(LED_PIN_BLUE, LOW);
noTone(SPEAKER_PIN);
delay(DOT_DURATION); // Pauză între puncte
}
const char *getMorseCode(char c) {
// Tabelul de traducere Morse
const char *morseTable[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---",
"-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-",
"..-", "...-", ".--", "-..-", "-.--", "--.."};
return morseTable[c - 'A'];
}
// Funcție pentru afișarea unui mesaj pe LCD
void displayMessage(const char* message) {
lcd.clear();
lcd.print(message);
}