const int ledPin = 13; // Пін, до якого підключено світлодіод
const int buzzerPin1 = 8; // Пін 1 для зумера
const int buzzerPin2 = 9; // Пін 2 для зумера (для протифазної роботи)
const int buttonPin = 7; // Пін для підключення кнопки
bool messageSent = false; // Флаг, що показує, чи було надіслано повідомлення
// Таблиця для перетворення символів на Морзе
struct MorseCode {
char character;
const char* code;
} 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', "----."},
{' ', " "}, {'.', ".-.-.-"}
};
const int tableSize = sizeof(morseTable) / sizeof(MorseCode);
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin1, OUTPUT); // Налаштування піну для зумера
pinMode(buzzerPin2, OUTPUT); // Налаштування протифазного піну для зумера
pinMode(buttonPin, INPUT_PULLUP); // Налаштування кнопки з pull-up
digitalWrite(ledPin, LOW); // Вимкнути діод на початку
digitalWrite(buzzerPin1, LOW); // Вимкнути зумер на початку
digitalWrite(buzzerPin2, LOW); // Вимкнути протифазу зумера на початку
}
void loop() {
// Якщо кнопка натиснута і повідомлення ще не відправлено
if (digitalRead(buttonPin) == LOW && !messageSent) {
String message = "HELLO WORLD."; // Ваше повідомлення
sendMessage(message);
messageSent = true; // Повідомлення було надіслано
}
// Якщо кнопка натиснута ще раз, скидаємо флаг і чекаємо на повторне натискання
if (digitalRead(buttonPin) == LOW && messageSent) {
messageSent = false;
}
}
void sendMessage(String msg) {
msg.toUpperCase(); // Приведення повідомлення до верхнього регістру
for (int i = 0; i < msg.length(); i++) {
char c = msg.charAt(i);
const char* morse = getMorseCode(c); // Отримати код Морзе для символу
if (morse != NULL) {
if (c == ' ') {
delay(7 * unit()); // Перерва між словами
} else if (c == '.') {
sendMorseCode(morse);
delay(7 * unit()); // Завершення повідомлення
} else {
sendMorseCode(morse);
delay(3 * unit()); // Перерва між літерами
}
}
}
}
const char* getMorseCode(char c) {
for (int i = 0; i < tableSize; i++) {
if (morseTable[i].character == c) {
return morseTable[i].code;
}
}
return NULL; // Якщо символ не знайдено
}
void sendMorseCode(const char* code) {
for (int i = 0; code[i] != '\0'; i++) {
if (code[i] == '.') {
dot(); // Виведення крапки
} else if (code[i] == '-') {
dash(); // Виведення тире
}
delay(unit()); // Перерва між сигналами в одному символі
}
}
void dot() {
digitalWrite(ledPin, HIGH); // Увімкнути світлодіод
buzz(1); // Активувати зумер
delay(unit()); // Тривалість крапки
digitalWrite(ledPin, LOW); // Вимкнути світлодіод
buzz(0); // Вимкнути зумер
delay(unit()); // Затримка після крапки
}
void dash() {
digitalWrite(ledPin, HIGH); // Увімкнути світлодіод
buzz(1); // Активувати зумер
delay(3 * unit()); // Тривалість тире
digitalWrite(ledPin, LOW); // Вимкнути світлодіод
buzz(0); // Вимкнути зумер
delay(unit()); // Затримка після тире
}
// Функція для керування зумером у режимі push-pull
void buzz(int state) {
if (state == 1) {
// Активувати зумер у протифазі з частотою 1 кГц
for (int i = 0; i < 1000; i++) {
digitalWrite(buzzerPin1, HIGH);
digitalWrite(buzzerPin2, LOW);
delayMicroseconds(500); // Половина періоду 1 кГц
digitalWrite(buzzerPin1, LOW);
digitalWrite(buzzerPin2, HIGH);
delayMicroseconds(500); // Половина періоду 1 кГц
}
} else {
// Вимкнути зумер
digitalWrite(buzzerPin1, LOW);
digitalWrite(buzzerPin2, LOW);
}
}
unsigned long unit() {
return 200; // Тривалість одиниці часу в мілісекундах (налаштовується)
}