/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
前言
最近做了一套基于 普中ESP32 的智能家居环境监测系统,功能完整,成本较低,适合作为 物联网/电子/计算机专业的学习项目,也可以作为嵌入式入门的实战练习。
整套系统分为两种实现方式:
-
本地版:OLED 本地显示 + 蜂鸣器报警,不联网,简单可靠。
-
联网版:在本地版基础上增加 WiFi + 自建 Go Web 服务器 + 手机浏览器远程查看,不依赖第三方物联网平台,数据自主可控。
本文主要分享系统设计、硬件接线、核心代码和踩坑记录。
一、功能概览
| DS18B20 温度采集 | ✅ | ✅ |
| DHT11 湿度采集 | ✅ | ✅ |
| MQ-1 烟雾浓度采集 | ✅ | ✅ |
| 光敏传感器光照采集 | ✅ | ✅ |
| OLED 0.96寸本地显示 | ✅ | ✅ |
| 有源蜂鸣器超限报警 | ✅ | ✅ |
| WiFi 联网 | ❌ | ✅ |
| HTTP 上传数据 | ❌ | ✅ |
| 自建 Go Web 服务器 | ❌ | ✅ |
| 手机浏览器远程查看 | ❌ | ✅ |
| 历史数据曲线 | ❌ | ✅ |
| 数据持久化 | ❌ | ✅ |
联网版的特点是:自己用 Go 写一个轻量 Web 服务器,ESP32 通过 HTTP POST 上传数据,手机连同一个 WiFi 就能在浏览器里看实时数据、历史曲线和报警状态。
二、硬件清单
| 主控 | 普中ESP32开发板 |
| 温度 | DS18B20 |
| 湿度 | DHT11 |
| 烟雾 | MQ-1 烟雾传感器模块 |
| 光照 | 光敏传感器模块 |
| 显示 | OLED 0.96寸 I2C |
| 报警 | 有源蜂鸣器 |
| 其他 | 杜邦线、面包板 |
整套成本可以控制在较低范围,适合学生项目。
三、接线说明(联网版)
| DS18B20 | DATA | GPIO4(需4.7K上拉到3.3V) |
| DHT11 | DATA | GPIO27(需4.7K上拉到3.3V) |
| MQ-1 | AO | GPIO35(ADC1,WiFi下必须用ADC1) |
| 光敏传感器 | AO | GPIO34(ADC1) |
| OLED | SDA | GPIO23 |
| OLED | SCL | GPIO18 |
| 蜂鸣器 | 信号 | GPIO25 |
⚠️ 注意:GPIO13 属于 ADC2,WiFi 工作时会被占用,所以联网版的 MQ-1 必须接 ADC1 引脚(如 GPIO35)。
四、开发环境
-
Arduino IDE:2.3.10
-
开发板支持包:espressif arduino-esp32
-
开发板选择:ESP32 Dev Module
-
上传速度:921600
-
Flash Mode:DIO
-
Flash Size:4MB
-
所需库:
-
OneWire
-
DallasTemperature
-
DHT sensor library
-
Adafruit Unified Sensor
-
Adafruit SSD1306
-
Adafruit GFX
-
HTTPClient
-
ArduinoJson
-
-
Go 环境:Go 1.26.8 windows/amd64(联网版需要)
五、核心代码片段
1. ESP32 读取传感器并上传(联网版)
cpp
#include <WiFi.h>
#include <HTTPClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define DS18B20_PIN 4
#define DHT_PIN 27
#define MQ1_PIN 35
#define LIGHT_PIN 34
#define BUZZER_PIN 25
const char* ssid = "你的WiFi";
const char* password = "你的密码";
const char* serverUrl = "http://192.168.1.100:8080/api/upload";
// … 传感器对象初始化 …
void uploadData(float temp, float humi, int smoke, int light, bool alarm) {
if (WiFi.status() != WL_CONNECTED) return;
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
String json = "{\\"temperature\\":" + String(temp, 1) +
",\\"humidity\\":" + String(humi, 1) +
",\\"smoke\\":" + String(smoke) +
",\\"light\\":" + String(light) +
",\\"alarm\\":" + String(alarm ? "true" : "false") + "}";
int code = http.POST(json);
http.end();
}
2. Go Web 服务器(简化版)
go
package main
import (
"encoding/json"
"net/http"
"sync"
"time"
)
type SensorData struct {
Temperature float64 `json:"temperature"`
Humidity float64 `json:"humidity"`
Smoke int `json:"smoke"`
Light int `json:"light"`
Alarm bool `json:"alarm"`
Timestamp int64 `json:"timestamp"`
}
var (
mu sync.RWMutex
latest SensorData
history []SensorData
)
func uploadHandler(w http.ResponseWriter, r *http.Request) {
var d SensorData
json.NewDecoder(r.Body).Decode(&d)
d.Timestamp = time.Now().Unix()
mu.Lock()
latest = d
history = append(history, d)
if len(history) > 2880 {
history = history[len(history)-2880:]
}
mu.Unlock()
w.Write([]byte(`{"status":"ok"}`))
}
func main() {
http.HandleFunc("/api/upload", uploadHandler)
http.HandleFunc("/api/latest", func(w http.ResponseWriter, r *http.Request) {
mu.RLock()
json.NewEncoder(w).Encode(latest)
mu.RUnlock()
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.Write([]byte(htmlPage)) // 内嵌HTML,含Chart.js曲线
})
http.ListenAndServe(":8080", nil)
}
六、踩坑记录
1. ADC2 与 WiFi 冲突
一开始把 MQ-1 接在 GPIO13,不联网时读数正常,一开 WiFi 就一直是 4095。后来查资料才知道 GPIO13 属于 ADC2,WiFi 工作时会被占用,必须改用 ADC1 引脚(GPIO32-39)。
2. 光敏模块读数一直是 4095
同样是因为接在了 ADC2 引脚上。改到 GPIO34 后恢复正常。
3. DS18B20 读不出数据
DS18B20 的 DATA 引脚必须接 4.7K 上拉电阻到 3.3V,否则读数为 -127。很多模块自带这个电阻,裸传感器需要自己加。
4. MQ-1 预热
MQ-1 首次上电需要 预热约 20 秒,读数才稳定。代码里加了预热等待和串口提示。
5. OLED 的 I2C 引脚
普中这块板子的 OLED 用的是 SDA=GPIO23,SCL=GPIO18,不是 ESP32 默认的 21/22。代码里必须写 Wire.begin(23, 18)。
七、效果展示
实物接线图

OLED 本地显示

手机浏览器远程查看(高级版)

历史数据曲线

八、总结
这套基于普中ESP32的智能家居环境监测系统,成本低、功能全、可演示、能写开题、能过答辩。基础版适合入门,高级版适合冲优秀毕设。如果你也在做物联网相关的毕设或课设,希望这篇文章能给你一些参考。
如果觉得有帮助,欢迎 点赞、收藏、评论,你的支持是我持续分享的动力!
标签:ESP32 智能家居 毕业设计 物联网 Arduino Go Web服务器
网硕互联帮助中心





评论前必须登录!
注册