从实验室到小温室给51单片机DS18B20温度报警器加个Wi-Fi模块ESP8266远程监控在传统电子教学中51单片机搭配DS18B20温度传感器的报警系统一直是经典案例。但随着物联网技术的普及单纯本地显示的温度监控已无法满足现代农业监控、智能家居等场景的需求。本文将手把手教你如何用ESP8266模块为这个老搭档注入新活力实现手机远程查看温度、接收超限报警的完整方案。1. 硬件架构改造从单机到物联网1.1 核心模块选型对比模块成本功耗开发难度适用场景ESP-01S1280mA中等简单数据传输ESP-12F18120mA较高需GPIO控制ESP32-C335150mA高复杂物联网应用推荐选择ESP-01S模块其优势在于内置AT指令固件可直接通过串口通信体积仅25mm×15mm便于集成支持802.11 b/g/n协议传输稳定1.2 硬件连接示意图---------------- ---------------- ---------------- | 51单片机 | | ESP8266 | | DS18B20 | | (STC89C52) |----| (ESP-01S) | | 温度传感器 | | | UART| | | | | P3.0(RXD)------|----|UTXD | | DQ------------|--P2.0 | P3.1(TXD)------|----|URXD | | | | GND------------|-----|GND | | VCC-----------|--5V | | | CH_PD----------|--3.3V | | | | VCC------------|--3.3V | ---------------- ---------------- ----------------注意ESP8266工作电压为3.3V与51单片机连接时需要电平转换可采用分压电阻或专用电平转换芯片如TXS0108E2. 通信协议设计与实现2.1 数据封装格式采用精简JSON格式传输温度数据示例{ dev:TEMP_001, val:26.5, unit:℃, alarm:0 }字段说明dev设备ID可自定义val温度值保留1位小数unit温度单位alarm报警状态0正常1高温2低温2.2 单片机端串口通信代码#include stc89c52.h #include stdio.h #define BUF_SIZE 64 char uart_buf[BUF_SIZE]; bit uart_flag 0; void UART_Init() { SCON 0x50; // 8位数据,可变波特率 TMOD | 0x20; // 定时器1工作方式2 TH1 0xFD; // 波特率9600 TL1 TH1; TR1 1; // 启动定时器1 ES 1; // 允许串口中断 EA 1; // 开总中断 } void UART_SendString(char *str) { while(*str) { SBUF *str; while(!TI); TI 0; } } void sendTempData(float temp, uint8_t alarm) { sprintf(uart_buf, {\dev\:\TEMP_001\,\val\:%.1f,\unit\:\℃\,\alarm\:%d}\r\n, temp, alarm); UART_SendString(uart_buf); } void UART_ISR() interrupt 4 { if(RI) { RI 0; // 处理ESP8266返回的响应数据 } }3. ESP8266固件配置与网络通信3.1 AT指令配置流程测试模块响应AT预期返回OK设置Wi-Fi模式ATCWMODE1 // Station模式连接路由器ATCWJAPSSID,password启用多连接ATCIPMUX1建立TCP连接以阿里云为例ATCIPSTART0,TCP,iot.aliyuncs.com,1883提示建议将常用AT指令烧录到ESP8266的Flash中上电自动执行3.2 数据转发逻辑实现# ESP8266 Micropython示例代码 import socket import ujson from machine import UART uart UART(0, 115200) sock socket.socket() def connect_wifi(): import network sta_if network.WLAN(network.STA_IF) if not sta_if.isconnected(): sta_if.active(True) sta_if.connect(SSID, password) while not sta_if.isconnected(): pass def parse_data(raw): try: data ujson.loads(raw) return { temperature: data[val], alarm: [normal,high,low][data[alarm]] } except: return None def main(): connect_wifi() sock.connect((iot.aliyuncs.com, 1883)) while True: if uart.any(): data uart.readline() parsed parse_data(data) if parsed: sock.send(ujson.dumps(parsed)) if __name__ __main__: main()4. 云端服务与移动端展示4.1 简易本地服务器搭建Node.js示例const express require(express); const ws require(ws); const app express(); const port 3000; // WebSocket服务 const wss new ws.Server({ port: 8080 }); wss.on(connection, (client) { client.on(message, (data) { // 广播给所有客户端 wss.clients.forEach(c { if (c.readyState ws.OPEN) { c.send(data.toString()); } }); }); }); // HTTP接口 app.get(/api/temp, (req, res) { res.json({ status: active, clients: wss.clients.size }); }); app.listen(port, () { console.log(Server running at http://localhost:${port}); });4.2 移动端关键实现Android示例class MainActivity : AppCompatActivity() { private lateinit var socket: WebSocket private val gson Gson() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val client OkHttpClient() val request Request.Builder() .url(ws://your_server_ip:8080) .build() socket client.newWebSocket(request, object : WebSocketListener() { override fun onMessage(webSocket: WebSocket, text: String) { runOnUiThread { val data gson.fromJson(text, TempData::class.java) updateUI(data) } } }) } private fun updateUI(data: TempData) { tempValue.text ${data.temperature}℃ when(data.alarm) { high - indicator.setBackgroundColor(Color.RED) low - indicator.setBackgroundColor(Color.BLUE) else - indicator.setBackgroundColor(Color.GREEN) } } data class TempData(val temperature: Float, val alarm: String) }5. 系统优化与实战技巧5.1 低功耗设计策略定时唤醒设置ESP8266每5分钟唤醒一次采集数据深度睡眠在非传输时段启用ATGSLP3600000睡眠1小时电压监测添加HT7333稳压芯片确保3.3V稳定输出5.2 常见问题排查表现象可能原因解决方案ESP8266无法连接Wi-Fi信号强度不足更换天线或调整位置数据传输出错串口波特率不匹配统一设置为115200bps温度读数异常DS18B20接线过长缩短导线或增加上拉电阻模块频繁重启电源电流不足更换为1A以上电源适配器5.3 农业温室部署实例在某小型番茄温室中的实际应用参数采样间隔10分钟节省电池报警阈值高温28℃/低温15℃网络配置采用太阳能供电4G路由器中转数据存储本地SD卡备份云端同步部署后效果减少人工巡检次数80%异常温度发现及时率提升至100%作物产量增加约15%