Wemos и приемники (MX-RM-5V, RXB12, SYN480R, RXB6)

Дмитрий77

✩✩✩✩✩✩✩
23 Июл 2025
4
0
Имеется: Wemos D1 mini, arduino IDE 1.8.19 и 2.3.4
Приемники: MX-RM-5V, RXB12, SYN480R, RXB6
Задача прочитать пульты 433
: шлагбаума An-Motors AT-4 и его универсальный клон, выкл-я Livolo, штор Raex YR3121, и т.д..

Подключал на D4 и D1, на 5в и на 3,3в (SYN480R).
f62e73f8-dd4c-425e-9136-ee3e2ee8aa41_cr.jpg
Приемники рабочие, посылку видно (слева). Кто-то из приемников чуть меньше шумит (справа), кто-то больше.
60210fdd-2655-4b66-b7cf-33421e0e7ae0_cr.jpgf3d4c1c5-b2d0-42d0-b11e-da8a1302142a_cr.jpg

Пробовал Gyver433/ rx433_struct.ino
C++:
#include <Gyver433.h>
Gyver433_RX<2, 12> rx;  // указали пин и размер буфера

// формат пакета для приёма (такой же как отправляется)
struct DataPack {
  byte counter;
  byte randomNum;
  int analog;
  uint32_t time;
};

IRAM_ATTR void myIsr() {}

void setup() {
  Serial.begin(115200);
  attachInterrupt(1, myIsr, RISING);
}

void loop() {
  if (rx.tick()) {
    DataPack data;            // "буферная" структура
    if (rx.readData(data)) {  // переписываем данные в неё
      // если данные подходят - выводим
      Serial.println(data.counter);
      Serial.println(data.randomNum);
      Serial.println(data.analog);
      Serial.println(data.time);
      Serial.println();
    } else {
      Serial.println("Wrong data");
    }
  }
}
С буфером по умолчанию (Gyver433_RX<2, 12> rx) - в выводе тишина.
С буфером 128 в выводе каша:
clвё®;c$ clвё®;s$ clвё®rвё®вё®вё®bвё® #вё®вё®sвё®l`вё®вё®gdвё®sвё®вё®'ogcdc

GyverWire/struct_rx.ino
C++:
#include <Arduino.h>
#include <GW_RX.h>

struct Data {
    int i;
    float f;
};

GW_RX<2> rx;

void setup() {
    Serial.begin(115200);
    attachInterrupt(0, []() { rx.pinChange(); }, CHANGE);

    rx.onPacket([](uint8_t type, void* data, size_t len) {
        if (sizeof(Data) != len) return;  // проверка корректности длины
        Data& d = *((Data*)data);
        Serial.print(d.i);
        Serial.print(',');
        Serial.println(d.f);

        // или
        // Serial.println(static_cast<Data*>(data)->f);
    });
}

void loop() {
    rx.tick();
}
В выводе:
C++:
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Abort called

>>>stack>>>

