Возможно ли реализовать на базе ардуино ?
- Войдите на сайт для отправки комментариев
Сб, 15/12/2018 - 16:25
Ув. программисты,
Ниже приведен код передатчика Морзе. Работает так, что при помощи потенциометра выбираем букву из английского алфавита, нажимаем кнопку - записываем букву в массив и тд до момента, пока нужное сообщение для отправки не составлено, тогда делаем двойной клик по второй кнопке и сообщение начинает проигрываться в динамике в виде сигналов из азбуки Морзе.
////Передатчик Морзе #include <OneButton.h> //Используемые переменные OneButton button1_1(6, 1); //та же кнопка на пине 6, но с функцией OneButton doubleclick bool button; //главная кнопка bool button1; //кнопка отправки сообщения (пин 6) bool confirm; int selector; //потенциометр выбора букв (пин A0); char alphabet[26] = {'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'}; char morseChar; //переменная хранит букву, чтобы выводить нужную последовательность звуков Морзе char message[128]; //конечное сообщение, которое будет отправлено int n = 0; //номер ячейки для записи в массив message[] char currentChar; //текущая буква int check = 0; //переменная, отвечающая за порядок выполнения действий в основном цикле int check1 = 0; //дополнительный чек, для выхода из цикла с вводом букв при помощи потенциометра void setup() { pinMode(4, OUTPUT); //динамик (MOSFET-модуль) pinMode(5, INPUT_PULLUP); //главная кнопка управления pinMode(A0, INPUT); pinMode(6, INPUT_PULLUP); Serial.begin(9600); button1_1.attachDoubleClick(doubleclick); } void loop() { button1_1.tick(); //опрос кнопки button = !digitalRead(5); selector = analogRead(A0); check = 0; ////Основной цикл if (check == 0) { confirm = 0; //сбрасываем подтверждение //Настраиваем потенциометр на вывод букв алфавита. selector = map(selector, 0, 1023, 0, 26); Serial.println(alphabet[selector]); if (button == 1) //если нажали кнопку, то... { //...записываем текущую букву в массив конечного сообщения и готовим следующую ячейку для записи currentChar = alphabet[selector]; message[n] = currentChar; n++; check = 1; //Просим пользователя подтвердить выбор нажатием доп. кнопки (это также защита от дребезка, проклика) while (check == 1) { button1 = !digitalRead(6); if (button1 == 1) { confirm = 1; check = 0; //выходим отсюда } } } delay(50); //для стабильности //если нажали даблклик по button1 (button1_1), то выводим окончательный ответ message if (check1 == 2) { check = 2; } if (n == 127) //если массив message[] заполнен { check = 2; } } //Если пользователь завершил ввод, то if (check == 2) { //Выводим содержимое массива message[] for (int i = 0; i < n; i++) { Serial.print(message[i]); } Serial.println(""); //переходим на новую строку //======================================================== //Выходим из основного цикла //Выводим на экран просьбу перезапустить устройство для повторного использования while (1 == 1 && check != 3) { button1 = !digitalRead(6); //Если пользователь нажал кнопку отправки, то выводим... if (button1 == 1) { while (1 == 1 && check != 3) { Serial.println("Сообщение отправляется"); delay(2000); //Отключаем подсветку экрана для экономии энергии for (int i = 10; i <= 10; i--) { Serial.print("Экран будет отключен через "); Serial.print(i); Serial.println("с"); delay(1000); if (i == 0) { //переходим к воспроизведению звуков через азбуку Морзе check = 3; goto morse; } } } } } } ////====Воспроизводим Морзе====//// morse: if (check == 3) { while (1 == 1) { //Еще раз пробегаем по массиву message[], для вывода нужной последовательности Морзе for (int i = 0; i < n; i++) { morseChar = message[i]; //Начинаем воспроизводить последовательность звуков Морзе в зависимости от значения переменной morseChar if (morseChar == 'a') { dot(); dash(); delay(500); //500мс отделяем буквы друг от друга) } if (morseChar == 'b') { dash(); dot(); dot(); dot(); delay(500); } if (morseChar == 'c') { dash(); dot(); dash(); dot(); delay(500); } if (morseChar == 'd') { dash(); dot(); dot(); delay(500); } if (morseChar == 'e') { dot(); delay(500); } if (morseChar == 'f') { dot(); dot(); dash(); dot(); delay(500); } if (morseChar == 'g') { dash(); dash(); dot(); delay(500); } if (morseChar == 'h') { dot(); dot(); dot(); dot(); delay(500); } if (morseChar == 'i') { dot(); dot(); delay(500); } if (morseChar == 'j') { dot(); dash(); dash(); dash(); delay(500); } if (morseChar == 'k') { dash(); dot(); dash(); delay(500); } if (morseChar == 'l') { dot(); dash(); dot(); dot(); delay(500); } if (morseChar == 'm') { dash(); dash(); delay(500); } if (morseChar == 'n') { dash(); dot(); delay(500); } if (morseChar == 'o') { dash(); dash(); dash(); delay(500); } if (morseChar == 'p') { dot(); dash(); dash(); dot(); delay(500); } if (morseChar == 'q') { dash(); dash(); dot(); dash(); delay(500); } if (morseChar == 'r') { dot(); dash(); dot(); delay(500); } if (morseChar == 's') { dot(); dot(); dot(); delay(500); } if (morseChar == 't') { dash(); delay(500); } if (morseChar == 'u') { dot(); dot(); dash(); delay(500); } if (morseChar == 'v') { dot(); dot(); dot(); dash(); delay(500); } if (morseChar == 'w') { dot(); dash(); dash(); delay(500); } if (morseChar == 'x') { dash(); dot(); dot(); dash(); delay(500); } if (morseChar == 'y') { dash(); dot(); dash(); dash(); delay(500); } if (morseChar == 'z') { dash(); dash(); dot(); dot(); delay(500); } } } } } ////====Morse====//// void dot() //точка { tone(4, 1500, 100); delay(200); } void dash() //тире { tone(4, 1500, 200); delay(300); } ////====OneButton====//// void doubleclick() { check1 = 2; //выводим содержимое массива message[] }
Вопрос такой, можно ли на базе ардуино реализовать похожее устройство, но с передачей сигнала Морзе по радиоэфиру, а не через динамик ? Если есть подобные модули, то подскажите, пожалуйства.
BigMeister, зачем Вы пытаетесь реализовать то, в чем абсолютно не разбираетесь?
BigMeister, зачем Вы пытаетесь реализовать то, в чем абсолютно не разбираетесь?
Я поэтому и спрашиваю.
Не нужно этого делать. От слова "совсем". Потому как пользы - никакой, а вред - есть.
Практически любая программа относится к некоторой предметной области: физика, медицина, передача информации, обработка изображений и пр.
Чтобы написать программу, надо разбираться как в предметной облшасти, так и в программировании.
При этом:
1. Если автор программы разбирается и в том, и в другом, можно ожидать, что у него получится вменяемая и полезная программа.
2. Если человек разбирается в предметной области, но не разбирается в программировании, можно ожидать, что его программой с нгекоторым трудом можно будет пользоваться.
3. Если человек разбирается в программировании и не разбирается в предметной области, вменяемую программу он не напишет. Она будет давать неверные результаты, а поому будет просто вредна.
4. Если человек не разбирается ни в том, ни в другом, то непонятно вообще, зачем он за это взялся.
IMHO единственный вариант, который представляет интерес для форума, это №2. Здесь человеку можно помочь.
В случае №1 человек и сам справится безо всякой помощи.
А в случаях 3 и 4 можно порекомендовать сначала зарегистироваться на форуме, посвященном морзянке, и только после того, как последняя будет освоена, возвращаться на форум Ардуино.
И не раньше!
1. Возможно
2. Вам об этом уже говорили и даже пример на AtMege показывали ( #2 )
Вопрос такой, можно ли на базе ардуино реализовать похожее устройство, но с передачей сигнала Морзе по радиоэфиру, а не через динамик ? Если есть подобные модули, то подскажите, пожалуйства.
Можно. Даже без ничего. Только Ардуино.
Не нужно этого делать. От слова "совсем". Потому как пользы - никакой, а вред - есть.
Практически любая программа относится к некоторой предметной области: физика, медицина, передача информации, обработка изображений и пр.
Чтобы написать программу, надо разбираться как в предметной облшасти, так и в программировании.
При этом:
1. Если автор программы разбирается и в том, и в другом, можно ожидать, что у него получится вменяемая и полезная программа.
2. Если человек разбирается в предметной области, но не разбирается в программировании, можно ожидать, что его программой с нгекоторым трудом можно будет пользоваться.
3. Если человек разбирается в программировании и не разбирается в предметной области, вменяемую программу он не напишет. Она будет давать неверные результаты, а поому будет просто вредна.
4. Если человек не разбирается ни в том, ни в другом, то непонятно вообще, зачем он за это взялся.
IMHO единственный вариант, который представляет интерес для форума, это №2. Здесь человеку можно помочь.
В случае №1 человек и сам справится безо всякой помощи.
А в случаях 3 и 4 можно порекомендовать сначала зарегистироваться на форуме, посвященном морзянке, и только после того, как последняя будет освоена, возвращаться на форум Ардуино.
И не раньше!
"Если человек не разбирается ни в том, ни в другом, то непонятно вообще, зачем он за это взялся.". Т.е. никакого развития ни в программировании, ни в понимании предметной части не будет.
1) Я так понял, что Вам не понравилась моя программа, но тогда почему бы не подсказать, в какой области ошибка. Я потому и прикрепил код, чтобы знающие люди поправили, если что. Но вопрос, кстати, заключается не в работоспособности кода.
P.S. программу я протестировал, приложение по декодированию Морзе определяет тот текст, который был записан.
2) Почему любой проект на Ардуино должен приносит практическую пользу ? Их можно создавать для развития навыков или для развлечения.
"пользы - никакой, а вред - есть.", - только если радиус действия задуманного устройства будет превышать 1 метр.
3) Вы явно разбираетесь как в аппаратной, так и в програмной части Ардуино, но тогда мне не совсем понятно, для чего вышенаписанный Вами комментарий.
BigMeister, еще раз:
Вам нужно сначала разобраться с морзянкой и только потом пытаться ее программировать.
Вы не с того начали.
P.S. программу я протестировал, приложение по декодированию Морзе определяет тот текст, который был записан.
Я не знаю, какое "приложение по декодированию Морзе" Вы используете. И, тем более, я не знаю квалификацию автора этого приложения (может, она такая же, как и у Вас?).
Но даже если предположить, что автор этого "приложения" вполне квалифицированный специалист, он непременно должен был рассчитывать на передачу человеком, который в принципе не способен математически точно выдержать нужные длительности. Значит, он неизбежно вынужден был округлять принятые длительности. Вероятнее всего, (если это специалист) что это округление настроено так, чтобы безошибочно принимать сигнал с наибольшим отклонением от стандарта.
Отсюда следует вывод, что пройти этот тест может и нестандартный сигнал. И даже сильно нестандартный. Вплоть до того, что такой сигнал бьудет совершенно невозможно распознать на слух, а программа его будет безошибочно распознавать.
Ваш сигнал формируется явно не по стандарту. Раз Вы об этом не знаете, значит, Вы не знаете даже элементарнейших основ морзянки. А поэтому писать программы на эту темы Вам явно противопоказано.
BigMeister
Вам намекают на то, что реализованная вами "морзянка" имеет крайне слабое отношение к коду Морзе. Я весьма далек от радиотехники - и то сразу вижу. что длительности сигналов в вашей программе "кто в лес кто по дрова"
википедию что ли, открыли бы для начала:
Код Мо́рзе — способ знакового кодирования, представление букв алфавита, цифр, знаков препинания и других символов последовательностью сигналов: длинных («тире») и коротких («точек»)[1]). За единицу времени принимается длительность одной точки. Длительность тире равна трём точкам. Пауза между элементами одного знака — одна точка, между знаками в слове — 3 точки, между словами — 7 точек[2].
это не говоря про код. который весьма далек от оптимального