Возможно ли реализовать на базе ардуино ?

BigMeister
Offline
Зарегистрирован: 11.02.2018

Ув. программисты,

Ниже приведен код передатчика Морзе. Работает так, что при помощи потенциометра выбираем букву из английского алфавита, нажимаем кнопку - записываем букву в массив и тд до момента, пока нужное сообщение для отправки не составлено, тогда делаем двойной клик по второй кнопке и сообщение начинает проигрываться в динамике в виде сигналов из азбуки Морзе. 

////Передатчик Морзе

#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[]
}

Вопрос такой, можно ли на базе ардуино реализовать похожее устройство, но с передачей сигнала Морзе по радиоэфиру, а не через динамик ? Если есть подобные модули, то подскажите, пожалуйства. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BigMeister, зачем Вы пытаетесь реализовать то, в чем абсолютно не разбираетесь?

BigMeister
Offline
Зарегистрирован: 11.02.2018

andriano пишет:

BigMeister, зачем Вы пытаетесь реализовать то, в чем абсолютно не разбираетесь?

Я поэтому и спрашиваю. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не нужно этого делать. От слова "совсем". Потому как пользы - никакой, а вред - есть.

Практически любая программа относится к некоторой предметной области: физика, медицина, передача информации, обработка изображений и пр.

Чтобы написать программу, надо разбираться как в предметной облшасти, так и в программировании. 

При этом:

1. Если автор программы разбирается и в том, и в другом, можно ожидать, что у него получится вменяемая и полезная программа.

2. Если человек разбирается в предметной области, но не разбирается в программировании, можно ожидать, что его программой с нгекоторым трудом можно будет пользоваться.

3. Если человек разбирается в программировании и не разбирается в предметной области, вменяемую программу он не напишет. Она будет давать неверные результаты, а поому будет просто вредна.

4. Если человек не разбирается ни в том, ни в другом, то непонятно вообще, зачем он за это взялся.

 

IMHO единственный вариант, который представляет интерес для форума, это №2. Здесь человеку можно помочь.

В случае №1 человек и сам справится безо всякой помощи.

А в случаях 3 и 4 можно порекомендовать сначала зарегистироваться на форуме, посвященном морзянке, и только после того, как последняя будет освоена, возвращаться на форум Ардуино. 

И не раньше!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Возможно

2. Вам об этом уже говорили и даже пример на AtMege показывали ( #2 )

Green
Offline
Зарегистрирован: 01.10.2015

BigMeister пишет:

Вопрос такой, можно ли на базе ардуино реализовать похожее устройство, но с передачей сигнала Морзе по радиоэфиру, а не через динамик ? Если есть подобные модули, то подскажите, пожалуйства. 

Можно. Даже без ничего. Только Ардуино. 

BigMeister
Offline
Зарегистрирован: 11.02.2018

andriano пишет:

Не нужно этого делать. От слова "совсем". Потому как пользы - никакой, а вред - есть.

Практически любая программа относится к некоторой предметной области: физика, медицина, передача информации, обработка изображений и пр.

Чтобы написать программу, надо разбираться как в предметной облшасти, так и в программировании. 

При этом:

1. Если автор программы разбирается и в том, и в другом, можно ожидать, что у него получится вменяемая и полезная программа.

2. Если человек разбирается в предметной области, но не разбирается в программировании, можно ожидать, что его программой с нгекоторым трудом можно будет пользоваться.

3. Если человек разбирается в программировании и не разбирается в предметной области, вменяемую программу он не напишет. Она будет давать неверные результаты, а поому будет просто вредна.

4. Если человек не разбирается ни в том, ни в другом, то непонятно вообще, зачем он за это взялся.

 

IMHO единственный вариант, который представляет интерес для форума, это №2. Здесь человеку можно помочь.

В случае №1 человек и сам справится безо всякой помощи.

А в случаях 3 и 4 можно порекомендовать сначала зарегистироваться на форуме, посвященном морзянке, и только после того, как последняя будет освоена, возвращаться на форум Ардуино. 

И не раньше!

"Если человек не разбирается ни в том, ни в другом, то непонятно вообще, зачем он за это взялся.". Т.е. никакого развития ни в программировании, ни в понимании предметной части не будет.

1) Я так понял, что Вам не понравилась моя программа, но тогда почему бы не подсказать, в какой области ошибка. Я потому и прикрепил код, чтобы знающие люди поправили, если что. Но вопрос, кстати, заключается не в работоспособности кода. 

P.S. программу я протестировал, приложение по декодированию Морзе определяет тот текст, который был записан.

2) Почему любой проект на Ардуино должен приносит практическую пользу ? Их можно создавать для развития навыков или для развлечения. 

"пользы - никакой, а вред - есть.", - только если радиус действия задуманного устройства будет превышать 1 метр.

3) Вы явно разбираетесь как в аппаратной, так и в програмной части Ардуино, но тогда мне не совсем понятно, для чего вышенаписанный Вами комментарий. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BigMeister, еще раз:

Вам нужно сначала разобраться с морзянкой и только потом пытаться ее программировать.

Вы не с того начали.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

BigMeister пишет:

 

P.S. программу я протестировал, приложение по декодированию Морзе определяет тот текст, который был записан.

Если бутылка Hennessy поместилась в мусорное ведро, это еще не значит, что она является мусором.

Я не знаю, какое "приложение по декодированию Морзе" Вы используете. И, тем более, я не знаю квалификацию автора этого приложения (может, она такая же, как и у Вас?).

Но даже если предположить, что автор этого "приложения" вполне квалифицированный специалист, он непременно должен был рассчитывать на передачу человеком, который в принципе не способен математически точно выдержать нужные длительности. Значит, он неизбежно вынужден был округлять принятые длительности. Вероятнее всего, (если это специалист) что это округление настроено так, чтобы безошибочно принимать сигнал с наибольшим отклонением от стандарта.

Отсюда следует вывод, что пройти этот тест может и нестандартный сигнал. И даже сильно нестандартный. Вплоть до того, что такой сигнал бьудет совершенно невозможно распознать на слух, а программа его будет безошибочно распознавать.

Ваш сигнал формируется явно не по стандарту. Раз Вы об этом не знаете, значит, Вы не знаете даже элементарнейших основ морзянки. А поэтому писать программы на эту темы Вам явно противопоказано.

b707
Offline
Зарегистрирован: 26.05.2017

BigMeister

Вам намекают на то, что реализованная вами "морзянка" имеет крайне слабое отношение к коду Морзе. Я весьма далек от радиотехники - и то сразу вижу. что длительности сигналов в вашей программе "кто в лес кто по дрова"

википедию что ли, открыли бы для начала:

Код Мо́рзе — способ знакового кодирования, представление букв алфавита, цифр, знаков препинания и других символов последовательностью сигналов: длинных («тире») и коротких («точек»)[1]). За единицу времени принимается длительность одной точки. Длительность тире равна трём точкам. Пауза между элементами одного знака — одна точка, между знаками в слове — 3 точки, между словами — 7 точек[2].

это не говоря про код. который весьма далек от оптимального