ctx: cont
sp: 3fffff70 end: 3fffffd0 offset: 0010
3fffff80:  00000000 feefeffe 00000000 40202769
3fffff90:  0001c200 0000001c 00000000 feefeffe
3fffffa0:  3fffdad0 00000000 3ffee5b8 402011f9
3fffffb0:  feefeffe feefeffe feefeffe 40201bfc
3fffffc0:  feefeffe feefeffe 3fffdab0 40100d95
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3424, room 16
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8
tail 0
chksum 0x2b
csum 0x2b
v00042690
~ld
⸮⸮⸮⸮g⸮s⸮⸮n<⸮$⸮d`c⸮⸮|s⸮d⸮'⸮⸮n⸮
rc-switch/ ReceiveDemo_Simple.ino
C++:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(115200);
  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() );
    mySwitch.resetAvailable();
  }
}
В выводе тишина.

Что я делаю не так?
 
Изменено:

Дмитрий77

✩✩✩✩✩✩✩
23 Июл 2025
4
0
Там все очень просто.
Посылочка вроде такой
anmotors_proto.png
Что декодится в подобное такому: 710366D4 F35B9EA8 или такому 50B64907 F35B9EA8 (первая часть - UID пульта, вторая - статика). С кодированием в анмоторс не парились.

Вопрос не в кодировке, а в том, что без всяких посылок у меня в лог летит мусор, или же ничего. Вопрос, как мне кажется, в адаптации к Wemos'у.
Тем паче, что из всего зоопарка пультов, ни один не считался.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
639
190
Что я делаю не так?
Вы действуете методом тыка, не понимая, что делает код, какой протокол ожидаем и т.д.
>Подключал на D4 и D1, на 5в и на 3,3в (SYN480R).
Пины для подключения как и напряжение питания надо выбирать не перебором, а по функционалу.
Первый скетч наиболее показателен. Подключение на пин 2. Включение прерываний на пин 1. И не использование прерываний в дальнейшем коде.
C++:
Gyver433_RX<2, 12> rx;  // указали пин и размер буфера
IRAM_ATTR void myIsr() {}
attachInterrupt(1, myIsr, RISING);
В ESP8266 attachInterrupt подключается по номеру пина. Для совместимости можно использовать digitalPinToInterrupt

Решения.
  • или найти в инете готовый проект на WEMOS D1 mini
  • или разобраться с назначением строк кода программы и ожидаемым протоколом обмена.
 

Дмитрий77

✩✩✩✩✩✩✩
23 Июл 2025
4
0
Метаться по пинам и делать глупые ошибки я начал после того, как начала дичь твориться - один и тот же скетч мог ничего не выдавать, а мог мусором сыпать. Как оказалось проблема в заливке скетча на 921600. После снижения скорости до 115200, проблемы в этой части ушли. Ни разу с таким не сталкивался. Видимо особенность этого экземпляра.

Второе открытие - универсальных скетчей на все брелки не существует. Жаль. Не был в теме.

За подсказку по digitalPinToInterrupt, спасибо. Скетч (ссылку на исходник выше давал), допилил для Wemos:
C++:
#define rxPin D4 // сюда у нас подключен приемник
#define MAX_DELTA 200 // это максимальное отклонение от длительности Pe при приеме
#define Pe 413
#define Pe2 Pe*2

void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(rxPin), grab, CHANGE); // запускаем перехват пакетов
  interrupts();
}

void loop() {
}

// все что ниже касается приема
volatile unsigned long prevtime;
volatile unsigned int lolen, hilen, state;
volatile static byte bcounter = 0;    // количество принятых битов
volatile static long code1 = 0;       // зашифрованная часть
volatile static long code2 = 0;       // фиксированная часть
boolean CheckValue(unsigned int base, unsigned int value) {
  return ((value == base) || ((value > base) && ((value - base) < MAX_DELTA)) || ((value < base) && ((base - value) < MAX_DELTA)));
}

IRAM_ATTR void grab() {
  state = digitalRead(rxPin);
  if (state == HIGH)
    lolen = micros() - prevtime;
  else
    hilen = micros() - prevtime;
    prevtime = micros();

  if (state == HIGH) { // последовательность закончилась
    if (CheckValue(Pe, hilen) && CheckValue(Pe2, lolen)) { // valid 1
      if (bcounter < 32)
        code1 = (code1 << 1) | 1;
      else if (bcounter < 64)
        code2 = (code2 << 1) | 1; bcounter++;
    }
    else if (CheckValue(Pe2, hilen) && CheckValue(Pe, lolen)) { // valid 0
      if (bcounter < 32)
        code1 = (code1 << 1) | 0;
      else if (bcounter < 64)
        code2 = (code2 << 1) | 0; bcounter++;
    }
    else
      bcounter = 0;
  }
  if (bcounter >= 65) { //Вывод в терминал
    Serial.print(code1, HEX);
    Serial.print(" ");
    Serial.println(code2, HEX);
    bcounter = 0; code1 = 0; code2 = 0;
  }
}
Вот что у меня считалось с клона AT-4 (другие пульты интересовали факультативно)
2024F398 2CCB9E24
2024F398 2CCB9E24
20240B98 2CCB9E24
20240B98 2CCB9E24
2024CB98 2CCB9E24
2024CB98 2CCB9E24
20242B98 2CCB9E24
20242B98 2CCB9E24
4 нажатия, пульт посылку дублирует
 
Изменено:

Дмитрий77

✩✩✩✩✩✩✩
23 Июл 2025
4
0
Зато оттестил кучку приемников. Привожу скрины шумов (в покое).Результаты следующие. (указана цена на одном из маркетплейсов)
RXB12.jpg
RXB12 (151р.), Брак. Разбираться не стал, нет смысла

MX-RM-5V.jpg
MX-RM-5V (157р.) - Шумит не сильно, но "аналогово". Дальность приема никакая (феррит настраивал). Может мне не повезло.

SYN480R_3,3v.jpg SYN480R.jpg
SYN480R (247р.). Отлично показал себя. Слева скрин на 3,3в, справа на 5в. В пределах квартиры бьет ч/з стены без антенны. Его себе оставил.

RXB6 (361р.). Поведение такое же как у SYN480R. Только дороже, больше. Смысла в нем нет. Не скринил.