老猿
老王头物联网实践记录
居家自动化 · 传感器折腾 · 嵌入式小实验
单片机

单片机

ESP32、树莓派、小智,从"这块板子是干嘛的"开始,一步步搞清楚。

🧩
ESP32 是什么
内置WiFi蓝牙的开发板,居家自动化的核心零件

直观理解

把 ESP32 想象成一台极度缩小的电脑——有 CPU、有内存、能运行程序,还自带 WiFi 和蓝牙天线。普通电脑用来上网看视频,ESP32 用来控制传感器、读取数据、控制继电器开关家电。

类比:ESP32 就像一个能联网的小大脑,你写程序告诉它"温度超过30度就打开风扇",它就会一直盯着温度传感器,条件满足了自动执行。

基本参数

处理器
双核 240MHz,处理传感器数据和网络通信绰绰有余
内置无线
WiFi 2.4GHz + 蓝牙 4.2,不需要额外模块就能联网
GPIO 引脚
30+ 个引脚,可接传感器、继电器、显示屏等各种外设
供电
3.3V 工作电压,USB 供电或外接电池都可以

怎么买

某宝搜"ESP32开发板",选带 USB-C 接口的版本,价格 20-40 元。推荐买 ESP32-S3ESP32-WROOM-32,这两款资料最多,遇到问题容易搜到解决方案。买两块,一块用一块备用。

开发环境搭建

1
安装 Arduino IDE
去 arduino.cc 下载,免费,支持 Mac/Windows/Linux
2
添加 ESP32 支持包
打开 Arduino IDE → 首选项 → 附加开发板管理器,填入 ESP32 的 URL,然后在开发板管理器里搜索安装 esp32 by Espressif
3
连接开发板
用 USB 线连接 ESP32,Mac 一般自动识别,Windows 需要安装 CH340 驱动(某宝买板子一般附带下载链接)
4
上传第一个程序
File → Examples → Basics → Blink,点上传按钮,板子上 LED 开始闪烁说明环境搭好了
🍓
树莓派是什么
能跑完整 Linux 的小电脑,适合做家庭服务器

和 ESP32 的区别

ESP32
微控制器,直接运行你写的程序,实时性好,功耗低,适合长期运行传感器任务。没有操作系统,程序简单直接。
树莓派
单板电脑,运行完整的 Linux 系统,能装各种软件,适合做服务器、运行 Home Assistant、处理复杂逻辑。功耗比 ESP32 高。
我的用法:ESP32 负责采集传感器数据,树莓派跑 Home Assistant 接收数据、处理自动化逻辑、推送消息到手机。

树莓派型号选择

  • 树莓派 4B(4GB):主流选择,跑 Home Assistant 很流畅,价格约 500-600 元
  • 树莓派 5:性能更强,价格更高,4B 足够用就不必升级
  • 树莓派 Zero 2W:体积很小,价格便宜(约 150 元),适合轻量任务

初始设置

1
下载系统镜像
去 raspberrypi.com 下载 Raspberry Pi Imager,选 Raspberry Pi OS Lite(没有桌面,省资源)
2
烧录到 SD 卡
用 Raspberry Pi Imager 写入 SD 卡,写入前在软件里配置好 WiFi 和 SSH,这样插上树莓派就能直接远程连接,不需要接显示器
3
SSH 连接
树莓派通电后,用 Mac/Windows 的终端输入 ssh pi@raspberrypi.local 连接,初始密码是你设置的那个
4
更新系统
连上后先运行 sudo apt update && sudo apt upgrade,把系统更新到最新
🎙️
自己组装小智
ESP32 语音助手,用来控制家里家电,完整步骤

小智是什么

小智(xiaozhi-esp32)是一个开源项目,基于 ESP32 实现语音唤醒、语音识别、联网对话和设备控制。说一声"小智小智",它响应后你可以说"打开客厅灯"之类的指令。照着官方文档一步步来,能做出来。

注意:小智需要联网调用 AI 接口,国内需要准备对应的 API Key,组装前先确认这一步能跑通。

需要的材料

ESP32-S3 开发板(带PSRAM)
推荐带 8MB PSRAM 的版本,内存更充裕,运行更稳定。某宝约 30-50 元,搜"ESP32-S3 N16R8"。
INMP441 麦克风模块
I2S 数字麦克风,收音效果好,比模拟麦克风稳定很多。某宝约 5-10 元。
MAX98357A 功放 + 扬声器
I2S 数字功放,配一个 3W 左右的小扬声器。某宝功放约 5 元,扬声器约 5-10 元。
杜邦线和面包板
用于连接各模块,先在面包板上测试,确认没问题再焊到洞洞板上固定。

接线方式

麦克风 INMP441 接线

