ESP32-C3入门教程 网络 篇(一、 Wi-Fi 使用入门 — 初始化及STA、AP模式)

前面的8节基础课算是把 ESP32-C3 的外设和一些基本功能都测试过, 
接下来就要进行无线协议 WIFI 和 蓝牙的功能测试。
这节课我们就从 WIFI 开始,了解 ESP32-C3 的WIFI 功能。

前言

接下来的 ESP32-C3 功能测试都是基于自己设计的开发板:

自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

开发环境是乐鑫官方的 ESP-IDF, 基于VScode插件搭建好的:

ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)

学习 ESP32-C3 的WIFI库 使用,不要用到其他外设。

1、ESP32-C3 WiFi 基本介绍

1.1 基本介绍

对于ESP32-C3 WiFi库的介绍,乐鑫的官网的说明链接如下:

乐鑫官方ESP32-C3 WiFi库 API 说明

官方这里介绍的篇幅很少,依然使用官方的图简单介绍:
在这里插入图片描述
详细的的 API 的解释,意义,自行在官网查看。

除了基本的WiFI库,还有一个需要了解的 Wi-Fi 驱动程序:

官方 Wi-Fi 驱动程序说明

在这里插入图片描述

1.2 ESP-NETIF

什么是 ESP-NETIF?为什么介绍 WiFi 要介绍 ESP-NETIF ?

乐鑫的官网的说明链接如下:ESP-NETIF官方说明文档

ESP-NETIF是官方提供的操作TCP/IP协议栈的API,是在 LwIP (轻量级TCP/IP网络协议栈)之上封装的一层供应用程序访问协议栈的便携的接口。

ESP32-C3 WiFi是一个独立的硬件,在使用 WiFi 前需要进行初始化。初始化的时候需要用到 WiFi 驱动库esp_wifi.h(初始化 WiFi 硬件),网络接口esp_netif.h (初始化 LwIP TCP/IP 协议栈)。ESP-NETIF 组件能够处理Wi-Fi事件,以提供一组默认行为。例如,当Wi-Fi站连接到AP时,ESP-NETIF 将自动启动DHCP客户端。

如下图,USER CODE 调用 ESP-NETIF 中的 API 接口初始化 TCP/IP 协议栈,之后调用 esp_wifi 中的API接口初始化wifi硬件,然后就能进入数据的收发过程。

在这里插入图片描述

我们这里只是简单的了解了一下 ESP-NETIF 是什么,为了我们能够理解下面介绍的 WiFi 的使用步骤,具体的内部实现暂时不做深究。

1.3 WiFi事件的注册、响应、信息获取

WiFi 的使用中有各种事件,连接成功、连接失败、得到IP等等,这些事件处理都是基于esp_event库。WiFi驱动程序会将事件发送到默认事件循环。应用程序可以在使用进行注册的回调中处理这些事件event_handler()

Wi-Fi 的事件描述请参考上面说到 的官方 Wi-Fi 驱动程序介绍部分:

在这里插入图片描述

首先调用esp_event_loop_create_default() 创建默认事件循环。

之后使用esp_event_handler_register /esp_event_handler_instance_register将事件处理程序注册到系统事件循环:

ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_event_handler_instance_t instance_any_id; 
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                    ESP_EVENT_ANY_ID,
                                                    &event_handler,
                                                    NULL,
                                                    &instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                    IP_EVENT_STA_GOT_IP,
                                                    &event_handler,
                                                    NULL,
                                                    &instance_got_ip));

额外提一下,esp_event_handler_register /esp_event_handler_instance_register 都是使用的esp_event_handler_register_with_internal

在这里插入图片描述

下面用源码注释说明一下esp_event_handler_instance_register各个参数的意义:

/*
event_base类型为:esp_event_base_t;表示 事件基,代表事件的大类(如WiFi事件,IP事件等)
event_id类型为:int32_t;表示事件ID,即事件基下的一个具体事件(如WiFi连接丢失,IP成功获取)
event_handler:回调函数
*event_handler_arg类型为:void;表示需要传递给handler函数的参数
*instance类型为:esp_event_handler_instance_t指针;**[输出]**表示此函数注册的事件实例对象,用于生命周期管理(如删除unrigister这个事件handler)
*/
esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base,
                                              int32_t event_id,
                                              esp_event_handler_t event_handler,
                                              void *event_handler_arg,
                                              esp_event_handler_instance_t *context)


