云计算百科
云计算领域专业知识百科平台

基于普中ESP32的智能家居环境监测系统(附源码思路)

/* 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
报警 有源蜂鸣器
其他 杜邦线、面包板

整套成本可以控制在较低范围,适合学生项目。


三、接线说明(联网版)

模块引脚ESP32引脚
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服务器

 

赞(0)
未经允许不得转载:网硕互联帮助中心 » 基于普中ESP32的智能家居环境监测系统(附源码思路)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!