Also, mein erster Versuch mit ELECHOUSE_CC1101_SRC_DRV hat zu einem Aufhängen ab der Initialisierung geführt. Ich habe es dann mit RadioLib versucht, mit dem Ergebnis, dass ich zwar irgendetwas senden kann, aber die Signale sehen in AirSpy komplett anders aus als die Signale, die die OOK (ASK) Wetterstationen senden.
Ich dachte, der CC1101 wäre der geeignetste Empfänger, da dieser auch in der RTL_433_ESP und dem BresserWeatherSensorReceiver genutzt wird. Warum wird beim BresserWeatherSensorReceiver 868.3 MHz genutzt und nicht 433.92 MHz?
Mit dem Ergebnis, dass dort Einstellungen vorgenommen werden, die bei mir geschützt sind, wenn ich es versuche. Ich habe auch einen FS1000A, der ebenfalls OOK (ASK) kann, aber eigentlich wollte ich es jetzt erst einmal mit einem CC1101 probieren, der von den technischen Daten her deutlich besser aussieht. Aber wie ich feststellen musste, ist er schwer zu nutzen. Ich bin mir nicht einmal sicher, ob er über ausreichend Empfindlichkeit verfügt. Deshalb habe ich ihn sogar schon an die Antenne meines SDR-Empfängers angeschlossen – ohne Erfolg.
Liegt es am ESP32 S3, an der Bibliothek oder stelle ich einfach alles falsch ein? Ich möchte nur meinen SDR-Stick durch einen energieeffizienten ESP32 S3 mit CC1101 austauschen. Aber irgendwie scheinen für den keine Bibliotheken zu existieren, die das können. Sollte man nicht eher so etwas wie einen direkten Modus nutzen, oder sind die Einstellungen einfach falsch, die ich vorgenommen habe, um so eine Wetterstation zu empfangen?
Einfaches Beispiel, angepasst für ESP32 S3:
/*
RadioLib CC1101 Receive with Interrupts Example
This example listens for FSK transmissions and tries to
receive them. Once a packet is received, an interrupt is
triggered.
To successfully receive data, the following settings have to be the same
on both transmitter and receiver:
- carrier frequency
- bit rate
- frequency deviation
- sync word
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#cc1101
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
// include the library
#include <RadioLib.h>
// Definiere die Pins für den ESP32-S3
#define CC1101_CS_PIN 10 // Chip Select
#define CC1101_SCK_PIN 12 // Serial Clock
#define CC1101_MOSI_PIN 11 // Master Out Slave In
#define CC1101_MISO_PIN 13 // Master In Slave Out
#define CC1101_GDO0_PIN 38 // Definiere den GDO0 Pin (unverändert)
#define CC1101_GDO2_PIN 39 // Definiere den GDO2 Pin (unverändert)
#define CC1101_RST_PIN -1 // Falls kein Reset-Pin verwendet wird
CC1101 radio = new Module(CC1101_CS_PIN, CC1101_GDO0_PIN, CC1101_RST_PIN, CC1101_GDO2_PIN, newSPI, SPISettings(2000000, MSBFIRST, SPI_MODE0));
// or using RadioShield
// https://github.com/jgromes/RadioShield
//CC1101 radio = RadioShield.ModuleA;
void setup() {
Serial.begin(9600);
newSPI.begin(CC1101_SCK_PIN, CC1101_MISO_PIN, CC1101_MOSI_PIN, CC1101_CS_PIN);
// initialize CC1101 with default settings
Serial.print(F("[CC1101] Initializing ... "));
int state = radio.begin();
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// Konfiguriere das CC1101-Modul für eine einfache OOK-Wetterstation
cc1101.setFrequency(433.92); // Setze die Frequenz auf 433 MHz
cc1101.setBitRate(17.24); // Setze die Bitrate auf 17.24 kbps
cc1101.setOutputPower(10); // Setze die Sendeleistung auf 10 dBm
cc1101.setSyncWord(0xAA, 0x2D); // Beispiel-Sync-Word, könnte angepasst werden müssen
cc1101.disableSyncWordFiltering(false);
cc1101.setCrcFiltering(false); // Deaktiviert die CRC-Prüfung für einfache Wetterstationen
cc1101.setOOK(true); // Setze die Modulation auf OOK (ASK)
cc1101.setFrequencyDeviation(40); // Setze Frequenzabweichung auf 40 kHz
cc1101.setRxBandwidth(270.0); // Setze Empfangsbandbreite auf 270 kHz
// set the function that will be called
// when new packet is received
radio.setPacketReceivedAction(setFlag);
// start listening for packets
Serial.print(F("[CC1101] Starting to listen ... "));
state = radio.startReceive();
if (state == RADIOLIB_ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// if needed, 'listen' mode can be disabled by calling
// any of the following methods:
//
// radio.standby()
// radio.sleep()
// radio.transmit();
// radio.receive();
// radio.readData();
}
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
#if defined(ESP8266) || defined(ESP32)
ICACHE_RAM_ATTR
#endif
void setFlag(void) {
// we got a packet, set the flag
receivedFlag = true;
}
void loop() {
// check if the flag is set
if(receivedFlag) {
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
String str;
int state = radio.readData(str);
// you can also read received data as byte array
/*
byte byteArr[8];
int numBytes = radio.getPacketLength();
int state = radio.readData(byteArr, numBytes);
*/
if (state == RADIOLIB_ERR_NONE) {
// packet was successfully received
Serial.println(F("[CC1101] Received packet!"));
// print data of the packet
Serial.print(F("[CC1101] Data:\t\t"));
Serial.println(str);
// print RSSI (Received Signal Strength Indicator)
// of the last received packet
Serial.print(F("[CC1101] RSSI:\t\t"));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
// print LQI (Link Quality Indicator)
// of the last received packet, lower is better
Serial.print(F("[CC1101] LQI:\t\t"));
Serial.println(radio.getLQI());
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("CRC error!"));
} else {
// some other error occurred
Serial.print(F("failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
}
}
ChatGPT hat versucht die SPIwriteRegister hinzufügen, das führt aber zu Fehlern bei der Ausführung 21455][E][esp32-hal-gpio.c:190] __digitalRead(): IO 39 is not set as GPIO
#include <SPI.h>
#include <RadioLib.h>
// Definiere die Pins für den ESP32-S3
#define CC1101_CS_PIN 10 // Chip Select
#define CC1101_SCK_PIN 12 // Serial Clock
#define CC1101_MOSI_PIN 11 // Master Out Slave In
#define CC1101_MISO_PIN 13 // Master In Slave Out
#define CC1101_GDO0_PIN 38 // Definiere den GDO0 Pin
#define CC1101_GDO2_PIN 39 // Definiere den GDO2 Pin
#define CC1101_RST_PIN -1 // Falls kein Reset-Pin verwendet wird
SPIClass newSPI(HSPI);
// Erstellen einer benutzerdefinierten Klasse, die von CC1101 erbt
class CustomCC1101 : public CC1101 {
public:
using CC1101::CC1101;
using CC1101::SPIwriteRegister;
using CC1101::SPIsendCommand;
};
// Initialisiere das benutzerdefinierte CC1101-Modul
CustomCC1101 cc1101 = new Module(CC1101_CS_PIN, CC1101_GDO0_PIN, CC1101_RST_PIN, CC1101_GDO2_PIN, newSPI, SPISettings(2000000, MSBFIRST, SPI_MODE0));
void setup() {
Serial.begin(115200);
Serial.println("Start Setup");
newSPI.begin(CC1101_SCK_PIN, CC1101_MISO_PIN, CC1101_MOSI_PIN, CC1101_CS_PIN);
int state = cc1101.begin();
if (state == RADIOLIB_ERR_NONE) {
Serial.println("CC1101 initialized successfully.");
} else {
Serial.print("CC1101 initialization failed, code ");
Serial.println(state);
while (true);
}
// Konfiguriere das CC1101-Modul für eine einfache OOK-Wetterstation
cc1101.setFrequency(433.92); // Setze die Frequenz auf 433 MHz
cc1101.setBitRate(17.24); // Setze die Bitrate auf 17.24 kbps
cc1101.setOutputPower(10); // Setze die Sendeleistung auf 10 dBm
cc1101.setSyncWord(0xAA, 0x2D); // Beispiel-Sync-Word, könnte angepasst werden müssen
cc1101.disableSyncWordFiltering(false);
cc1101.setCrcFiltering(false); // Deaktiviert die CRC-Prüfung für einfache Wetterstationen
cc1101.setOOK(true); // Setze die Modulation auf OOK (ASK)
// Setze spezifische Registerwerte, falls notwendig
cc1101.SPIwriteRegister(RADIOLIB_CC1101_REG_PKTLEN, 0);
cc1101.SPIwriteRegister(RADIOLIB_CC1101_REG_AGCCTRL2, 0xc7);
cc1101.SPIwriteRegister(RADIOLIB_CC1101_REG_MDMCFG3, 0x93); // Data rate
cc1101.SPIwriteRegister(RADIOLIB_CC1101_REG_MDMCFG4, 0x07); // Bandwidth
cc1101.setFrequencyDeviation(40); // Setze Frequenzabweichung auf 40 kHz
cc1101.setRxBandwidth(270.0); // Setze Empfangsbandbreite auf 270 kHz
}
void loop() {
// Daten, die gesendet werden sollen
uint8_t data[] = {0x01, 0x02, 0x03, 0x04};
int state = cc1101.transmit(data, sizeof(data));
// Überprüfe, ob das Senden erfolgreich war
if (state == RADIOLIB_ERR_NONE) {
Serial.println("Data sent successfully.");
} else if (state == RADIOLIB_ERR_TX_TIMEOUT) {
Serial.println("Transmit timeout!");
} else {
Serial.print("Send failed, code ");
Serial.println(state);
}
// Empfange Daten
uint8_t byteArr[64];
cc1101.startReceive();
state = cc1101.receive(byteArr, sizeof(byteArr));
// Überprüfe, ob der Empfang erfolgreich war
if (state == RADIOLIB_ERR_NONE) {
Serial.println("Data received!");
Serial.print("Data: ");
for (int i = 0; i < sizeof(byteArr); i++) {
Serial.print(byteArr[i], HEX);
Serial.print(" ");
}
Serial.println();
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
Serial.println("CRC error!");
} else if (state == RADIOLIB_ERR_RX_TIMEOUT) {
Serial.println("Receive timeout!");
} else {
Serial.print("Receive failed, code ");
Serial.println(state);
}
delay(2000); // Warte 2 Sekunden, bevor du erneut sendest
}