/*
举例:
IP事件
事件为 IP_EVENT_STA_GOT_IP
回调函数为 event_handler
没有参数
esp_event_handler_instance_t指针,为了后面unregister  instance_got_ip
*/
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                    IP_EVENT_STA_GOT_IP,
                                                    &event_handler,
                                                    NULL,
                                                    &instance_got_ip));
                                                   
/*删除注册*/
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));                                                  

事件回调函数:

在上面事件注册后,会有一个回调函数,我们需要去实现这个回调函数,其有4个参数,示意如下代码注释:

/*
参数一:arg。表示传递给event_handler函数的参数
参数二,eventBase,表示事件基
参数三:event_id,表示事件ID
参数四,表示传递给这个事件的数据
*/
static void event_handler(void* arg, esp_event_base_t event_base,
                                int32_t event_id, void* event_data)

回调函数举个例子:

static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
{
    ESP_LOGI(TAG,"event_base:%s, event_id:%d\r\n",event_base, event_id);
    wifi_event_ap_staconnected_t *wifi_event_data;
    if (event_base == WIFI_EVENT){
        switch (event_id)
        {
            case WIFI_EVENT_STA_START:                  //STA模式启动
                /* code */
                break;
            case WIFI_EVENT_STA_STOP:                   //STA模式关闭
                /* code */
                break;
            case WIFI_EVENT_STA_DISCONNECTED:           //STA模式断开连接
                /* code */
                break;
            case WIFI_EVENT_AP_START:                   //AP模式启动
                /* code */
                break;
            case WIFI_EVENT_AP_STOP:                    //AP模式关闭
                /* code */
                break;
            case WIFI_EVENT_AP_STACONNECTED:            //一台设备连接到esp32
                wifi_event_ap_staconnected_t *AP_STACONNECTED_EVENT_DATA = (wifi_event_ap_staconnected_t *)event_data;  //获取事件信息
                ESP_LOGI(TAG, "station:" MACSTR " join, AID=%d", MAC2STR(AP_STACONNECTED_EVENT_DATA->mac), AP_STACONNECTED_EVENT_DATA->aid);
                break;
            case WIFI_EVENT_AP_STADISCONNECTED:         //一台设备断开与esp32的连接
                wifi_event_ap_stadisconnected_t *AP_STADISCONNECTED_EVENT_DATA = (wifi_event_ap_stadisconnected_t *)event_data;  //获取事件信息
                ESP_LOGI(TAG, "station:" MACSTR "leave, AID=%d", MAC2STR(AP_STADISCONNECTED_EVENT_DATA->mac), AP_STADISCONNECTED_EVENT_DATA->aid);
                break;
            default:
                break;
        }
    }else if(event_base == IP_EVENT){
        switch (event_id)
        {
        case IP_EVENT_STA_GOT_IP:                       //esp32从路由器获取到ip
            /* code */
            break;
        case IP_EVENT_STA_LOST_IP:                      //esp32失去ip
            /* code */
            break;
        case IP_EVENT_AP_STAIPASSIGNED:                 //esp32给设备分配了ip
            /* code */
            break;
        default:
            break;
        }
    }

1.4 WiFi 初始化启动步骤

WiFi 配置初始化的步骤,用官方的两张图表示:

STA模式:
在这里插入图片描述

AP模式:

在这里插入图片描述

下面通过示例再一次说明一下上面图示的使用步骤:

1、初始化 NVS,使用函数nvs_flash_init

在示例中(以 STA 模式示例举例):

在这里插入图片描述

2、初始化 ESP-NETIF,使用esp_netif_init()

在示例中:

在这里插入图片描述

3、调用esp_event_loop_create_default() 创建默认事件循环。之后使用esp_event_handler_register() 将事件处理程序注册到系统事件循环,详情见上一小节 1.3 WiFi事件的注册、响应、信息获取 部分。

在示例中:

在这里插入图片描述

4、初始化WiFi 和 配置WiFi

使用esp_wifi_init进行 WiFi 初始化。

在示例中,先是使用了默认配置进行 WiFi 初始化,如下:

在这里插入图片描述

初始化后,用户可以根据自己的需要使用esp_wifi_set_config(WIFI_IF_STA, &wifi_config) 进行必要的配置,在联合体 wifi_config_t wifi_config中定义对应的参数:

在这里插入图片描述

在示例中的配置如下:

在这里插入图片描述

5、 启动WiFi

使用esp_wifi_start启动WiFi。

Wi-Fi驱动程序将 WIFI_EVENT_STA_START 发布到事件任务;然后,事件任务将执行一些常规操作,并将调用应用程序事件回调函数。

应用程序事件回调函数将WIFI_EVENT_STA_START中继到应用程序任务。此时调用esp_wifi_connect()

在示例中:

在这里插入图片描述

6、实现事件回调函数

回调函数,在上面 1.3 小节有说明,在示例中:

在这里插入图片描述

在一般情况下,上述步骤完成WiFi便可以正常连接工作,在一些环境恶劣场合出现一些连接不稳定等复杂问题,需要根据不同情况不同处理,比如连接超时,意外断开,在设计的时候都需要考虑到,一般的说明在官方都有文档说明

比如:

在这里插入图片描述

总而言之,遇到问题还是先把官方相关的文档看完再寻找问题!

2、示例测试

在官方例程中,我们测试的示例的程序如下图:

在这里插入图片描述

2.1 WiFi STA 模式

STA模式,ESP32-C3连接到其他设备的热点。

WiFISTA模式一般流程请参阅上面 1.4 WiFi 初始化启动步骤,示例需要修改的地方只有一个,就是把 SSID 和 PASS 改成自己环境中可以连接的 WiFi 信息:

在这里插入图片描述

测试结果如下图:

在这里插入图片描述

2.2 WiFi AP 模式

AP模式,ESP32-C3 产生热点供其他设备连接。

WiFI AP模式一般流程请参阅上面 1.4 WiFi 初始化启动步骤, AP模式于STA模式的步骤大体上是一致的,只是在配置 联合体 wifi_config_t中使用的是 wifi_ap_config_t 结构体:

在这里插入图片描述

然后把宏定义的 SSID 和 PASS 改成自己想要设置的 wifi 名称和密码:

在这里插入图片描述

注意一个问题,就是密码的长度必须大于8,否则会出现下图的报错:

在这里插入图片描述

按照上面的说明设置好以后,可以用手机尝试连接 ESP32-C3 的热点,测试效果如下图:

在这里插入图片描述

2.3 WiFi AP-STA 共存模式

在这里插入图片描述

WiFi AP-STA 共存模式,官方好像没有直接的示例代码,我这里是在 AP模式的基础之上,自己参考一些资料进行修改,这里直接上源码(路由器SSID 和 密码 在下面源码中我用的 ****** 表示,如果需要拷贝进行测试,记得修改):

/*  WiFi softAP Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"

#include "lwip/err.h"
#include "lwip/sys.h"

/* The examples use WiFi configuration that you can set via project configuration menu.

   If you'd rather not, just change the below entries to strings with
   the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
#define EXAMPLE_ESP_WIFI_SSID      "JCSZ_ESP32_WIFI"
#define EXAMPLE_ESP_WIFI_PASS      "123454321"

#define EXAMPLE_ESP_WIFI_CHANNEL   CONFIG_ESP_WIFI_CHANNEL
#define EXAMPLE_MAX_STA_CONN       CONFIG_ESP_MAX_STA_CONN

#define ESP_WIFI_STA_SSID      "******"
#define ESP_WIFI_STA_PASS      "******"

static const char *TAG = "wifi AP_STA";

/*重新连接热点*/
void WIFI_EVENT_STA_DISCONNECTED_FUN(void)
{
    esp_wifi_connect();//连接热点
    ESP_LOGI(TAG,"connect to the AP fail");
}

/*有设备连接上ESP32的热点*/
void WIFI_EVENT_AP_STACONNECTED_FUN( void* event_data  )
{
    wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
    /*打印连接设备的MAC地址*/
    ESP_LOGI(TAG, "station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid);
}

/*有设备断开和ESP32的热点*/
void WIFI_EVENT_AP_STADISCONNECTED_FUN( void* event_data  )
{
    wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
    /*打印断开设备的MAC地址*/
    ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d",MAC2STR(event->mac), event->aid);
}

/*连接上路由器(获取到了分配的IP地址)*/
void IP_EVENT_STA_GOT_IP_FUN( void* event_data )
{
    ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
    ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
    ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",ESP_WIFI_STA_SSID, ESP_WIFI_STA_PASS);
}

static void wifi_event_handler(void* arg, esp_event_base_t event_base,
                                    int32_t event_id, void* event_data)
{
    // if (event_id == WIFI_EVENT_AP_STACONNECTED) {
    //     wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
    //     ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",
    //              MAC2STR(event->mac), event->aid);
    // } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
    //     wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
    //     ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d",
    //              MAC2STR(event->mac), event->aid);
    // }
    if( event_base == WIFI_EVENT )
    {
        switch ( event_id )
        {
            case WIFI_EVENT_STA_START:          
                esp_wifi_connect();                  
                break; // STA START
            case WIFI_EVENT_STA_STOP:           
                // ESP_LOGI(TAG,"WIFI_EVENT_STA_STOP"); 
                break; // STA STOP 
            case WIFI_EVENT_STA_DISCONNECTED:   
                WIFI_EVENT_STA_DISCONNECTED_FUN();   
                break; //和路由器断开
            case WIFI_EVENT_AP_START:           
                // ESP_LOGI(TAG,"WIFI_EVENT_AP_START"); 
                break; // AP  START 
            case WIFI_EVENT_AP_STOP:            
                // ESP_LOGI(TAG,"WIFI_EVENT_AP_STOP");  
                break; // AP  STOP
            case WIFI_EVENT_AP_STACONNECTED:                                               //有设备连接上ESP32的热点
                WIFI_EVENT_AP_STACONNECTED_FUN( event_data );
                break; 
            case WIFI_EVENT_AP_STADISCONNECTED:                                               //有设备断开和ESP32的热点
                WIFI_EVENT_AP_STADISCONNECTED_FUN(event_data ); 
                break;                     
            default:  break;
        }
    }
    else if( event_base == IP_EVENT )  // 路由事件ID 组
    {
        switch ( event_id )
        {
            case IP_EVENT_STA_GOT_IP:        
                IP_EVENT_STA_GOT_IP_FUN(event_data);       
                break; //获取到指定IP
            case IP_EVENT_STA_LOST_IP:       
                // ESP_LOGI(TAG,"IP_EVENT_STA_LOST_IP");      
                break;
            case IP_EVENT_AP_STAIPASSIGNED:  
                // ESP_LOGI(TAG,"IP_EVENT_AP_STAIPASSIGNED"); 
                break;
            default:  break;
        }
    }
}

void wifi_init_softap_sta(void)
{
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    esp_netif_create_default_wifi_ap();
    esp_netif_create_default_wifi_sta();//创建有 TCP/IP 堆栈的默认网络接口实例绑定STA。;

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    esp_event_handler_instance_t instance_any_id;
    esp_event_handler_instance_t instance_got_ip;
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        &instance_any_id));
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        &instance_got_ip));

    // ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
    //                                                     ESP_EVENT_ANY_ID,
    //                                                     &wifi_event_handler,
    //                                                     NULL,
    //                                                     NULL));

    wifi_config_t wifi_config_sta = {
        .sta = {
            .ssid = ESP_WIFI_STA_SSID,
            .password = ESP_WIFI_STA_PASS,
            /* Setting a password implies station will connect to all security modes including WEP/WPA.
             * However these modes are deprecated and not advisable to be used. Incase your Access point
             * doesn't support WPA2, these mode can be enabled by commenting below line */
	     .threshold.authmode = WIFI_AUTH_WPA2_PSK,

            .pmf_cfg = {
                .capable = true,
                .required = false
            },
        },
    };
    // strcpy( (char *) wifi_config_sta.sta.ssid     ,  ESP_WIFI_STA_SSID );
    if(strlen(ESP_WIFI_STA_PASS)==0)//没有密码
    {
        wifi_config_sta.sta.threshold.authmode = WIFI_AUTH_OPEN;//加密方式
    }
    else{
        strcpy( (char *) wifi_config_sta.sta.password ,  ESP_WIFI_STA_PASS);
    }

    wifi_config_t wifi_config_ap = {
        .ap = {
            .ssid = EXAMPLE_ESP_WIFI_SSID,
            .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
            .channel = EXAMPLE_ESP_WIFI_CHANNEL,
            .password = EXAMPLE_ESP_WIFI_PASS,
            .max_connection = EXAMPLE_MAX_STA_CONN,
            .authmode = WIFI_AUTH_WPA_WPA2_PSK
        },
    };
    if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) {
        wifi_config_ap.ap.authmode = WIFI_AUTH_OPEN;
    }

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));

    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config_ap));

    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config_sta));

    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "wifi_init_softap_sta finished. SSID:%s password:%s channel:%d",
             EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_CHANNEL);
}

