Вопрос о том, как рассчитывается значение «f» при преобразовании азбуки Морзе в лазерный звук из этого руководства.

Я работаю над этим руководством

https://www.hackster.io/SURYATEJA/morse -код-коммуникация-с использованием-лазерного-модуля-оба-ea1b01

и автор создал коды «Отправить» и «Получить» для кодирования и декодирования азбуки Морзе. Он создал код «Отправить» со всем алфавитом от AZ, но его код получения состоит только из 9 букв.

Я думал, что смогу легко добавить недостающие символы и даже цифры, но застрял.

Его код имеет 2 значения для декодирования азбуки Морзе — «a» и «f»

В коде приема у него есть значение «f», которое должно рассчитываться по количеству пробелов, но я не понимаю, как он приходит к такому результату.

Например, это его код отправки для «a»

    case 'a': 
MorseDot();
LightsOff(elemPause);
MorseDash();
LightsOff(elemPause);
break;

Тогда это код получения;

if(a==4 && f==10) {   Serial.print("a");

Я понимаю значение 4 для «a», но не могу понять значение 10 для «f»

"a" рассчитывается путем присвоения значения 1 для точки и 3 для тире и сложения значений (в данном случае одна точка и одно тире, 1+3 = 4)

Он объясняет, как вычислить «f» здесь, в своем уроке, но я все еще не понимаю.

  1. Когда ЛАЗЕР попадает на LDR, значение выходит за пределы 1000, и тогда он входит в цикл.

  2. Теперь квантовайте значения, т. е. если значение превышает 1000, присвойте ему значение «1», в противном случае присвойте ему значение «0».

  3. Внутри цикла подсчитайте количество единиц и нулей. Установите счетчики «а» и «f». Подсчитайте количество «1» и сохраните его в «a» и аналогичным образом подсчитайте количество «0» и сохраните его в «f» соответственно.

  4. Теперь проверьте конкретные значения «a» и «f» соответственно. У каждого символа будет свой набор букв «a» и «f». Будет отображено соответствующее значение.

Кажется, это указывает; Лазер включен = более 1000 = 1 Лазер выключен = меньше 1000 = 0

Итак, для буквы а я вижу только 2 раза, когда лазер гаснет, а не 10. Изменения форматирования Minof

, 👍0

Обсуждение

человек, написавший код, не потрудился сделать код легко читаемым, правильно расставляя отступы в блоках кода.... например, блок case 'a':, который вы включили в свой вопрос.... case 'a ': не должен иметь отступа, а следующие четыре строки должны быть с отступом..... все остальные блоки операторов case должны быть отформатированы таким же образом .............. ......LightsOff(elemPause); не следует вызывать внутри блоков case .... его следует вызывать в конце функций MorseDot() и MorseDash()` .. ... это значительно сократит продолжительность программы, @jsotola


1 ответ


2

Это не очень хороший урок. Приемник работает, предполагая 14 периодов времени dotLen для каждого символа. Существует цикл, который выполняется 14 раз с задержкой 200 мс между каждой итерацией. Если лазер обнаружен, то a увеличивается, в противном случае увеличивается f. Это означает, что сумма a и f всегда равна 14, а случай, когда a==0, означает, что ничего не было передано. Неполный код получателя показывает только 10 вариантов принимаемых символов и не учитывает a==5 (который будет выглядеть как R или U), но в противном случае определите от 1 до 10.

Код приемника не различает точки и тире, он подсчитывает только количество переходов dotLen, при которых обнаруживается свет. Это не азбука Морзе.

Код получателя не может различать S (точка-точка-точка) и T (тире), поскольку они оба имеют 3 значения dotLen . То же самое для A (точка-тире) и N (тире-точка).

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

,

Большое спасибо! Итак, если я понимаю, что это поддельная азбука Морзе, и меня больше интересует отправка и получение текстовых данных через лазер, смогу ли я каким-либо методом создать полный буквенно- цифровой набор символов (возможно, увеличив количество периоды времени dotLen)?, @FractalEncrypt

Нет. Я бы предложил отказаться от этого базового кода для любого проекта. Найдите что-то еще, что уже работает, и извлеките из этого уроки. Не пытайтесь учиться на сломанном проекте. Он даже не будет работать сам по себе., @jose can u c

Я согласен, код Морзе имеет символы переменной длины и не обнаруживает несущей, что затрудняет декодирование. (Он «включен» или это был шум? Он «выключен» или я просто потерял сигнал?) Я согласен с Хосе, использую машинно-ориентированный код (например, Бодо или ASCII) и вместо этого декодирую его., @Duston