Приемник mx-rm-5v и пульты 433мгц помогите запустить все пульты

Тема в разделе "Arduino & Shields", создана пользователем Дятел, 26 ноя 2022.

  1. Дятел

    Дятел Нерд

    В наличии:
    - приемник MX-RM-5V (есть два таких. купленных с промежутком в 1 год в разных магазинах). Поведение с обоими приемниками одинаковое.
    - Ардуино Нано подключение приемника на пин D2 ардуино.
    - Несколько пультов на частоте 433мгц, притом 4-ре внешне абсолютно одинаковые маркированы Came TOP 432NA. Все гарантированно рабочие.
    Есть еще несколько пультов. Часть из них работает с этим приемником, а часть нет. Хотя частоты у всех пультов одинаковые. Кодирование 12 и 24 бита
    Пробовал библиотеки RCSwitch и Gyver433
    С библиотекой RCSwitch работает только один из этих пультов Came TOP 432NA, в этом и засада. Хочется, что бы все работали.
    А с библиотекой Gyver433 НИ один не работает!!
    Код с RCSwitch
    Код (C++):
    #include <RCSwitch.h>

    RCSwitch mySwitch = RCSwitch();

    void setup() {
      Serial.begin(9600);
      mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
    }

    void loop() {
      if (mySwitch.available()) {
       
        Serial.print("Received ");
        Serial.print( mySwitch.getReceivedValue() );
        Serial.print(" / ");
        Serial.print( mySwitch.getReceivedBitlength() );
        Serial.print("bit ");
        Serial.print("Protocol: ");
        Serial.println( mySwitch.getReceivedProtocol() );
    Serial.print("dlit: ");
        Serial.println( mySwitch.getReceivedDelay() );
       

        mySwitch.resetAvailable();
      }
    }
    Результат работы кода
    с библиотекой RCSwitch от двух работающих пультов. dlit — это вывод по функции mySwitch.getReceivedDelay()
    Received 2958 / 12bit Protocol: 11 dlit: 408
    Received 2958 / 12bit Protocol: 11 dlit: 409
    Received 3631464 / 24bit Protocol: 1 dlit: 326
    Received 3631464 / 24bit Protocol: 1 dlit: 328


    Код от Гайвера
    Код (C++):
    #include <Gyver433.h>
    Gyver433_RX<2, 20> rx;  // указали пин и размер буфера

    void setup() {
      Serial.begin(9600);
      attachInterrupt(0, isr, CHANGE);  // прерывание пина радио по CHANGE
    }

    // спец. тикер вызывается в прерывании
    void isr() {
      rx.tickISR();
    }

    void loop() {
      if (rx.gotData()) {                   // если успешно принято больше 0
        Serial.write(rx.buffer, rx.size);   // выводим
        Serial.println();
      }
      delay(50);                            // имитация загруженного кода
    }
    Еще пробовал такой код, но с ним толком не разобрался, путем манипуляций, смог убедится, что хоть что-то он может принять от неработающих с RCSwitch пультами. Но сам код распознать не смог.
    Привожу оригинал кода, с которым у меня вообще тишина. Свои манипуляции удалил.
    Код (C++):
    #define rxd 2 //задаем пин приемника
    #define delta 200 //задаем время для расброса времени посылаемого сигнала

    int metka2 = 0; // метка для подсчета чистого сигнала(что бы мусор не принимал)

    boolean metka = 0; // вторая метка для подсчета чистого сигнала

    unsigned int time, oldtime; //переменные для времени

    void setup() {
    pinMode(rxd, INPUT); //сделаем входом
    attachInterrupt(0, pinint, CHANGE); //настроим прерывание
    Serial.begin(115200); //скорость порта
    interrupts(); // активираем прерывания
    }

    void pinint() {
    if (digitalRead(rxd) == LOW) //значит приняли ноль
    {
    oldtime = micros(); //записали время
    }
    else
    {
    time = micros() - oldtime; //нходим время в котором был 0 или 1
    if (constrain(time, 13400 - delta, 13400 + delta) == time)// если попадает 0 или еденица в интервал от 13200 до 13600 значит пришел стартовы бит и начнем считать саму посылку
    {
    metka = 1; //выставилм метки что бы понять что посылка кода пошла
    metka2 = 0; //выставилм метки что бы понять что посылка кода пошла
    }
    if (metka == 1 && metka2 <= 24 ) //значит метки совпадают начинаем читать сигналы
    {
    metka2++; //выставим что бы метка отсчитала 24 посылки "1" и "0", после 24 приходит мусор
    if (constrain(time, 1300 - delta, 1300 + delta) == time) //если пришла 1 запишем ее в функцию, там она напечатается в монитор
    {
    funkciya(1);
    }
    else if (constrain(time, 300, 500) == time) //если пришел 0 запишем его в функцию, там он напечатается в монитор
    {
    funkciya(0);
    }
    else if (constrain(time, 0, 300) == time) // если поймапли какой то мусор, сразу обрубаем чтение порта
    {
    metka = 0;
    metka2 = 25;
    }
    if ( metka2 == 25) //ну это для образовательных целей что бы видеть разрыв между посылками
    {
    Serial.println("");
    Serial.println("OK");
    Serial.println("");
    }
    }
    }
    }

    void funkciya(int chislo) // сама функция выыода посылки но высылается по одному символу
    {
    Serial.println(chislo);
    }

    void loop() {}
    Помогите разобраться или версию, куда копать