ESP32开发
本文介绍如何开发ESP32物联网设备,连接SiliZap物联网平台,实现设备数据上报和远程控制。


一、乐鑫介绍
1.1 ESP32系列概述
乐鑫科技(Espressif)成立于2008年,是中国领先的物联网芯片设计公司,专注于Wi-Fi、蓝牙和低功耗SoC解决方案。公司总部位于上海,并在全球多地设有分支机构。乐鑫科技官网
乐鑫科技(Espressif)的ESP32系列是一系列高性能、低功耗的Wi-Fi和蓝牙SoC(系统级芯片),专为物联网应用设计。这些芯片提供了强大的处理能力、丰富的外设接口和出色的连接性能,成为物联网开发的理想选择。ESP32系列自推出以来,凭借其开源友好的生态系统和极具竞争力的性价比,已在全球物联网领域获得广泛应用,成为众多开发者的首选平台。
1.2 ESP32-S3特性
以ESP32-S3为例,这是一款高性能、低功耗的双核Wi-Fi 6 + 蓝牙5.0 (LE) SoC,是ESP32系列的最新成员,具备以下特点:
强大的处理能力:
- 双核Xtensa LX7处理器,最高频率240 MHz
- 512 KB SRAM,支持更大程序和数据缓存
- 384 KB ROM用于程序引导和内核功能
增强的连接性能:
- Wi-Fi 6 (802.11 b/g/n/ac/ax)支持
- 蓝牙5.0和蓝牙Mesh
- 高带宽和多设备连接能力
丰富的外设接口:
- 45个可编程GPIO
- 支持USB OTG
- 14个电容触摸传感器
- 12位ADC,采样率高达2 MSPS
- 2个8位DAC
- 4个SPI接口、2个I²C接口、2个I²S接口
- 2个UART接口
先进的安全特性:
- RSA-3072安全启动
- AES-128/192/256-XTS Flash加密
- ECC加速
- 安全元件支持
- 多种物理防篡改机制
宽温域工作:
- 工作温度范围:-40°C~105°C
- 适用于各类工业、消费和照明应用
二、环境搭建
2.1 开发环境简介
对于ESP32系列设备开发,我们推荐使用以下两种开发环境:
- VSCode + PlatformIO:适合初学者的简易开发环境,提供完整的Arduino和ESP-IDF支持,拥有强大的代码补全和调试功能
- VSCode + ESP-IDF插件:乐鑫官方推荐的开发环境,提供最完整的API支持和深度定制能力
对于初学者来说,VSCode + PlatformIO插件是开发ESP32系列设备最简单便捷的方式。PlatformIO是一个跨平台的开源构建系统和库管理器,支持多种开发板和框架,包括ESP32和ESP-IDF。
2.2 VSCode + PlatformIO 安装步骤
对于初学者来说,使用VSCode + PlatformIO插件是开发ESP32系列设备最简单便捷的方式。PlatformIO是一个跨平台的开源构建系统和库管理器,支持多种开发板和框架。
2.2.1 安装步骤
- 安装VSCode
- 访问VSCode官网下载最新版本
- 按照安装向导完成安装
- 安装PlatformIO插件
- 打开VSCode
- 点击左侧边栏的扩展图标(或按Ctrl+Shift+X)
- 在搜索框中输入"PlatformIO IDE"
- 点击安装按钮
- 安装完成后重启VSCode
2.3 ESP-IDF开发环境简介
使用VSCode + ESP-IDF插件是开发ESP32系列设备最简单便捷的方式。ESP-IDF(Espressif IoT Development Framework)是乐鑫科技(Espressif Systems)官方推出的物联网开发框架,专为其 ESP32 系列芯片(包括 ESP32、ESP32-S2/S3、ESP32-C3/C6 等)设计,是开发基于 ESP32 芯片的物联网设备的核心工具集。
2.3.1 安装步骤
- 安装VSCode
- 访问VSCode官网下载最新版本
- 按照安装向导完成安装
- 安装ESP-IDF插件
查找插件 打开已安装的 VSCode,进入插件市场(点击左侧导航栏的「扩展」图标或使用快捷键 Ctrl+Shift+X),在搜索框中输入 ESP-IDF Extension,找到由「Espressif Systems」开发的官方插件(通常是第一个结果,图标为乐鑫 logo)。
安装插件 点击插件卡片上的「安装」按钮,等待插件下载并安装完成。安装过程中 VSCode 底部会显示进度条,完成后可能需要重启 VSCode 使插件生效(若有提示,点击「重新加载」即可)。
配置 ESP-IDF 环境 插件安装完成后,需要配置 ESP-IDF 开发环境(包括 SDK、工具链等),步骤如下:
打开命令面板:使用快捷键 Ctrl+Shift+P(macOS 为 Cmd+Shift+P),输入并选择「ESP-IDF: Configure ESP-IDF Extension」,启动配置向导。
选择配置方式:向导提供 3 种方式,推荐新手选择「Express (Recommended)」(快速配置),该模式会自动下载并安装 ESP-IDF SDK、编译工具链、调试工具等全套环境;
- 若已有本地 ESP-IDF 目录,可选择「Use existing ESP-IDF directory」
- 若需通过 Git 克隆源码,可选择「Advanced」
选择安装路径:点击「Browse」选择一个无中文、无空格的本地路径(例如
C:\esp-idf或~/esp-idf),作为 ESP-IDF 环境的安装目录。选择 ESP-IDF 版本:在版本列表中选择稳定版(例如 v5.2 或最新 LTS 版本),建议优先选择官方推荐的稳定版本,避免开发中出现兼容性问题。
等待安装完成:配置向导会自动下载所选版本的 SDK 和工具链,过程可能需要 10-30 分钟(取决于网络速度),请保持网络稳定。若下载中断,可重新启动配置向导继续。
验证环境配置 环境安装完成后,可通过创建示例项目验证是否成功:
创建新项目:打开命令面板,输入并选择「ESP-IDF: New Project」
配置项目信息:
- 填写项目名称(例如
hello_world) - 选择项目保存路径(无中文 / 空格)
- 在「Target Device」中选择目标芯片(例如 ESP32)
- 填写项目名称(例如
选择模板:在示例模板中选择「hello_world」,点击「Create Project」
编译与烧录:
- 项目打开后,使用快捷键 Ctrl+E, B(或点击底部状态栏的「Build」按钮)编译项目
- 编译成功后,连接 ESP32 开发板
- 使用快捷键 Ctrl+E, F(或点击「Flash」按钮)烧录程序
- 通过「Monitor」(Ctrl+E, M)查看串口输出
验证成功:若能看到串口输出的「Hello world!」信息,说明环境配置正常。
三、VScode+PlatformIO实战开发
基于上述开发环境的搭建完成。
3.1 PlatformIO环境搭建
- 已安装好VSCode + PlatformIO的开发环境
- 准备好开发板
- USB数据线
- 在SiliZap平台上已创建产品和设备,获取MQTT连接信息
3.2 代码获取
从SiliZap官方Gitee仓库克隆或下载项目源码: git clone https://gitee.com/SiliZap/SZ_ESP32_PlatformIO_PUBLIC.git
代码仓库中的config.hpp包含了完整的配置参数,MQTT信息获取见:快速入门
#ifndef CONFIG_HPP
#define CONFIG_HPP
#include <Arduino.h>
#include <stdint.h>
// 设备状态结构体
typedef struct {
unsigned char lamp_livingroom; // 客厅灯
unsigned char lamp_kitchen; // 厨房灯
unsigned char lamp_bedroom; // 卧室灯
unsigned char lamp_bathroom; // 洗手间灯
unsigned char lamp_diningroom; // 餐厅灯
unsigned char lamp_studyroom; // 书房灯
unsigned char fan_livingroom; // 客厅风扇
unsigned char ac_livingroom; // 客厅空调
unsigned char alarm_livingroom; // 客厅警报
unsigned char tablelamp_bedroom; // 卧室台灯
unsigned char closetlamp_bedroom; // 卧室衣柜灯
unsigned char domelamp_livingroom;// 客厅顶灯
unsigned char porchlamp_livingroom;// 客厅门廊灯
unsigned char tv_livingroom; // 客厅电视
unsigned char curtain_livingroom; // 客厅窗帘
unsigned char motor_1;
unsigned char motor_2;
} DeviceState;
// 传感器数据结构体
typedef struct {
float temperature; // 温度
float humidity; // 湿度
float lux; // 光照强度
float tvoc; // 总挥发性有机物
float formaldehyde; // 甲醛
float co2; // 二氧化碳
unsigned char flame; // 火焰
unsigned char person; // 人体感应
} SensorData;
// 平台信息
static const char* product_id = "XXX";
static const char* user_id = "XXX";
// MQTT配置
static const char* MQTT_BROKER = "XXX";
static const int MQTT_PORT = 1883;
static const char* MQTT_USERNAME = "XXX";
static const char* MQTT_PASSWORD = "XXX";
// 默认版本号
static const char* DEFAULT_VERSION = "0.0.0.2";
// WiFi配置结构体
typedef struct {
const char* ssid;
const char* password;
} WifiConfig;
// WiFi配置数组,系统会遍历这些配置,尝试连接在线的WiFi
const WifiConfig WIFI_CONFIGS[] = {
{"XXX", "XXX"},
{"Gunter", "{qwerty123}"},
{"Fairy", "{qwerty123}"},
{"JJDW","jjdw0108"}
};
// WiFi配置数组大小
const size_t NUM_WIFI_CONFIGS = sizeof(WIFI_CONFIGS) / sizeof(WifiConfig);
// GPIO引脚配置
const int DEFAULT_TEMT6000_GPIO = 4; // 光照传感器GPIO引脚 (对应ADC1_CH3)
// LCD显示屏引脚配置 - 使用预处理宏定义,便于TFT_eSPI库引用
#ifndef LCD_CS_PIN
#define LCD_CS_PIN 46 // LCD片选引脚
#endif
#ifndef LCD_DC_PIN
#define LCD_DC_PIN 9 // LCD数据/命令选择引脚
#endif
#ifndef LCD_RST_PIN
#define LCD_RST_PIN 10 // LCD复位引脚
#endif
#ifndef LCD_BL_PIN
#define LCD_BL_PIN 3 // LCD背光控制引脚
#endif
#ifndef LCD_MOSI_PIN
#define LCD_MOSI_PIN 11 // LCD MOSI引脚
#endif
#ifndef LCD_SCLK_PIN
#define LCD_SCLK_PIN 12 // LCD SCLK引脚
#endif
const int DEFAULT_PRESENCE_SENSOR_GPIO = 5; // 人体传感器GPIO引脚
const int DEFAULT_FLAME_SENSOR_GPIO = 6; // 火焰检测传感器GPIO引脚
// UART引脚配置参数
const int DEFAULT_RX_PIN = 18;
const int DEFAULT_TX_PIN = 17;
// I2C引脚配置参数
const int DEFAULT_SDA_PIN = 15;
const int DEFAULT_SCL_PIN = 16;
// 设备配置结构体 - 包含状态变量偏移量,用于动态访问
typedef struct {
const char* cn_name; // 中文名称
const char* en_name; // 英文名称
int gpio_pin; // GPIO引脚
size_t state_offset; // 状态变量在DeviceState结构体中的偏移量
} DeviceConfig;
// 为兼容现有代码保留GPIO_OUTPUT_PINS
const int GPIO_OUTPUT_PINS[] = {
20,
19,
8,
7,
47,
21,
14,
13,
45,
48
};
const DeviceConfig DEVICES[] = {
{"客厅灯", "lamp_livingroom", GPIO_OUTPUT_PINS[0], 0},
{"厨房灯", "lamp_kitchen", GPIO_OUTPUT_PINS[1], 1},
{"卧室灯", "lamp_bedroom", GPIO_OUTPUT_PINS[2], 2},
{"洗手间灯", "lamp_bathroom", GPIO_OUTPUT_PINS[3], 3},
{"客厅风扇", "fan_livingroom", GPIO_OUTPUT_PINS[4], 4},
{"餐厅灯", "lamp_diningroom", GPIO_OUTPUT_PINS[5], 5},
{"书房灯", "lamp_studyroom", GPIO_OUTPUT_PINS[6], 6},
{"客厅告警", "alarm_livingroom", GPIO_OUTPUT_PINS[7], 7},
};
const size_t NUM_DEVICES = sizeof(DEVICES) / sizeof(DeviceConfig);
const size_t NUM_GPIO_OUTPUT_PINS = sizeof(GPIO_OUTPUT_PINS) / sizeof(int);
// 火焰传感器配置参数
const bool DEFAULT_FLAME_SENSOR_ACTIVE_LOW = true; // 火焰传感器信号有效电平
const uint32_t DEFAULT_FLAME_DEBOUNCE_MS = 50; // 火焰传感器防抖时间(毫秒)
// 人体检测传感器配置参数
const bool DEFAULT_PRESENCE_ACTIVE_HIGH = true; // 人体检测传感器信号有效电平
const uint32_t DEFAULT_PRESENCE_DEBOUNCE_MS = 100; // 人体检测传感器防抖时间(毫秒)
#endif // CONFIG_HPP仓库中已经包含了完整的连接代码实现,详情可查看README.md
3.3 编译和上传
使用SZ_ESP32_IDF_PUBLIC仓库的步骤:
- 克隆仓库:git clone https://gitee.com/SiliZap/SZ_ESP32_IDF_PUBLIC.git
- 打开VSCode并导入该项目
- 修改config.hpp中的配置参数:
- 填写您的产品ID、用户ID
- 配置MQTT服务器信息
- 修改为您自己的WiFi名称和密码
- 按照下图按钮进行点击,编译、下载、监控日志。

四、VScode+ESP-IDF实战开发
基于上述开发环境的搭建完成。
4.1 ESP-IDF环境搭建
- 已安装好VSCode + ESP-IDF的开发环境
- 准备好开发板
- USB数据线
- 在SiliZap平台上已创建产品和设备,获取MQTT连接信息
4.2 代码获取
从SiliZap官方Gitee仓库克隆或下载项目源码:
git clone https://gitee.com/SiliZap/SZ_ESP32_IDF_PUBLIC.git代码仓库中的config.hpp包含了完整的配置参数,MQTT信息获取见:快速入门
// MQTT配置
#include <string.h>
#include <inttypes.h>
#include "driver/gpio.h"
#include "esp_adc/adc_oneshot.h"
#include "driver/spi_master.h"
// 设备状态结构体
typedef struct {
unsigned char lamp_livingroom; // 客厅灯
unsigned char lamp_kitchen; // 厨房灯
unsigned char lamp_bedroom; // 卧室灯
unsigned char lamp_bathroom; // 洗手间灯
unsigned char lamp_diningroom; // 餐厅灯
unsigned char lamp_studyroom; // 书房灯
unsigned char fan_livingroom; // 客厅风扇
unsigned char ac_livingroom; // 客厅空调
unsigned char alarm_livingroom; // 客厅警报
unsigned char tablelamp_bedroom; // 卧室台灯
unsigned char closetlamp_bedroom; // 卧室衣柜灯
unsigned char domelamp_livingroom;// 客厅顶灯
unsigned char porchlamp_livingroom;// 客厅门廊灯
unsigned char tv_livingroom; // 客厅电视
unsigned char curtain_livingroom; // 客厅窗帘
unsigned char motor_1; // 电机1 (GPIO45)
unsigned char motor_2; // 电机2 (GPIO48)
} DeviceState;
// 传感器数据结构体
typedef struct {
float temperature; // 温度
float humidity; // 湿度
float lux; // 光照强度
float tvoc; // 总挥发性有机物
float formaldehyde; // 甲醛
float co2; // 二氧化碳
unsigned char flame; // 火焰
unsigned char person; // 人体感应
} SensorData;
// 平台信息
constexpr const char* product_id = "XXX";
constexpr const char* user_id = "XXX";
constexpr const char* MQTT_BROKER = "XXX";
constexpr int MQTT_PORT = 1883;
constexpr const char* MQTT_USERNAME = "XXX";
constexpr const char* MQTT_PASSWORD = "XXX";
// 默认版本号
constexpr const char* DEFAULT_VERSION = "0.0.0.1";
// WiFi配置结构体
typedef struct {
const char* ssid;
const char* password;
} WifiConfig;
// WiFi配置数组,系统会遍历这些配置,尝试连接在线的WiFi
constexpr WifiConfig WIFI_CONFIGS[] = {
{"XXX", "XXX"},
{"Gunter", "{qwerty123}"},
{"Fairy", "{qwerty123}"},
{"JJDW","jjdw0108"}
};
// WiFi配置数组大小
constexpr size_t NUM_WIFI_CONFIGS = sizeof(WIFI_CONFIGS) / sizeof(WifiConfig);
constexpr gpio_num_t DEFAULT_TEMT6000_GPIO = GPIO_NUM_4; // 光照传感器GPIO引脚 (对应ADC1_CH3)
constexpr gpio_num_t DEFAULT_PRESENCE_SENSOR_GPIO = GPIO_NUM_5; // 人体传感器GPIO引脚
constexpr gpio_num_t DEFAULT_FLAME_SENSOR_GPIO = GPIO_NUM_6; // 火焰检测传感器GPIO引脚
// UART引脚配置参数
constexpr int DEFAULT_RX_PIN = GPIO_NUM_18;
constexpr int DEFAULT_TX_PIN = GPIO_NUM_17;
// I2C引脚配置参数
constexpr gpio_num_t DEFAULT_SDA_PIN = GPIO_NUM_15;
constexpr gpio_num_t DEFAULT_SCL_PIN = GPIO_NUM_16;
// 设备配置结构体 - 包含状态变量偏移量,用于动态访问
typedef struct {
const char* cn_name; // 中文名称
const char* en_name; // 英文名称
gpio_num_t gpio_pin; // GPIO引脚
size_t state_offset; // 状态变量在DeviceState结构体中的偏移量
} DeviceConfig;
// 为兼容现有代码保留GPIO_OUTPUT_PINS
constexpr gpio_num_t GPIO_OUTPUT_PINS[] = {
GPIO_NUM_20,
GPIO_NUM_19,
GPIO_NUM_8,
GPIO_NUM_7,
GPIO_NUM_47,
GPIO_NUM_21,
GPIO_NUM_14,
GPIO_NUM_13,
GPIO_NUM_45, // 电机1 GPIO
GPIO_NUM_48 // 电机2 GPIO
};
constexpr DeviceConfig DEVICES[] = {
{"客厅灯", "lamp_livingroom", GPIO_OUTPUT_PINS[0], 0}, // 偏移量0对应第一个成员变量
{"厨房灯", "lamp_kitchen", GPIO_OUTPUT_PINS[1], 1}, // 偏移量1对应第二个成员变量
{"卧室灯", "lamp_bedroom", GPIO_OUTPUT_PINS[2], 2}, // 偏移量2对应第三个成员变量
{"洗手间灯", "lamp_bathroom", GPIO_OUTPUT_PINS[3], 3}, // 偏移量3对应第四个成员变量
{"客厅风扇", "fan_livingroom", GPIO_OUTPUT_PINS[4], 4}, // 偏移量4对应第五个成员变量
{"餐厅灯", "lamp_diningroom", GPIO_OUTPUT_PINS[5], 5}, // 偏移量5对应第六个成员变量
{"书房灯", "lamp_studyroom", GPIO_OUTPUT_PINS[6], 6}, // 偏移量6对应第七个成员变量
{"客厅告警", "alarm_livingroom", GPIO_OUTPUT_PINS[7], 7}, // 偏移量7对应第八个成员变量
};
constexpr size_t NUM_DEVICES = sizeof(DEVICES) / sizeof(DeviceConfig);
constexpr size_t NUM_GPIO_OUTPUT_PINS = sizeof(GPIO_OUTPUT_PINS) / sizeof(gpio_num_t);
// 火焰传感器配置参数
constexpr bool DEFAULT_FLAME_SENSOR_ACTIVE_LOW = true; // 火焰传感器信号有效电平
constexpr uint32_t DEFAULT_FLAME_DEBOUNCE_MS = 50; // 火焰传感器防抖时间(毫秒) - 降低以提高灵敏度
// 人体检测传感器配置参数
constexpr bool DEFAULT_PRESENCE_ACTIVE_HIGH = true; // 人体检测传感器信号有效电平
constexpr uint32_t DEFAULT_PRESENCE_DEBOUNCE_MS = 100; // 人体检测传感器防抖时间(毫秒) - 降低以提高灵敏度
// 光照传感器配置参数
constexpr adc_channel_t DEFAULT_TEMT6000_ADC_CHANNEL = ADC_CHANNEL_3; // 光照传感器ADC通道 - GPIO4对应ADC1_CH3
// LCD 1.8寸显示屏引脚定义
constexpr gpio_num_t LCD_BL_PIN = GPIO_NUM_3; // 背光引脚
constexpr gpio_num_t LCD_CS_PIN = GPIO_NUM_46; // 片选引脚
constexpr gpio_num_t LCD_DC_PIN = GPIO_NUM_9; // 数据/命令控制引脚
constexpr gpio_num_t LCD_RES_PIN = GPIO_NUM_10; // 复位引脚
constexpr gpio_num_t LCD_MOSI_PIN = GPIO_NUM_11; // 数据输出引脚
constexpr gpio_num_t LCD_SCK_PIN = GPIO_NUM_12; // 时钟引脚
// LCD配置参数
constexpr int LCD_SPI_HOST = SPI2_HOST; // 使用SPI2
constexpr int LCD_SPI_FREQ = 80; // SPI频率80MHz
constexpr bool LCD_COLOR_ORDER_BGR = true; // 颜色顺序BGR仓库中已经包含了完整的连接代码实现,详情可查看README.md
4.3 编译和上传
使用SZ_ESP32_IDF_PUBLIC仓库的步骤:
- 克隆仓库:git clone https://gitee.com/SiliZap/SZ_ESP32_IDF_PUBLIC.git
- 打开VSCode并导入该项目
- 修改config.hpp中的配置参数:
- 填写您的产品ID、用户ID
- 配置MQTT服务器信息
- 修改为您自己的WiFi名称和密码
- 按照下图按钮进行点击,编译、下载、监控日志。

五、项目运行效果




按照上述两种方式任选一种,您可以快速实现ESP32设备与SiliZap物联网平台的连接,并具备完整的智能家居控制功能,大大简化开发流程,让您专注于创意实现。