Вопрос о том, как рассчитывается значение «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» здесь, в своем уроке, но я все еще не понимаю.
Когда ЛАЗЕР попадает на LDR, значение выходит за пределы 1000, и тогда он входит в цикл.
Теперь квантовайте значения, т. е. если значение превышает 1000, присвойте ему значение «1», в противном случае присвойте ему значение «0».
Внутри цикла подсчитайте количество единиц и нулей. Установите счетчики «а» и «f». Подсчитайте количество «1» и сохраните его в «a» и аналогичным образом подсчитайте количество «0» и сохраните его в «f» соответственно.
Теперь проверьте конкретные значения «a» и «f» соответственно. У каждого символа будет свой набор букв «a» и «f». Будет отображено соответствующее значение.
Кажется, это указывает; Лазер включен = более 1000 = 1 Лазер выключен = меньше 1000 = 0
Итак, для буквы а я вижу только 2 раза, когда лазер гаснет, а не 10. Изменения форматирования Minof
@FractalEncrypt, 👍0
Обсуждение1 ответ
Это не очень хороший урок. Приемник работает, предполагая 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
- ОБНОВЛЕНИЕ: ошибка в коде обработки - не получает правильные данные от Arduino
- Float печатается только 2 десятичных знака после запятой
- Почему запуск последовательного монитора перезапускает скетч?
- Чтение из Serial
- Связь последовательного порта Digispark
- Отправка последовательных данных в прерывании
- Как получить правильный последовательный порт?
- Почему люди используют 115200 вместо 9600?
человек, написавший код, не потрудился сделать код легко читаемым, правильно расставляя отступы в блоках кода.... например, блок
case 'a':
, который вы включили в свой вопрос....case 'a ':
не должен иметь отступа, а следующие четыре строки должны быть с отступом..... все остальные блоки операторовcase
должны быть отформатированы таким же образом .............. ......LightsOff(elemPause);не следует вызывать внутри блоков
case.... его следует вызывать в конце функций
MorseDot()и
MorseDash()` .. ... это значительно сократит продолжительность программы, @jsotola