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

设备联网

设备之间怎么说话,数据怎么传,家里那套自动化系统怎么连起来。

📨
MQTT · 设备间发消息
家里最常用的协议,轻量稳定

MQTT 是什么

MQTT 是一种专门为物联网设计的消息协议。核心思路是"发布/订阅"——传感器把数据"发布"到一个话题,手机或者服务器"订阅"这个话题,有新数据就自动收到。中间有个 Broker(消息中转站)负责转发。

类比:MQTT 就像一个群,传感器往群里发消息,手机和服务器都在群里,自动收到。Broker 就是群服务器。

在树莓派上搭 MQTT Broker

1
安装 Mosquitto
SSH 连接树莓派,运行:
sudo apt install mosquitto mosquitto-clients -y
2
设置开机自启
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
3
配置允许匿名连接(测试用)
编辑 /etc/mosquitto/mosquitto.conf,加入:
listener 1883
allow_anonymous true
改完重启:sudo systemctl restart mosquitto
4
测试是否正常
在树莓派上订阅一个话题:mosquitto_sub -t test/topic
再开一个窗口发消息:mosquitto_pub -t test/topic -m "hello"
第一个窗口收到 hello 说明 Broker 正常。

ESP32 连接 MQTT 发数据

#include <WiFi.h> #include <PubSubClient.h> const char* ssid = "你的WiFi"; const char* password = "你的密码"; const char* mqttServer = "192.168.1.100"; // 树莓派IP const int mqttPort = 1883; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); Serial.println("WiFi 已连接"); client.setServer(mqttServer, mqttPort); } void reconnect() { while (!client.connected()) { Serial.print("连接 MQTT..."); if (client.connect("ESP32Client")) { Serial.println("成功"); } else { Serial.print("失败,5秒后重试"); delay(5000); } } } void loop() { if (!client.connected()) reconnect(); client.loop(); // 每10秒发一次温度数据 static unsigned long lastMsg = 0; if (millis() - lastMsg > 10000) { lastMsg = millis(); String payload = "25.3"; // 实际用传感器读取 client.publish("home/sensor/temperature", payload.c_str()); Serial.println("已发送: " + payload); } }
PubSubClient 库在 Arduino 库管理器里搜索安装,作者是 Nick O'Leary。
🌐
HTTP · 最常见的那个
ESP32 发请求、拿数据、当小服务器

两种用法

ESP32 作为客户端
向别的服务器发请求,比如拿天气数据、推送消息到手机、调用 AI 接口。最常用。
ESP32 作为服务器
在 ESP32 上跑一个小 Web 服务,手机浏览器访问它的 IP,就能控制继电器开关。

发送 GET 请求

#include <WiFi.h> #include <HTTPClient.h> void loop() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin("http://api.example.com/data"); int httpCode = http.GET(); if (httpCode == 200) { String body = http.getString(); Serial.println(body); } else { Serial.print("请求失败,错误码: "); Serial.println(httpCode); } http.end(); } delay(30000); // 每30秒请求一次 }

ESP32 当小服务器

#include <WiFi.h> #include <WebServer.h> WebServer server(80); void handleRoot() { server.send(200, "text/html", "<h1>ESP32 控制台</h1>" "<a href='/on'>开灯</a> " "<a href='/off'>关灯</a>"); } void handleOn() { digitalWrite(2, HIGH); server.send(200, "text/plain", "已开灯"); } void setup() { pinMode(2, OUTPUT); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); server.on("/", handleRoot); server.on("/on", handleOn); server.begin(); Serial.println(WiFi.localIP()); // 打印IP,浏览器访问这个地址 } void loop() { server.handleClient(); }
🔗
I²C · 板子和传感器之间
两根线接多个传感器,最实用的短距通信

I²C 是什么

I²C 是开发板和传感器模块之间的通信协议,只需要两根线(SCL 时钟线、SDA 数据线),就能同时接多个传感器,每个传感器有自己的地址,互不干扰。

ESP32 默认 I²C 引脚
SDA → GPIO 21
SCL → GPIO 22
(可以在代码里改为其他引脚)
常见 I²C 传感器
BMP280(气压温度)
OLED 显示屏(0.96寸)
MPU6050(陀螺仪)
AHT20(温湿度)

扫描 I²C 设备地址

接上传感器后,先跑这个扫描程序,确认能找到传感器,同时知道它的地址:

#include <Wire.h> void setup() { Wire.begin(); Serial.begin(115200); Serial.println("扫描 I2C 设备..."); for (byte addr = 1; addr < 127; addr++) { Wire.beginTransmission(addr); byte error = Wire.endTransmission(); if (error == 0) { Serial.print("找到设备,地址: 0x"); if (addr < 16) Serial.print("0"); Serial.println(addr, HEX); } } } void loop() {}
如果扫描不到设备,先检查 SDA/SCL 接线,再检查传感器供电是否正常。有些模块需要外接上拉电阻(4.7kΩ 到 VCC)。
🏠
Home Assistant · 家庭自动化平台
把所有设备统一管理,设置自动化规则

Home Assistant 是什么

Home Assistant(简称 HA)是一个开源的家庭自动化平台,跑在树莓派上。把家里所有智能设备——小米的灯、ESP32 的传感器、智能插座——全部接进来,用一个界面统一控制,设置自动化规则不用写代码。

举个例子:温度超过 28 度自动开空调,同时推送消息到手机。这个逻辑在 HA 里点几下就配置好了。

安装到树莓派

1
下载 Home Assistant OS 镜像
去 home-assistant.io 下载对应树莓派型号的镜像,选 Home Assistant OS 版本(不是 Supervised)
2
烧录到 SD 卡
用 Raspberry Pi Imager 选"Use custom",选刚下载的镜像写入 SD 卡
3
插卡启动
SD 卡插入树莓派,接上网线和电源,等待约 5-10 分钟启动完成
4
浏览器访问
同一局域网的电脑打开浏览器,输入 homeassistant.local:8123,完成初始化账号设置
5
安装 MQTT 插件
HA 后台 → 设置 → 加载项 → 搜索 Mosquitto broker → 安装启动。这样 ESP32 就能直接往 HA 发 MQTT 数据。

ESP32 数据接入 HA

安装好 MQTT 插件后,在 HA 的 configuration.yaml 里添加传感器配置:

# configuration.yaml mqtt: sensor: - name: "客厅温度" state_topic: "home/sensor/temperature" unit_of_measurement: "°C" device_class: temperature - name: "客厅湿度" state_topic: "home/sensor/humidity" unit_of_measurement: "%" device_class: humidity

保存后重启 HA,ESP32 发过来的数据就会出现在 HA 的传感器列表里,可以在仪表盘上显示、设置自动化规则。