
Bezdrátová komunikace na frekvenci 433 MHz je mezi kutily velmi oblíbená především díky velkému dosahu a skvělé schopnosti procházet zdmi a překážkami. Obyčejné levné moduly (jako například známý vysílač FS1000A) ale umí data posílat jen jedním směrem a v éteru často trpí rušením. Mnohem lepším řešením je rádiový modul CC1101, který zvládá vysílání i příjem a v kombinaci s oblíbeným ESP32 tvoří spolehlivou bezdrátovou linku.
V tomto návodu si ukážeme, jak mezi dvěma deskami ESP32 vytvořit obousměrnou komunikaci na principu Ping-Pong. Vysílač (TX) každou sekundu odešle zprávu ping a ihned začne čekat na odpověď. Přijímač (RX) zprávu zachytí, odfiltruje okolní šum, zkontroluje správnost dat a automaticky odpoví zprávou pong. Na obou stranách si navíc do sériového monitoru vypíšeme sílu signálu (RSSI) i kvalitu spojení (LQI).
Pokud s deskami ESP32 teprve začínáte a nemáte je ještě v prostředí zprovozněné, podívejte se nejprve na náš návod Jak přidat desky ESP32 do Arduino IDE.
Zapojení modulu
Modul CC1101 komunikuje s mikrokontrolérem ESP32 přes standardní sběrnici SPI a přerušovací pin GDO0.
DŮLEŽITÉ UPOZORNĚNÍ: Modul CC1101 vyžaduje napájení pouze 3,3 V. Napájejte jej proto výhradně z pinu 3V3 na desce ESP32. Pokud byste modul připojili na 5V (nebo pin VIN), došlo by k jeho zničení!
- VCC: 3V3 (napájení 3,3 V z ESP32)

- GND: Společná zem (GND)
- CSN (SS): Digitální pin 5 (SPI Chip Select)
- SCK: Digitální pin 18 (SPI Hodiny)
- MOSI (SI): Digitální pin 23 (SPI Data do modulu)
- MISO (SO): Digitální pin 19 (SPI Data z modulu)
- GDO0: Digitální pin 4 (Datový a přerušovací pin)
- GDO2: Digitální pin 15 (Volitelný stavový pin)

Instalace knihovny a nahrání programu

