博客
关于我
安信可ESP32-C3模组阿里云远程控制WS2812RGB灯条(基于ESP-IDF的SDK)
阅读量:389 次
发布时间:2019-03-05

本文共 5473 字,大约阅读时间需要 18 分钟。

ESP32-C3开发与WS2812灯条控制

ESP32-C3是一款双模通信模块,支持2.4G WiFi和BLE5.0。本文基于ESP-IDF框架进行二次开发,使用WS2812 RGB灯条进行控制。

硬件准备

- ESP32-C3F开发板 - VB01离线语音模块 - WS2812 RGB灯条

新建工程文件

将ESP-IDF中的空例程复制到工程目录中,路径为`
/esp/idf/examples/get-started/sample_project`。主函数文件位于`main/`目录下的`main.c`。

WS2812驱动配置

WS2812驱动可以通过ESP-IDF中的示例`examples/peripherals/rmt/led_strip`进行移植。需要将`led_strip`库添加到项目中。
  • 创建components文件夹:
  • mkdir components
    1. 复制examples/common_components/led_stripcomponents中。
    2. main.c中引入头文件:
    3. #include "driver/rmt.h"  #include "led_strip.h"  #include "esp_system.h"  #include "esp_log.h"

      灯条初始化

      ```c #define RMT_TX_NUM 3 #define RMT_TX_CHANNEL RMT_CHANNEL_0 #define LED_STRIP_NUM 24

      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串口配置

      1. 初始化UART配置: ```c void UART_Init(void) { const uart_config_t uart_config = { .baud_rate = 38400, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_APB, };
      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);
      1. 串口接收任务函数:
      2. 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);      }  }

        WiFi配置

        通过`menuconfig`配置WiFi名称和密码即可连接。ESP-IDF已提供相关配置文件,只需简单修改即可完成连接。

        阿里云MQTT配置

        1. 创建阿里云物联网产品和设备,获取设备的三元组信息。 2. 在代码中配置MQTT客户端: ```c void TaskXMqttRecieve(void *p) { esp_mqtt_client_config_t mqtt_cfg = { .host = MQTT_LINK_HOST, .port = MQTT_LINK_PORT, .username = MQTT_LINK_USERNAME, .password = MQTT_LINK_PASS, .client_id = MQTT_LINK_CLIENT_ID, .event_handle = MqttCloudsCallBack, .keepalive = 120, .disable_auto_reconnect = false, .disable_clean_session = false, };
        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;  }

        消息处理

        ```c void Task_ParseJSON(void *pvParameters) { while (1) { struct __User_data *pMqttMsg; printf("Task_ParseJSON_Message xQueueReceive wait [%d] ... \n", esp_get_free_heap_size()); xQueueReceive(ParseJSONQueueHandler, &pMqttMsg, portMAX_DELAY); printf("Task_ParseJSON_Message xQueueReceive get [%s] ... \n", pMqttMsg->allData);
        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/

    你可能感兴趣的文章
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO三大组件基础知识
    查看>>
    NIO与零拷贝和AIO
    查看>>