INMP441 引脚
VDD → 3.3V
GND → GND
SCK → GPIO 14
WS → GPIO 15
SD → GPIO 32
L/R → GND(选左声道)
功放 MAX98357A 引脚
VIN → 5V
GND → GND
BCLK → GPIO 27
LRC → GPIO 26
DIN → GPIO 25
扬声器接 + 和 - 输出端
GPIO 引脚号可以根据你买的具体开发板调整,只要在 config 文件里改对应就行。不同批次的 ESP32-S3 开发板引脚定义可能不同,先查你买的那块的引脚图。

完整组装步骤

1
克隆项目代码
去 GitHub 搜索 "xiaozhi-esp32",点 Code → Download ZIP 下载,或者用 git clone。项目有中文 README,仔细读一遍再动手。
2
安装 PlatformIO
小智项目用 PlatformIO 而不是 Arduino IDE。在 VS Code 里安装 PlatformIO 插件,安装后重启 VS Code。
3
修改配置文件
复制 config.example.json 为 config.json,填入:WiFi 名称和密码、你的 API Key(根据项目文档选择对应的 AI 服务商)、引脚定义(如果和默认不同)。
4
按接线图连接硬件
先用杜邦线在面包板上连接麦克风和功放,不要急着上电,连完后对着接线图仔细检查一遍,特别是 VCC/GND 不能接反。
5
编译上传固件
用 USB 连接 ESP32-S3,在 PlatformIO 里选对应的开发板型号,点 Upload 按钮,等待编译上传(第一次比较慢,要几分钟)。
6
打开串口监视器看日志
上传完成后打开串口监视器(波特率115200),观察启动日志。应该能看到 WiFi 连接成功、服务连接成功的提示。
7
测试唤醒词
说"小智小智",如果扬声器有回应说明组装成功。如果没反应,先检查串口日志里有没有报错,再逐步排查麦克风接线和 API 连接。

常见问题

  • 上电没声音:检查扬声器和功放接线,用万用表量一下功放输出端有没有电压变化
  • 麦克风没反应:检查 SCK/WS/SD 接线,L/R 引脚要接 GND(选左声道)
  • 连不上 AI 服务:先确认 WiFi 连接正常,再检查 API Key 是否填写正确,部分服务国内需要特殊网络环境
  • 唤醒词不灵敏:麦克风位置很重要,靠近说话方向,远离扬声器(扬声器的声音会干扰麦克风)
🌡️
接传感器读数据
以 DHT22 温湿度传感器为例,完整走一遍

DHT22 接线

VCC → 3.3V
传感器供电,接 ESP32 的 3.3V 引脚
GND → GND
接地,接 ESP32 的 GND 引脚
DATA → GPIO4
数据线,接任意 GPIO,这里用 GPIO4
上拉电阻
DATA 和 VCC 之间接一个 10kΩ 电阻,不接有时读数不稳

读取代码

1
安装 DHT 库
Arduino IDE → 工具 → 管理库 → 搜索"DHT sensor library" → 安装 Adafruit 版本,同时安装它依赖的 Adafruit Unified Sensor
2
写代码上传
复制下面的代码,粘贴到 Arduino IDE,选好开发板和端口,点上传
3
打开串口监视器
工具 → 串口监视器,波特率设 115200,每隔2秒应该能看到温度和湿度数值
#include "DHT.h" #define DHTPIN 4 // 数据线接的 GPIO 编号 #define DHTTYPE DHT22 // 传感器型号 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); dht.begin(); Serial.println("DHT22 初始化完成"); } void loop() { delay(2000); // DHT22 读取间隔至少2秒 float h = dht.readHumidity(); // 读取湿度 float t = dht.readTemperature(); // 读取温度(摄氏度) // 检查读取是否失败 if (isnan(h) || isnan(t)) { Serial.println("读取失败,检查接线!"); return; } Serial.print("温度: "); Serial.print(t); Serial.print(" °C 湿度: "); Serial.print(h); Serial.println(" %"); }
踩坑:如果读数一直显示 nan,先检查接线,再检查是否漏接上拉电阻。我有次读数一直往上飘,最后发现是模块上一个小电容虚焊,用热风枪补焊后恢复正常。
📡
接入家里 WiFi
让 ESP32 连上网络,才能发数据、收指令

基础连接代码

#include <WiFi.h> const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); Serial.print("连接WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi 连接成功!"); Serial.print("IP 地址: "); Serial.println(WiFi.localIP()); } void loop() { // 你的业务逻辑 }
注意:ESP32 只支持 2.4GHz WiFi,不支持 5GHz。如果你的路由器开了双频合并,ESP32 可能连不上,需要把 2.4GHz 单独设一个网络名称。

断线自动重连

WiFi 连接不稳定是常见问题,需要在 loop() 里加重连检测:

void loop() { // 检测 WiFi 是否断开,断开就重连 if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi 断开,重新连接..."); WiFi.disconnect(); WiFi.begin(ssid, password); int retry = 0; while (WiFi.status() != WL_CONNECTED && retry < 20) { delay(500); retry++; } if (WiFi.status() == WL_CONNECTED) { Serial.println("重连成功!"); } } // 正常业务逻辑... delay(1000); }