Hardware:
- Board: LILYGO T-A7670X-S3-Standard (ESP32-S3-WROOM-1, N16R2, 16MB Flash)
- RF Module: AI-Thinker Ra-02 SX1278 433MHz
- Target sensor: Ecowitt WS90 weather station (WS90BO Oceania 433MHz variant)
Wiring (verified from official LilyGO pinout):
Ra-02 pin | ESP32-S3 GPIO
-- | --
MOSI | IO11
SCK | IO12
MISO | IO13
NSS | IO15
DIO0 | IO16
DIO1 | IO39
DIO2 | IO21
RST | IO38
VCC | 3.3V
GND | GND
platformio.ini:
ini
[env:esp32-s3]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
lib_deps =
https://github.com/NorthernMan54/rtl_433_ESP.git
jgromes/RadioLib @ ^7.0.0
lib_ldf_mode = chain+
build_flags =
'-DRF_SX1278'
'-DRF_MODULE_FREQUENCY=433.96'
'-DRF_MODULE_CS=15'
'-DRF_MODULE_DIO0=16'
'-DRF_MODULE_DIO1=39'
'-DRF_MODULE_DIO2=21'
'-DRF_MODULE_RST=38'
'-DRF_MODULE_SCK=12'
'-DRF_MODULE_MISO=13'
'-DRF_MODULE_MOSI=11'
'-DOOK_MODULATION=false'
'-DRF_MODULE_INIT_STATUS=true'
'-DLOG_LEVEL=LOG_VERBOSE'
'-DRTL_DEBUG=4'
monitor_speed = 115200
upload_speed = 921600
main.cpp:
cpp
#include <Arduino.h>
#include <rtl_433_ESP.h>
#define RECEIVER_GPIO 16
#define JSON_MSG_BUFFER 512
char messageBuffer[JSON_MSG_BUFFER];
rtl_433_ESP rf;
void rtl_433_Callback(char *message) {
Serial.println(message);
}
void setup() {
Serial.begin(115200);
delay(2000);
Serial.println("Starting WS90 receiver...");
rf.setCallback(rtl_433_Callback, messageBuffer, JSON_MSG_BUFFER);
rf.initReceiver(RECEIVER_GPIO, 433.96);
rf.enableReceiver();
Serial.println("Listening for WS90 data...");
}
void loop() {
rf.loop();
}
Serial output:
Registering protocol [35] "Fine Offset Electronics WS90 weather station"
rtl_433_ESP(7): Average RSSI Signal -75 dbm, adjusted RSSI Threshold -63, samples 50000
What I know about the WS90 signal (verified with RTL-SDR):
- Modulation: FSK_PCM
- Freq1: 434.0 MHz, Freq2: 433.9 MHz (centre ~433.96 MHz)
- Bit width: 56µs
- RSSI: 1.2 dB, SNR: 19 dB at 3 metres distance
- rtl_433 flex decoder:
-X 'n=name,m=FSK_PCM,s=56,l=56,r=57344'
- The RTL-SDR decodes the WS90 perfectly every 8.8 seconds
Problem:
In FSK mode (-DOOK_MODULATION=false) the library registers the WS90 decoder (protocol 35) and shows RSSI around -75 dBm but never triggers a decode. The adjusted RSSI threshold is -63 dBm which the signal never crosses. Setting rf.setRSSIThreshold(-97) lowers the threshold to -172 dBm but still no decodes.
In OOK mode the WS90 decoder is not registered at all (correct behaviour) and RSSI drops to -105 dBm.
Question:
Is there a specific configuration needed for FSK_PCM decoding with the SX1278 on ESP32-S3? Is the DIO pin mapping different for FSK vs OOK mode? Any known issues with this chip/board combination?
Hardware:
Wiring (verified from official LilyGO pinout):
platformio.ini:
main.cpp:
Serial output:
What I know about the WS90 signal (verified with RTL-SDR):
-X 'n=name,m=FSK_PCM,s=56,l=56,r=57344'Problem: In FSK mode (
-DOOK_MODULATION=false) the library registers the WS90 decoder (protocol 35) and shows RSSI around -75 dBm but never triggers a decode. The adjusted RSSI threshold is -63 dBm which the signal never crosses. Settingrf.setRSSIThreshold(-97)lowers the threshold to -172 dBm but still no decodes.In OOK mode the WS90 decoder is not registered at all (correct behaviour) and RSSI drops to -105 dBm.
Question: Is there a specific configuration needed for FSK_PCM decoding with the SX1278 on ESP32-S3? Is the DIO pin mapping different for FSK vs OOK mode? Any known issues with this chip/board combination?