Возможно ли реализовать на базе ардуино ?
- Войдите на сайт для отправки комментариев
Сб, 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].
это не говоря про код. который весьма далек от оптимального