Pro správnou funkci modulu CC1101 je nezbytné mít v Arduino IDE nainstalovanou příslušnou knihovnu.
Potřebnou knihovnu SmartRC-CC1101-Driver-Lib naleznete v Manažeru knihoven v Arduino IDE (případně můžete využít knihovnu přiloženou v souborech ke stažení). Podrobný postup pro práci s knihovnami naleznete v tomto návodu:
Než se pustíte do nahrávání, v nabídce Nástroje zvolte vaši desku (např. ESP32 Dev Module) a správný COM port. Kliknutím na tlačítko Nahrát spusťte nahrávání programu. Pokud se objeví výpis Connecting..., stačí krátce podržet tlačítko BOOT na desce ESP32.
Vzorový kód 1: Vysílač (Transmitter - TX)
#include <ELECHOUSE_CC1101_SRC_DRV.h> // Vložení knihovny pro komunikaci s modulem CC1101
// Definice pinů pro ESP32
#define CC1101_CSN 5
#define CC1101_GDO0 4
#define CC1101_GDO2 15
// Časovač pro periodické odesílání
unsigned long lastSend = 0;
void setup() {
// Spuštění sériové komunikace pro výpis do Sériového monitoru
Serial.begin(115200);
delay(1000);
Serial.println("--- ESP32 + CC1101 Transmitter Start ---");
// Nastavení vlastních SPI pinů a pinu GDO pro ESP32
ELECHOUSE_cc1101.setSpiPin(18, 19, 23, CC1101_CSN);
ELECHOUSE_cc1101.setGDO0(CC1101_GDO0);
// Inicializace modulu CC1101
ELECHOUSE_cc1101.Init();
// Kontrola komunikace po sběrnici SPI
if (!ELECHOUSE_cc1101.getCC1101()) {
Serial.println("Chyba modulu CC1101! Zkontrolujte zapojeni.");
while (1) {
delay(1000);
}
}
Serial.println("CC1101 uspesne inicializovan.");
// Konfigurace pro spolehlivou komunikaci v pásmu 433 MHz
ELECHOUSE_cc1101.setCCMode(1); // Zapnutí paketového režimu s FIFO bufferem
ELECHOUSE_cc1101.setMHZ(433.92); // Nastavení frekvence 433.92 MHz
ELECHOUSE_cc1101.setSyncWord(0x12, 0x34); // Synchronizační slovo pro filtr cizích zpráv
ELECHOUSE_cc1101.setCrc(1); // Kontrola integrity dat CRC
ELECHOUSE_cc1101.setPacketLength(61); // Maximální délka paketu v bufferu
// Nastavení registrů pro modulaci 2-FSK (rychlost 4.8 kBaud a šířka pásma 100 kHz)
ELECHOUSE_cc1101.SpiWriteReg(0x10, 0xC7);
ELECHOUSE_cc1101.SpiWriteReg(0x11, 0x83);
ELECHOUSE_cc1101.SpiWriteReg(0x12, 0x02);
ELECHOUSE_cc1101.SpiWriteReg(0x15, 0x40);
ELECHOUSE_cc1101.SpiWriteReg(0x22, 0x10);
ELECHOUSE_cc1101.setPA(10); // Nastavení maximálního výkonu +10 dBm
// Přepnutí do režimu příjmu pro zachycení odpovědi
ELECHOUSE_cc1101.SetRx();
}
void loop() {
// Periodické odesílání každou sekundu
if (millis() - lastSend >= 1000) {
lastSend = millis();
Serial.print("Odesilam zpravu: ping ... ");
char msg[] = "ping";
ELECHOUSE_cc1101.SendData(msg, 30);
ELECHOUSE_cc1101.SetRx();
Serial.println("Odeslano.");
}
// Kontrola přijaté odpovědi v bufferu
if (ELECHOUSE_cc1101.CheckRxFifo(20)) {
byte buffer[64] = {0};
byte len = ELECHOUSE_cc1101.ReceiveData(buffer);
if (len > 0 & ELECHOUSE_cc1101.CheckCRC()) {
buffer[len] = ' ';
Serial.print("Prijata odpoved: ");
Serial.print((char*)buffer);
Serial.print(" | RSSI: ");
Serial.print(ELECHOUSE_cc1101.getRssi());
Serial.print(" dBm | LQI: ");
Serial.println(ELECHOUSE_cc1101.getLqi());
}
}
}
Vzorový kód 2: Přijímač (Receiver - RX)
#include <ELECHOUSE_CC1101_SRC_DRV.h> // Vložení knihovny pro komunikaci s modulem CC1101
// Definice pinů pro ESP32
#define CC1101_CSN 5
#define CC1101_GDO0 4
#define CC1101_GDO2 15
void setup() {
// Spuštění sériové komunikace pro výpis do Sériového monitoru
Serial.begin(115200);
delay(1000);
Serial.println("--- ESP32 + CC1101 Receiver Start ---");
// Nastavení vlastních SPI pinů a pinu GDO pro ESP32
ELECHOUSE_cc1101.setSpiPin(18, 19, 23, CC1101_CSN);
ELECHOUSE_cc1101.setGDO0(CC1101_GDO0);
// Inicializace modulu CC1101
ELECHOUSE_cc1101.Init();
// Kontrola komunikace po sběrnici SPI
if (!ELECHOUSE_cc1101.getCC1101()) {
Serial.println("Chyba modulu CC1101! Zkontrolujte zapojeni.");
while (1) {
delay(1000);
}
}
Serial.println("CC1101 uspesne inicializovan.");
// Konfigurace pro spolehlivou komunikaci v pásmu 433 MHz
ELECHOUSE_cc1101.setCCMode(1); // Zapnutí paketového režimu s FIFO bufferem
ELECHOUSE_cc1101.setMHZ(433.92); // Nastavení frekvence 433.92 MHz
ELECHOUSE_cc1101.setSyncWord(0x12, 0x34); // Synchronizační slovo pro filtr cizích zpráv
ELECHOUSE_cc1101.setCrc(1); // Kontrola integrity dat CRC
ELECHOUSE_cc1101.setPacketLength(61); // Maximální délka paketu v bufferu
// Nastavení registrů pro modulaci 2-FSK (rychlost 4.8 kBaud a šířka pásma 100 kHz)
ELECHOUSE_cc1101.SpiWriteReg(0x10, 0xC7);
ELECHOUSE_cc1101.SpiWriteReg(0x11, 0x83);
ELECHOUSE_cc1101.SpiWriteReg(0x12, 0x02);
ELECHOUSE_cc1101.SpiWriteReg(0x15, 0x40);
ELECHOUSE_cc1101.SpiWriteReg(0x22, 0x10);
ELECHOUSE_cc1101.setPA(10); // Nastavení maximálního výkonu +10 dBm
// Přepnutí do režimu trvalého příjmu
ELECHOUSE_cc1101.SetRx();
}
void loop() {
// Kontrola nového přijatého paketu v bufferu
if (ELECHOUSE_cc1101.CheckRxFifo(20)) {
byte buffer[64] = {0};
byte len = ELECHOUSE_cc1101.ReceiveData(buffer);
if (len > 0 & ELECHOUSE_cc1101.CheckCRC()) {
buffer[len] = ' ';
Serial.print("Prijata zprava: ");
Serial.print((char*)buffer);
Serial.print(" | RSSI: ");
Serial.print(ELECHOUSE_cc1101.getRssi());
Serial.print(" dBm | LQI: ");
Serial.println(ELECHOUSE_cc1101.getLqi());
// Pokud přijatá zpráva odpovídá textu ping, odešleme odpověď pong
if (strcmp((char*)buffer, "ping") == 0) {
delay(40);
Serial.print("Odpovidam: pong ... ");
char msg[] = "pong";
ELECHOUSE_cc1101.SendData(msg, 30);
ELECHOUSE_cc1101.SetRx();
Serial.println("Odeslano.");
}
}
}
}
Výstup ze Sériového monitoru (115200 baud)
Po nahrání obou programů uvidíte v Sériovém monitoru spolehlivou obousměrnou komunikaci v reálném čase:
Vysílač (TX):
--- ESP32 + CC1101 Transmitter Start --- CC1101 uspesne inicializovan. Odesilam zpravu: ping ... Odeslano. Prijata odpoved: pong | RSSI: -85 dBm | LQI: 0 Odesilam zpravu: ping ... Odeslano. Prijata odpoved: pong | RSSI: -86 dBm | LQI: 0
Přijímač (RX):
--- ESP32 + CC1101 Receiver Start --- CC1101 uspesne inicializovan. Prijata zprava: ping | RSSI: -81 dBm | LQI: 130 Odpovidam: pong ... Odeslano. Prijata zprava: ping | RSSI: -81 dBm | LQI: 130 Odpovidam: pong ... Odeslano.
Závěr
Modul CC1101 představuje spolehlivé řešení pro bezdrátový přenos dat na frekvenci 433 MHz. Díky SPI rozhraní, hardwarovému CRC filtru a obousměrné komunikaci jde o výrazně kvalitnější alternativu k běžným levným modulům bez zpětné vazby.
Použité komponenty:
- Vývojová deska ESP32: https://dratek.cz/arduino-platforma/1581-esp-32s-esp32-esp8266-development-board-2.4ghz-dual-mode-wifi-bluetooth-antenna-module.html
- Bezdrátový vysílač a přijímač 433 MHz s anténou CC1101: https://dratek.cz/arduino-platforma/231232-bezdratovy-vysilac-a-prijimac-433-mhz-s-antenou-cc1101.html
- 10cm DuPont F-F kabely barevné (40 žil samice-samice): https://dratek.cz/arduino-platforma/1561-10cm-dupont-f-f-kabely-barevne-40-zil-samice-samice.html
- Kabel USB 2.0 A - Micro USB 0.5m: https://dratek.cz/arduino-platforma/52250-kabel-usb-2.0-a-micro-usb-0.5m-modry.html