void app_main(void)
{
    //Initialize NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
      ESP_ERROR_CHECK(nvs_flash_erase());
      ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    ESP_LOGI(TAG, "ESP_WIFI_MODE_AP_STA");
    wifi_init_softap_sta();
}

测试结果如下:

在这里插入图片描述

最后的问题,测试示例中的代码虽然是 STA 和 AP 共存模式,虽然作为 STA连接的路由器能够连接互联网,但是ESP32-C3 作为 AP 热点并不能连接互联网,还需要进行对应的设计, 使用IP_NAPT模式,后面用到再来补充说明。

  • 27
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
### 回答1: Blinker ESP32C3 是一款基于 ESP32C3 开发的物联网解决方案,它能够帮助用户实现设备与云端的连接和通信。 Blinker ESP32C3 提供了丰富的功能,使得用户可以方便地构建智能设备并加入到物联网中。它支持多种传感器和执行器,例如温湿度传感器、开关、继电器等,可以满足各种不同的应用场景需求。 Blinker ESP32C3 的优点在于其简单易用的开发和部署过程。它提供了完整的软硬件方案和示例代码,开发者只需按照文档指引进行简单的配置和编程,即可实现设备的连接和数据交互。同时,Blinker ESP32C3 还提供了跨平台的移动端 APP 和 Web 控制台,用户可以通过这些工具来管理和控制设备。 另外,Blinker ESP32C3 还支持OTA(远程升级)功能,用户可以利用这一功能来远程升级设备的固件,无需人工干预。这个功能非常有用,可以帮助用户及时修复和改进设备的功能。 总之,Blinker ESP32C3 是一款功能强大且简单易用的物联网解决方案。它能够帮助用户快速构建智能设备,并实现设备与云端的连接和通信。无论是个人项目还是商业应用,Blinker ESP32C3 都能够提供可靠的解决方案。 ### 回答2: blinker esp32c3是一款基于ESP32-C3芯片的物联网开发板,具有内置WiFi和蓝牙功能。它采用了迅捷的双核处理器,可在较低的功耗下实现高性能的应用。该开发板还配备了丰富的外设接口和引脚,可连接各种传感器和执行器,实现灵活多样的物联网应用。 blinker esp32c3支持Blinker智能家居平台,通过与Blinker app配合使用,用户可以方便地实现物联网设备的远程控制和监测。同时,Blinker平台还提供了丰富的应用和功能模块,用户可以通过简单的拖拽操作就能快速定制个性化的物联网应用。 这款开发板还支持Arduino编程环境,开发者可以使用C++语言编写代码,实现各种功能。同时,ESP-IDF编程工具链也可以用于高级开发,提供了更丰富的底层功能和灵活性。 blinker esp32c3在物联网应用开发领域有着广泛的应用,可以用于智能家居、工业自动化、农业监测、环境监测等各种场景。该开发板具有易用性、稳定性和高性能的特点,可以帮助开发者快速搭建物联网系统,实现智能化的控制和监测。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矜辰所致

您们的鼓励是我奋斗的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值