#include <driver/rmt.h>
// Определяем каналы и пины для передачи и приёма
#define RMT_TX_CHANNEL (RMT_CHANNEL_0)
#define RMT_RX_CHANNEL (RMT_CHANNEL_1)
#define RTM_TX_GPIO_NUM (26)
#define RTM_RX_GPIO_NUM (36)
// Константы для таймингов
#define RMT_CLK_DIV (80)
#define RMT_1US_TICKS (80000000 / RMT_CLK_DIV / 1000000)
// Буфер для RMT команд
rmt_item32_t rmtbuff[2048];
// Тайминги для кодирования
#define T0H 670
#define T1H 320
#define T0L 348
#define T1L 642
// Начальный код для сигнала
#define RMT_START_CODE0 {4868, 1, 2469, 0}
#define RMT_START_CODE1 {1647, 1, 315, 0}
// Инициализация RMT
void initRMT()
{
#ifndef RF433RX
rmt_config_t txconfig;
txconfig.rmt_mode = RMT_MODE_TX;
txconfig.channel = RMT_TX_CHANNEL;
txconfig.gpio_num = gpio_num_t(RTM_TX_GPIO_NUM);
txconfig.mem_block_num = 1;
txconfig.tx_config.loop_en = false;
txconfig.tx_config.carrier_en = false;
txconfig.tx_config.idle_output_en = true;
txconfig.tx_config.idle_level = rmt_idle_level_t(0);
txconfig.clk_div = RMT_CLK_DIV;
ESP_ERROR_CHECK(rmt_config(&txconfig));
ESP_ERROR_CHECK(rmt_driver_install(txconfig.channel, 0, 0));
#else
rmt_config_t rxconfig;
rxconfig.rmt_mode = RMT_MODE_RX;
rxconfig.channel = RMT_RX_CHANNEL;
rxconfig.gpio_num = gpio_num_t(RTM_RX_GPIO_NUM);
rxconfig.mem_block_num = 6;
rxconfig.clk_div = RMT_CLK_DIV;
rxconfig.rx_config.filter_en = true;
rxconfig.rx_config.filter_ticks_thresh = 200 * RMT_1US_TICKS;
rxconfig.rx_config.idle_threshold = 3 * RMT_1MS_TICKS;
ESP_ERROR_CHECK(rmt_config(&rxconfig));
ESP_ERROR_CHECK(rmt_driver_install(rxconfig.channel, 2048, 0));
#endif
}
// Массив данных
uint8_t data[6] = {0xAA, 0x55, 0x01, 0x02, 0x03, 0x04};
// Отправка
void send(uint8_t* buff, size_t size)
{
rmtbuff[0] = (rmt_item32_t){RMT_START_CODE0};
rmtbuff[1] = (rmt_item32_t){RMT_START_CODE1};
for (int i = 0; i < size; i++) {
uint8_t mask = 0x80;
for (int n = 0; n < 8; n++) {
rmtbuff[2 + i * 8 + n] =
((buff[i] & mask)) ? ((rmt_item32_t){RMT_MODE_RX}) : ((rmt_item32_t){RMT_MODE_RX});
mask >>= 1;
}
}
for (int i = 0; i < 8; i++) {
ESP_ERROR_CHECK(rmt_write_items(RMT_TX_CHANNEL, rmtbuff, 2 + size * 8, false));
ESP_ERROR_CHECK(rmt_wait_tx_done(RMT_TX_CHANNEL, portMAX_DELAY));
}
}
void setup()
{
Serial.begin(115200);
delay(100);
initRMT();
pinMode(RTM_TX_GPIO_NUM, OUTPUT);
pinMode(RTM_RX_GPIO_NUM, INPUT);
}
void loop()
{
Serial.println("Отправка данных");
send(data, 6);
delay(2000);
}