本文共 5473 字,大约阅读时间需要 18 分钟。
ESP32-C3是一款双模通信模块,支持2.4G WiFi和BLE5.0。本文基于ESP-IDF框架进行二次开发,使用WS2812 RGB灯条进行控制。
components文件夹:mkdir components
examples/common_components/led_strip到components中。main.c中引入头文件:#include "driver/rmt.h" #include "led_strip.h" #include "esp_system.h" #include "esp_log.h"
void init_led(void) {
rmt_config_t config = RMT_DEFAULT_CONFIG_TX(RMT_TX_NUM, RMT_TX_CHANNEL);config.clk_div = 2;ESP_ERROR_CHECK(rmt_config(&config));ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(LED_STRIP_NUM, (led_strip_dev_t)config.channel); strip = led_strip_new_rmt_ws2812(&strip_config); if (!strip) { ESP_LOGE(TAG, "install WS2812 driver failed"); } ESP_ERROR_CHECK(strip->clear(strip, 100)); }
RGB颜色设置
```c struct WS2812_COLOR { uint32_t red; uint32_t green; uint32_t blue; }; struct WS2812_COLOR WS2812_RGB; void set_rgb(uint16_t red, uint16_t green, uint16_t blue) { for (int i = 0; i < LED_STRIP_NUM; i++) { strip->set_pixel(strip, i, red, green, blue); } WS2812_RGB.red = red; WS2812_RGB.green = green; WS2812_RGB.blue = blue; strip->refresh(strip, 10); }
uart_driver_install(UART_NUM_1, RX_BUF_SIZE * 2, 0, 0, NULL, 0); uart_param_config(UART_NUM_1, &uart_config); uart_set_pin(UART_NUM_1, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}
2. 创建接收任务: ```c xTaskCreate(uartRxTask, "uart_rx_task", 1024 * 3, NULL, 4, NULL);
static void uartRxTask(void *arg) { static const char *RX_TASK_TAG = "RX_TASK"; esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO); uint8_t *data = (uint8_t *)malloc(RX_BUF_SIZE + 1); while (1) { const int rxBytes = uart_read_bytes(UART_NUM_1, data, RX_BUF_SIZE, 1000 / portTICK_RATE_MS); if (rxBytes > 0) { data[rxBytes] = 0; ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data); memset(cJson_data, 0, sizeof(cJson_data)); uartControlLedStrip(uartDataHandle(data)); ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO); } free(data); } } client = esp_mqtt_client_init(&mqtt_cfg); esp_mqtt_client_start(client); vTaskDelete(NULL);
}
3. 订阅主题并处理消息: ```c sprintf(MqttTopicSub, "/sys/%s/%s/thing/service/property/set", MQTT_ProductKey, MQTT_DeviceName); ESP_LOGI(TAG, "MqttTopicSub: %s", MqttTopicSub); case MQTT_EVENT_DATA: { printf("TOPIC=%.*s \r\n", event->topic_len, event->topic); printf("DATA=%.*s \r\n\r\n", event->data_len, event->data); struct __User_data *pTmper; memset(&user_data, 0, sizeof(struct __User_data)); sprintf(user_data.allData, "%.*s", event->data_len, event->data); pTmper = &user_data; user_data.dataLen = event->data_len; xQueueSend(ParseJSONQueueHandler, (void *)&pTmper, portMAX_DELAY); break; } cJSON *pJsonRoot = cJSON_Parse(pMqttMsg->allData); if (pJsonRoot == NULL) { printf("[SY] Task_ParseJSON_Message xQueueReceive not json ... \n"); goto __cJSON_Delete; } cJSON *pJsonParams = cJSON_GetObjectItem(pJsonRoot, "params"); if (pJsonParams == NULL) { printf("pJsonParams NULL\r\n"); goto __cJSON_Delete; } cJSON *pJsonGRB = cJSON_GetObjectItem(pJsonParams, "RGB"); if (pJsonGRB == NULL) goto __cJSON_Delete; cJSON *pJSON_Item_Red = cJSON_GetObjectItem(pJsonGRB, "R"); cJSON *pJSON_Item_Gree = cJSON_GetObjectItem(pJsonGRB, "G"); cJSON *pJSON_Item_Blue = cJSON_GetObjectItem(pJsonGRB, "B"); set_rgb(pJSON_Item_Red->valueint, pJSON_Item_Gree->valueint, pJSON_Item_Blue->valueint); if (WS2812_RGB.red != 0 && WS2812_RGB.green != 0 && WS2812_RGB.blue != 0) { uart_write_bytes(UART_NUM_1, "AT+PLAY=21\r\n", 13); } else if (WS2812_RGB.red != 254 && WS2812_RGB.green != 254 && WS2812_RGB.blue != 254) { uart_write_bytes(UART_NUM_1, "AT+PLAY=22\r\n", 13); } __cJSON_Delete: cJSON_Delete(pJsonRoot); } }
转载地址:http://ltlwz.baihongyu.com/