一、入门的差不多所有模块接线图

二、目前计划
这是目前ESP-IDF 入门技术开发内容涵盖的所有模块:传感器、显示屏、GPIO 输入输出元器件,以及 ADC 游戏摇杆模块,还有无线WiFi、MQTT等(MQTT看情况,MQTT就是个中转站)
当前的ESP-IDF的入门技术内容规划如下:
入门技术内容 我们将这些模块拆分开,逐个讲明白其原理和代码实现。
进阶,作为入门的集成款,会有FreeRTOS中比较熟知的task、queue,再加上mutex、event group、semaphoe,以及状态机等。我的手机UI菜单就是状态机。有部分游戏是无限状态机。 (a) 功能集成:加入 LVGL 等技术,将各个模块组合成一个完整的原型。 (b) 硬件开发:使用 EDA 画原理图并制作 PCB,再通过 SMT 焊接成 PCBA。 (c) 外壳设计: 使用 SolidWorks 进行建模。大家看到我手里的数显卡尺了吗?可以用它测量 PCBA 板子的尺寸及空间结构,然后在软件里按照这个结构把外壳做出来。 (d) 成果产出:利用 3D 打印技术把外壳打印出来,这样就形成了一个完整的成品。
关于消费级产品的说明: 目前这种方式还不属于消费级产品。消费级产品需要注塑开模,通常单套外壳的开模费就需要几万甚至几十万元。所以我们当前阶段只需要 3D 打印即可。
现在的 3D 打印主要有两种技术:
- FDM(熔融沉积建模)
- 光固化
- 当然,金属打印不在此讨论范围,国内的JLC也有金属打印。
三、I2C 总线Aotumatically扫描设备地址
3.1 AHT30与BMP280接线图

3.2 I2C扫描代码
C
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/i2c_master.h"
#include "esp_log.h"
// 你当前使用的引脚
#define I2C_SCL_PIN GPIO_NUM_5
#define I2C_SDA_PIN GPIO_NUM_6
#define I2C_PORT I2C_NUM_0
static const char *TAG = "I2C_SCAN";
// 扫描所有I2C设备(完整遍历,不中断,找到所有设备)
void i2c_scan_devices(void) {
i2c_master_bus_config_t bus_cfg = {
.i2c_port = I2C_PORT,
.sda_io_num = I2C_SDA_PIN,
.scl_io_num = I2C_SCL_PIN,
.clk_source = I2C_CLK_SRC_DEFAULT,
.glitch_ignore_cnt = 7,
.flags.enable_internal_pullup = true,
};
i2c_master_bus_handle_t bus_handle;
esp_err_t err = i2c_new_master_bus(&bus_cfg, &bus_handle);
if (err != ESP_OK) {
ESP_LOGE(TAG, "I2C总线初始化失败: %s", esp_err_to_name(err));
return;
}
ESP_LOGI(TAG, "========== 开始扫描所有I2C设备 ==========");
// 遍历 0x03 ~ 0x77 所有I2C地址,一个都不漏
for (uint8_t addr = 0x03; addr < 0x78; addr++) {
// 探测当前地址,超时500ms(适配多传感器)
if (i2c_master_probe(bus_handle, addr, pdMS_TO_TICKS(500)) == ESP_OK) {
// 找到设备就打印,不跳出循环,继续扫描下一个地址
ESP_LOGI(TAG, "✅ 找到I2C设备: 0x%02X", addr);
}
}
ESP_LOGI(TAG, "========== I2C扫描全部完成 ==========");
}
void app_main(void) {
i2c_scan_devices();
}