Манчестер код на ардуино

Нашел в интернете реализацию кода манчестер, но для примера только одно слово передается. А как сделать чтобы передавался массив? А лучше чтобы изначально это были числовые переменные, которые потом будут последовательно передаваться

#include "VirtualWire.h"

#define txPin 3  // цифра 3 - это номер ноги, к которой подключается контакт data передатчика.
#define Te 1000
const int led_pin = 13;  //сигнальный светодиод

void setup() {
  pinMode(txPin, OUTPUT);  // настраиваем ногу txPin, т.е. ногу №3 как выход
  Serial.begin(9600);
}

void loop() {
  
  //SendCame(0b0000000000000000);  //пока такой код передаем (в HEX АААААА). Принимается сообщение как 010101010101010101010101 (в HEX это 555555). В действительности будет код 1111 1111 0100 1111 1111 0100<U+202C> как обозначено в топике.
  long Send []={0b00000000,0b10101010};
  SendCame(Send); тут берется только первый
  
  
  
}  
 
void SendCameBit(byte b)  // 0 передается 2-мя высокими интервалами, 1-м низким интервалом
{
  delayMicroseconds(Te);
  if (!b) digitalWrite(txPin, HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin, HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin, LOW);
}
  
void SendCame(long Code) {
  digitalWrite(led_pin, HIGH);  // Зажигаем светодиод в начале передачи
  digitalWrite(txPin, HIGH);
  delayMicroseconds(Te);
  digitalWrite(txPin, LOW);  // посылаем стартовый импульс
  delay(5);
      for (int j = 0; j < 2; j++)   // посылку посылаем как 4 раза подряд, т.к. посылка может потеряться из-за ЭМ помех.
  {
      
    for (byte i = 8; i > 0; i--) {
      SendCameBit(bitRead(Code, i - 1));  // побитово перебираем и посылаем код
     }
     delay(20);  //здесь большое значение времени >300 вообще сигнал не принимается. Почему? было 10!
  }
  extern void vw_wait_tx() ;                // Ожидаем окончания отправки сообщения
  digitalWrite(led_pin, LOW);  // Гасим светодиод в конце передачи
    
  delay(10);                 // сделать паузу после посылки на 1,5 мс было 1500!

}

если вы что то не знаете, публикуйте ваши вопросы в разделе для новичков, тут обсуждают вопросы, от тех кто понимает, что он делает и возникли коллизии, и требуется их решение/обсуждения.

перенес…

А разве “слово” это не массив?
Посмотрите внимательнее в код - здесь тоже передается массив

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

Передается только первое значение массива.

Так пройдите циклом по всем элементам массива и передайте каждый.

1 лайк

Ну, тогда ему надо ещё delay в конце передачи убрать.

Это сильно заточено под конкретную принималку. Если Вы не с нею работаете, то Вам бы лучше написать свою реализацию без притянутых за уши странных задержек. Кстати, комментерии типа

видимо, введены, чтобы сбить с толку противника.

Но, если уж Вы хотите использовать именно эту реализацию, то, смотрите: у Вас есть готовая функция отправки одного бита – SendCameBit. Вот и отправляйте ею по одному биту столько, сколько нужно, хоть гигабайты. В чём Ваша проблема?

Ну вот в начале есть функция sendcame. Как тогда числовую переменную перевести в подобие 0b111111. Я так понимаю это бинарный код

Никак не нужно переводить.

Это только для вас, человеков, он бинарный, десятичный и т.д. на самом деле он один и тот же, как сын, отец и дух святой.

Никак.

Открою Вам страшный секрет: в компьютере (такой архитектуры, как мы используем) всё (от слова «совсем всё», для особо недоверчивых – «совсем-совсем – без исключений – всё) хранится в бинарном коде Переводить надо, когда хочется это в десятичном (или ещё каком) напечатать для того, чтобы человеку читать удобнее было.

Просто передавайте SendCameBit байт и она его передаст, не придумывайте себе сложностей.

И все же есть исключения.
Например BCD.

Тогда помогите пожалуйста как передать, к примеру три числа.
В этом коде берётся sendcame(0b1111111), если он воспримит и sendcame(3522355), то хорошо, а как тогда сделать, чтобы он передавал несколько чисел? Цикл? Но когда я пробовал засунуть засунуть все последующее после void loop, он что-то ругался

Куда засунуть?

В цикл for

Если Вы так будете читать, Вы никогда ничего не передадите. Я Вам дважды (если плохо видно, то ДВАЖДЫ) писал какой функцией Вам нужно пользоваться. Вот здесь

и здесь

Чего Вы всё тянете эту SendCame?

Ещё раз, у Вас есть функция отправки бита. И есть нечто (число или там ещё что-то), что нужно переслать. Делаете цикл по битам отправляемого пакета (если он больше байта, то удобнее цикл по байтам, а в него уже вложить цикл по битам внутри байта) и спокойно, бит за битом всё отправляете.

Пример, как делать цикл по битам есть в “Вашем” коде в строках №№ 41-43. Вот примерно так и отправляйте.

Т.е. идею я Вам изложил, готовый пример у Вас есть. Какие у Вас ещё проблемы?

не надо описывать ошибки словами.
Показывайте код и ошибки компиляции.

Если числа простые, можно передать их произведение.

Теперь все уяснил. Спасибо большое!