当前位置: 首页 > news >正文

基于ESP8266与DS18B20构建本地Wi-Fi温度监测系统

1. 项目概述与核心思路

最近在捣鼓一个智能家居的小玩意儿,想实时监控家里不同位置的温度,比如书房、阳台或者鱼缸。市面上成品要么功能单一,要么价格不低,而且数据往往被锁在厂商的App里。作为一个喜欢动手的开发者,我第一时间就想到了ESP8266这块“万能”的Wi-Fi芯片。它价格便宜,性能足够,最关键的是能自己写代码,完全掌控数据。这个项目的核心目标很简单:用ESP8266搭建一个独立的Web服务器,通过网页直接显示来自多个DS18B20温度传感器的数据,实现一个完全本地化、无需云端、随时可访问的Wi-Fi温度计。

整个方案的设计思路围绕着“自主可控”和“灵活部署”展开。ESP8266在这里扮演了双重角色:它既是一个连接传感器、采集数据的终端设备,又是一个能处理HTTP请求、生成并发送HTML页面的微型服务器。这意味着你不需要依赖任何第三方云平台或复杂的中间件,打开浏览器,输入ESP的IP地址,就能看到实时温度。为了适应不同的网络环境,我设计了两种网络模式:一种是让ESP8266像手机、电脑一样,连接到家里现有的Wi-Fi路由器(STA模式);另一种是让它自己创建一个Wi-Fi热点(AP模式),你的设备直接连接这个热点来访问数据。后者特别适合临时部署、没有现成网络,或者你希望将温度监测网络与家庭主网络物理隔离的场景。

2. 硬件选型与电路设计解析

2.1 核心控制器:NodeMCU ESP8266开发板

选择NodeMCU v3(Lolin版)作为开发平台,主要是看中了它的开箱即用和生态成熟。这块板子集成了ESP-12E模组、USB转串口芯片(通常是CH340或CP2102)以及稳压电路,你只需要一根Micro-USB线就能完成供电和程序烧录,省去了额外准备USB转TTL模块的麻烦。ESP8266本身支持802.11 b/g/n Wi-Fi协议,内置了Tensilica L106 32位微处理器,运行频率可达160MHz,内存虽然不大(通常约80KB用户可用RAM),但运行一个轻量级的Web服务器并处理几个传感器的数据绰绰有余。

注意:市面上NodeMCU版本较多,引脚排列可能略有差异。建议在编程前,先核对你所使用的开发板的引脚定义图(通常称为“Pinout Diagram”),特别是用于连接传感器的GPIO引脚编号。直接使用Arduino IDE中定义的D系列引脚(如D1,D2)通常是最稳妥的,它们对应着ESP8266芯片内部的GPIO编号。

2.2 温度传感器:DS18B20及其优势

DS18B20数字温度传感器是这个项目的“感官器官”。我选择它,而非更常见的模拟传感器(如LM35)或I2C接口的数字传感器(如BMP280),主要基于以下几个考量:

  1. 单总线(OneWire)协议:这是DS18B20最大的亮点。所有传感器只需要共用一根数据线(加上电源和地线,共三线),即可完成通信。这意味着布线极其简单,特别是在需要多点测温、布线距离较长或穿墙过孔的场合,能大幅减少线缆数量,降低施工复杂度和成本。
  2. 高精度与宽量程:DS18B20的测温精度在±0.5°C以内,分辨率为9~12位可调,测温范围从-55°C到+125°C,足以应对从冰箱冷库到热水箱的绝大多数家用甚至部分工业场景。
  3. 唯一64位ROM地址:每个DS18B20在出厂时都烧录了一个全球唯一的64位序列号。这意味着当多个传感器挂载在同一根OneWire总线上时,主机可以通过这个地址精确地识别和访问每一个传感器,实现真正的“一总线,多设备”管理,理论上单总线可挂载超过100个传感器。
  4. 两种供电模式:它支持标准外部供电(3.0V-5.5V)和“寄生供电”模式。在寄生供电模式下,数据线(DQ)在空闲时被上拉电阻拉到高电平,可以为传感器内部电容充电,从而在发起温度转换时短暂“偷电”完成操作。这进一步简化了布线,只需两根线(数据线和地线)。但要注意,寄生模式对时序和上拉电阻要求更严格,长距离或总线负载多时可能不稳定,因此对于新手或可靠性要求高的场景,强烈推荐使用标准的三线制接法

2.3 电路连接详解与注意事项

一个可靠、抗干扰的硬件连接是项目稳定的基石。以下是基于标准三线制接法的详细连接指南和原理说明。

所需材料清单:

  • NodeMCU ESP8266 开发板 x1
  • DS18B20 温度传感器 x N(根据你的需要)
  • 4.7kΩ 电阻 x1(精度±5%即可)
  • 面包板及杜邦线若干(用于原型搭建)
  • Micro-USB 数据线(供电兼编程)

电路连接步骤:

  1. 建立公共地线:将所有DS18B20的GND引脚、NodeMCU的GND引脚,在面包板上用导线连接在一起。确保共地是电路正常工作的第一步。
  2. 连接电源线:将所有DS18B20的VDD引脚连接到NodeMCU的3.3VVin引脚。这里有一个重要选择
    • 3.3V:这是最安全、最推荐的方式。ESP8266的GPIO逻辑电平就是3.3V,传感器也兼容3.3V供电,整个系统电平一致,通信最稳定。
    • Vin(约5V):如果USB供电,Vin引脚电压接近5V。DS18B20工作电压范围是3.0V-5.5V,所以接5V也能工作。但需要注意,传感器的数据线输出高电平将是接近5V的,而ESP8266的GPIO可承受的最大电压是3.6V,长期接入5V信号有损坏风险!因此,如果传感器接5V,数据线(DQ)上必须串联一个100-500Ω的电阻进行分压限流,或者使用电平转换模块。对于新手,一律建议使用3.3V供电,省去麻烦。
  3. 连接数据总线:将所有DS18B20的DQ(数据)引脚连接在一起,然后通过一个4.7kΩ的上拉电阻,连接到NodeMCU的某个GPIO引脚(例如我常用的D4,对应内部GPIO2)。同时,这个连接点再直接连到NodeMCU的同一个GPIO引脚。
  4. 上拉电阻的作用:OneWire协议是开源集电极结构,需要上拉电阻将数据线在空闲时保持在高电平状态(逻辑1)。4.7kΩ是经过验证的典型值,能提供足够的驱动能力,同时又不至于在总线电容较大时影响上升沿速度。这个电阻必不可少,忘记它会导致通信完全失败。

最终连接示意图(以两个传感器为例,接3.3V):

NodeMCU 3.3V ---> DS18B20-1 (VDD) DS18B20-2 (VDD) NodeMCU GND ---> DS18B20-1 (GND) DS18B20-2 (GND) | (公共地) NodeMCU GPIO (D4) ---> 4.7kΩ resistor ---> 3.3V | ---> DS18B20-1 (DQ) ---> DS18B20-2 (DQ)

实操心得:焊接或使用杜邦线连接时,确保接触牢固。松动的连接是OneWire通信时好时坏最常见的原因。对于需要长期运行的部署,建议将传感器、上拉电阻和导线焊接在一块小万用板或定制PCB上,并用热缩管或绝缘胶带处理好裸露的焊点,以提高可靠性。

3. 软件架构与代码实现深度剖析

项目的软件部分主要依托Arduino核心库和几个优秀的第三方库,将ESP8266变成一个功能完整的Web服务器。代码结构清晰,分为网络初始化、传感器数据采集、Web服务器处理三大部分。

3.1 库依赖与开发环境搭建

首先,确保你的Arduino IDE已配置好ESP8266开发环境。如果尚未配置,需在“文件”->“首选项”的“附加开发板管理器网址”中添加:http://arduino.esp8266.com/stable/package_esp8266com_index.json,然后在“工具”->“开发板”->“开发板管理器”中搜索安装“esp8266”。

本项目需要用到以下库,可通过“项目”->“加载库”->“管理库”进行搜索安装:

  1. ESP8266WiFi:ESP8266核心网络库,用于管理STA和AP模式。
  2. ESP8266WebServer:核心中的核心,它允许我们在ESP8266上创建一个HTTP服务器,监听特定端口(如80),并定义不同URL路径对应的处理函数。
  3. DallasTemperature:这是一个高级封装库,它依赖于OneWire库。它极大地简化了与DS18B20系列传感器的交互,提供了诸如按地址寻址、批量读取温度、设置分辨率等友好接口。安装DallasTemperature时,Arduino IDE通常会自动安装其依赖的OneWire库。

3.2 核心代码模块详解

下面我将分模块拆解代码,并解释每一部分的设计意图和关键参数。

3.2.1 网络模式选择与配置

在代码开头,我们通过一个宏定义来选择工作模式,这比运行时动态配置更简单清晰。

// ====== 配置区:选择工作模式 ====== #define OPERATION_MODE 1 // 1: STA模式 (连接现有Wi-Fi), 2: AP模式 (自建热点)

STA模式配置:在此模式下,ESP8266作为客户端接入你家的无线路由器。

#if OPERATION_MODE == 1 const char* ssid = "Your_WiFi_SSID"; // 你的Wi-Fi名称 const char* password = "Your_WiFi_Pass"; // 你的Wi-Fi密码 // IPAddress local_IP(192, 168, 1, 100); // 可选:设置静态IP // IPAddress gateway(192, 168, 1, 1); // IPAddress subnet(255, 255, 255, 0); #endif

你需要将Your_WiFi_SSIDYour_WiFi_Pass替换成你自家的信息。设置静态IP(注释部分)是可选的,好处是ESP8266每次获取的IP地址固定,方便你记忆和访问。如果不设置,路由器DHCP服务器会动态分配一个IP,你需要在路由器管理界面或通过串口监视器查看分配的IP。

AP模式配置:在此模式下,ESP8266自己变成一个热点。

#if OPERATION_MODE == 2 const char* ap_ssid = "ESP8266_Thermometer"; // 热点的名称 const char* ap_password = "12345678"; // 热点的密码,至少8位 #endif

ap_password必须至少8个字符。如果设置为NULL,则创建开放网络(不推荐,不安全)。在AP模式下,ESP8266会自动运行一个DHCP服务器,为连接的设备(如你的手机)分配IP(通常是192.168.4.x网段),它自己的IP固定为192.168.4.1,这就是网关地址,也是我们访问网页的地址。

网络初始化函数

void setupWiFi() { #if OPERATION_MODE == 1 WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); // WiFi.config(local_IP, gateway, subnet); // 如果使用静态IP则取消注释 Serial.print("Connecting to WiFi "); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected! IP address: "); Serial.println(WiFi.localIP()); #elif OPERATION_MODE == 2 WiFi.mode(WIFI_AP); WiFi.softAP(ap_ssid, ap_password); Serial.print("AP Mode Started. SSID: "); Serial.println(ap_ssid); Serial.print("AP IP address: "); Serial.println(WiFi.softAPIP()); #endif }

这段代码根据OPERATION_MODE的值初始化不同的网络模式,并通过串口打印出关键的IP地址信息,这是后续用浏览器访问的凭证。

3.2.2 DS18B20传感器初始化与数据读取

#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS D4 // 定义OneWire数据线连接的GPIO OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress insideThermometer, outsideThermometer; // 用于存储传感器地址 void setupSensors() { sensors.begin(); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" DS18B20 devices."); // 假设我们只连接了两个传感器,并手动获取它们的地址 // 在实际项目中,更推荐使用动态发现和存储地址的方法 if (!sensors.getAddress(insideThermometer, 0)) { Serial.println("Unable to find address for Device 0 (Inside)"); } if (!sensors.getAddress(outsideThermometer, 1)) { Serial.println("Unable to find address for Device 1 (Outside)"); } // 设置传感器分辨率(9-12位),12位精度最高,但转换时间最长(750ms) sensors.setResolution(insideThermometer, 12); sensors.setResolution(outsideThermometer, 12); } float readTemperature(DeviceAddress deviceAddress) { sensors.requestTemperaturesByAddress(deviceAddress); // 向特定地址的传感器请求温度 float tempC = sensors.getTempC(deviceAddress); // DallasTemperature库在读取失败时会返回-127或85等特殊值 if (tempC == DEVICE_DISCONNECTED_C) { Serial.println("Error: Could not read temperature data"); return NAN; // 返回非数字,便于网页端判断 } return tempC; }

关键点解析

  • sensors.begin()会扫描OneWire总线,发现所有设备。
  • getAddress函数通过索引(0, 1, 2...)获取设备的64位地址。这种方式要求每次上电后传感器连接顺序不变。对于更健壮的应用,应该将扫描到的地址存储在EEPROM或文件系统中。
  • setResolution设置分辨率。12位分辨率下,温度值精度为0.0625°C,但每次温度转换需要最多750ms。如果对刷新速度要求高(比如每秒更新),可以设置为9位(转换时间约94ms,精度0.5°C)。
  • requestTemperaturesByAddress是向单个传感器发送转换命令。也可以使用sensors.requestTemperatures()向总线上所有传感器广播转换命令,效率更高,但需要等待最慢的那个传感器完成转换。

3.2.3 Web服务器与HTML页面生成

这是项目的“门面”,我们使用ESP8266WebServer库来创建服务器并定义路由。

#include <ESP8266WebServer.h> ESP8266WebServer server(80); // 在80端口创建服务器对象 void handleRoot() { // 1. 读取传感器数据 float tempInside = readTemperature(insideThermometer); float tempOutside = readTemperature(outsideThermometer); // 2. 构建HTML字符串 String html = "<!DOCTYPE html><html><head>"; html += "<meta charset='UTF-8'>"; html += "<meta name='viewport' content='width=device-width, initial-scale=1'>"; html += "<title>Wi-Fi温度监测</title>"; html += "<style>"; html += "body { font-family: Arial, sans-serif; text-align: center; padding: 20px; background-color: #f4f4f4; }"; html += "h1 { color: #333; }"; html += ".container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }"; html += "table { width: 100%; border-collapse: collapse; margin-top: 20px; }"; html += "th, td { padding: 12px; border: 1px solid #ddd; }"; html += "th { background-color: #4CAF50; color: white; }"; html += "tr:nth-child(even) { background-color: #f2f2f2; }"; html += ".timestamp { font-size: 0.9em; color: #777; margin-top: 20px; }"; html += "</style>"; html += "</head><body>"; html += "<div class='container'>"; html += "<h1>🌡️ Wi-Fi温度监测系统</h1>"; html += "<p>数据更新时间: " + getDateTimeString() + "</p>"; // 一个虚构的时间函数 html += "<table>"; html += "<tr><th>传感器位置</th><th>温度 (°C)</th><th>温度 (°F)</th></tr>"; // 填充表格行 html += "<tr><td>室内传感器</td><td>" + String(tempInside, 2) + "</td><td>" + String(celsiusToFahrenheit(tempInside), 2) + "</td></tr>"; html += "<tr><td>室外传感器</td><td>" + String(tempOutside, 2) + "</td><td>" + String(celsiusToFahrenheit(tempOutside), 2) + "</td></tr>"; html += "</table>"; html += "<p class='timestamp'>页面刷新时自动更新数据。如需自动刷新,可考虑使用JavaScript。</p>"; html += "</div></body></html>"; // 3. 发送HTTP响应 (状态码200, 内容类型为text/html) server.send(200, "text/html", html); } void setupServer() { server.on("/", handleRoot); // 将根路径"/"的请求绑定到handleRoot函数 // server.on("/api/temp", handleTempAPI); // 可以添加其他路径,例如提供JSON格式的API server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); // 必须持续调用,以处理客户端请求 }

代码设计逻辑

  1. 请求驱动:只有当浏览器访问ESP8266的IP地址时,handleRoot函数才会被调用。这意味着温度数据是“按需测量”的,而不是持续不断地采样,这有助于降低功耗(虽然对于常电设备意义不大)和减少不必要的总线操作。
  2. 动态HTML生成:HTML页面是代码中通过字符串拼接动态生成的。每次请求,都会调用readTemperature函数获取最新的温度值,然后将其嵌入到HTML表格中。这种方式非常灵活,但代码中混杂了HTML/CSS,维护起来稍显混乱。对于更复杂的界面,可以考虑使用SPIFFS文件系统存储独立的HTML、CSS、JS文件。
  3. 响应发送server.send(200, "text/html", html)完成了HTTP响应的构建和发送。状态码200表示成功,"text/html"告诉浏览器返回的内容是HTML格式。

3.3 功能扩展:自动刷新与JSON API

原始描述中提到没有使用JavaScript自动刷新,因为“不是必须的”。这确实是一个简化设计。但在实际使用中,手动刷新页面体验不佳。我们可以轻松地加入两种改进方案:

方案一:使用HTML的<meta>标签实现简单自动刷新在HTML的<head>部分添加一行:

<meta http-equiv="refresh" content="10">

这会让浏览器每10秒自动刷新整个页面。优点是实现简单,一行代码;缺点是每次刷新都会重新加载整个页面,有闪烁感,且浪费带宽。

方案二:使用JavaScript + AJAX实现无刷新更新(推荐)这是更优雅的现代Web做法。我们修改Web服务器,提供纯数据接口(API),然后让前端的JavaScript定时去获取数据并局部更新页面。

首先,在服务器端添加一个API路由:

void handleTempAPI() { float tempInside = readTemperature(insideThermometer); float tempOutside = readTemperature(outsideThermometer); // 构建JSON响应 String json = "{"; json += "\"inside\": " + String(tempInside, 2) + ","; json += "\"outside\": " + String(tempOutside, 2); json += "}"; server.send(200, "application/json", json); } // 在setupServer()中注册这个路由 server.on("/api/temp", handleTempAPI);

然后,修改HTML中的JavaScript部分(在<script>标签内):

function updateTemperatures() { fetch('/api/temp') // 向API发起请求 .then(response => response.json()) .then(data => { // 更新DOM元素 document.getElementById('tempInside').innerText = data.inside.toFixed(2); document.getElementById('tempOutside').innerText = data.outside.toFixed(2); document.getElementById('lastUpdate').innerText = new Date().toLocaleTimeString(); }) .catch(error => console.error('Error fetching data:', error)); } // 页面加载后立即更新一次 document.addEventListener('DOMContentLoaded', updateTemperatures); // 然后每10秒更新一次 setInterval(updateTemperatures, 10000);

同时,HTML表格中的温度数据单元格需要加上id属性,以便JavaScript定位:

<td id="tempInside">--.--</td> <td id="tempOutside">--.--</td>

这种方式用户体验极佳,页面不会闪烁,只有数据部分静默更新,更接近现代单页应用(SPA)的体验。

4. 部署、调试与高级应用场景

4.1 完整代码整合与烧录

将上述所有代码模块整合到一个.ino文件中。在Arduino IDE中,“工具”->“开发板”选择“NodeMCU 1.0 (ESP-12E Module)”,选择正确的端口,点击上传。上传过程中,观察串口监视器(波特率115200)的输出,它会显示Wi-Fi连接状态、AP创建信息以及最重要的——ESP8266的IP地址。

首次烧录与调试流程:

  1. 硬件检查:确保所有连线正确,特别是上拉电阻已接好。
  2. 库安装:确认ESP8266WebServerDallasTemperature库已安装。
  3. 配置修改:根据你的模式选择(STA/AP),修改代码开头的OPERATION_MODE、SSID和密码。
  4. 上传代码:连接NodeMCU,点击上传。
  5. 观察串口:打开串口监视器,查看启动日志。如果卡在“Connecting to WiFi ....”,检查STA模式的SSID/密码是否正确,或信号强度。如果看到“AP IP address: 192.168.4.1”,则AP模式启动成功。
  6. 访问网页:在电脑或手机的浏览器地址栏,输入串口监视器中显示的IP地址(STA模式是类似192.168.1.xxx,AP模式是192.168.4.1)。你应该能看到显示温度的网页。

4.2 常见问题排查与解决实录

在实际操作中,你几乎一定会遇到下面这些问题。这里是我的“踩坑”记录和解决方案。

问题现象可能原因排查步骤与解决方案
串口显示连接Wi-Fi失败1. SSID/密码错误。
2. 路由器设置了MAC地址过滤或隐藏了SSID。
3. ESP8266与路由器距离太远或信号干扰。
1. 仔细核对代码中的SSID和密码,注意大小写和特殊字符。
2. 检查路由器设置,暂时关闭MAC过滤,或确保SSID广播开启。
3. 将ESP8266靠近路由器测试。尝试在代码中增加WiFi.setSleepMode(WIFI_NONE_SLEEP);,有时睡眠模式会影响连接。
网页能打开,但温度显示“nan”或-1271. DS18B20接线错误或接触不良。
2. 上拉电阻未接或阻值不对。
3. 电源电压不足或干扰。
4. 代码中传感器地址索引错误。
1.首先检查硬件:用万用表测量VDD和GND之间是否为3.3V。检查DQ线是否连接牢固。
2. 确认4.7kΩ上拉电阻正确连接在DQ和3.3V之间。
3. 尝试为ESP8266单独供电(如使用手机充电器),USB线可能供电不足,尤其连接多个传感器时。
4. 在setupSensors()函数中,先打印出所有发现的传感器地址:sensors.getAddress(tempDeviceAddress, i),然后与代码中使用的索引对比。更稳妥的方法是编写一个“地址扫描”函数,将找到的地址存入数组。
AP模式手机搜不到热点1. ESP8266的AP信道与某些国家/地区法规冲突。
2. 热点名称(SSID)包含特殊字符。
1. 在WiFi.softAP()之前,尝试设置信道:WiFi.softAP(ap_ssid, ap_password, 1, 0, 4),其中1表示隐藏SSID(设为0则不隐藏),0表示最大连接数,4是信道(1-13)。有些国家限制某些信道,可以尝试换一个。
2. 使用纯英文和数字作为SSID。
网页访问非常慢或经常超时1. ESP8266同时处理多个HTTP请求能力有限。
2. 网络中有其他设备发生IP地址冲突。
3. 温度传感器分辨率设置过高,导致requestTemperatures()阻塞时间过长。
1. 确保在loop()中及时调用server.handleClient(),不要在其中添加长时间的delay()。将温度读取等耗时操作放在请求处理函数中是可以的,因为服务器是单线程的。
2. 在STA模式,尝试为ESP8266设置静态IP,避免与DHCP池中其他IP冲突。
3. 如果使用sensors.requestTemperatures()(广播),且传感器分辨率设为12位,每次请求需等待750ms。可以考虑降低分辨率,或使用requestTemperaturesByAddress()单独请求。
设备运行一段时间后死机或重启1. 电源不稳定。
2. 看门狗定时器(WDT)超时。
3. 内存泄漏。
1. 使用质量好的USB线或外部5V电源为NodeMCU供电,避免因电流不足导致电压跌落复位。
2. 在loop()函数中或任何可能长时间运行的函数里(如复杂的字符串处理),定期调用yield()ESP.wdtFeed()来喂狗,防止看门狗复位。
3. 避免在loop()中频繁创建String对象,尽量使用静态缓冲区或F()宏将字符串常量存储在Flash中,如server.send(200, "text/html", F("Some HTML"));

4.3 项目优化与扩展思路

基础功能实现后,这个平台还有巨大的潜力可以挖掘:

  1. 数据记录与历史查看:ESP8266的存储空间有限,但可以借助SPIFFS(闪存文件系统)或外接MicroSD卡模块,定期将温度数据(带上时间戳)记录到文件中。然后,可以新增一个网页路由(如/history),读取并展示这些数据,甚至可以绘制简单的温度变化曲线图(使用Chart.js等前端库)。

  2. 阈值报警与自动化:在代码中设置温度上限和下限。当温度超过阈值时,可以通过GPIO控制一个蜂鸣器或LED灯进行本地报警。更进阶的,可以集成IFTTT或自建的Webhook,向你的手机发送通知(如通过Telegram Bot或邮件)。

  3. 低功耗远程监测:如果你希望用电池供电,就需要考虑功耗。可以将ESP8266设置为深度睡眠模式(Deep Sleep),每隔一段时间(如5分钟)唤醒一次,连接Wi-Fi,读取传感器数据,通过HTTP GET请求将数据发送到一个固定的服务器(如运行在树莓派或云服务器上的数据库),然后再次进入深度睡眠。这样,一个18650电池可以续航数周甚至数月。

  4. 多传感器与总线扩展:OneWire总线的优势在于可以挂载多个传感器。你可以编写一个函数,在启动时自动扫描并记录所有传感器的地址,然后动态生成网页表格。对于长距离布线(超过10米),需要考虑总线电容增大导致的信号衰减,可能需要降低上拉电阻值(如2.2kΩ)或使用总线驱动器。

  5. OTA(空中升级)功能:为ESP8266启用OTA,以后更新固件就不再需要插拔USB线,直接通过网页上传新的固件文件即可,这对于部署在难以触及位置的设备来说至关重要。Arduino IDE和ESP8266核心库对OTA有很好的支持。

这个Wi-Fi温度计项目,从硬件焊接、代码编写到网页设计,涵盖了一个完整物联网设备从原型到可用的全过程。它成本低廉,完全自主,并且为你打开了通往更复杂智能家居和物联网项目的大门。当你看到自己制作的网页上实时跳动着家里的温度数据时,那种成就感和对技术的掌控感,是购买任何成品都无法替代的。

http://www.jsqmd.com/news/884699/

相关文章:

  • 2026低空治理新需求下的平台供应商推荐:黑飞监测预警系统能力观察 - 品牌2025
  • 正点原子MiniFly飞控源码实战:从PID参数配置到定点悬停调试全流程
  • 双向塑料土工格栅如何进行施工?
  • 商城网站建设哪家便宜?低价也能做出优质商城? - FaiscoJeff
  • Iwara视频下载神器:2025终极指南,一键批量下载全攻略
  • 2026芜湖婚纱照精选榜单|真实测评不踩雷,安心拍好每一套 - charlieruizvin
  • 基于ISDN信令的来电语音播报系统:从原理到树莓派实现
  • Frida Android动态插桩实战:绕过SSL Pinning与加固App Hook
  • 数据说话:洛阳蒙娜丽莎4000㎡场地+底片全送,婚纱照选店该看什么 - charlieruizvin
  • 邢台企业采购储罐怕踩坑?优选洋阳玻璃钢,专业玻璃钢储罐厂家,期待与您合作! - 资讯纵览
  • 3大实战场景深度解析:Box64如何让ARM设备流畅运行x86_64程序
  • 2026 优选:沈阳实惠的玩具小商品直供 / 益智玩具 / 儿童玩具推荐盘点,优选沈阳宝赢玩具超市 - 资讯纵览
  • 如何3分钟掌握百度网盘高速下载技巧:Python直链获取完全指南
  • 半样本自助法:为机器学习CATE估计器构建置信区间的实用指南
  • 如何用Untrunc拯救损坏视频?2025年终极MP4修复工具完全指南
  • OpenClaw Browser Relay直接连接 AI 与Chrome浏览器
  • 深度解析MoviePilot企业微信消息推送的智能时段控制机制
  • 大模型集体“下海”赚钱:2026年AI生死战已打响,免费时代正式终结?
  • 2026青岛婚纱照婚纱摄影推荐|备婚必看测评,闭眼选不踩雷(1) - charlieruizvin
  • 如何高效实现Windows自动化鼠标点击:AutoClicker完整实战指南
  • 拆解互联网:通俗易懂的网络分层模型
  • ArcGIS Pro模型构建器新玩法:像写Python一样玩转‘如果...就...’,实现智能化的空间数据处理流水线
  • NPU跑LLM实战指南:KV Cache动态性如何突破硬件限制
  • 阻燃布|阻燃面料十大品牌 2026 权威盘点:不燃耐温成核心选型标准,新能源、消防、军工、冶金、建筑等行业选型指南 - 资讯纵览
  • 10分钟掌握暗黑破坏神2存档编辑器:新手完整使用教程
  • 智慧树自动刷课插件终极指南:告别手动操作,3步实现高效学习
  • 最危险的不是 OpenAI 抢你,而是 Anthropic 悄悄把你做成它的一个功能
  • 深入AMD处理器底层:SMUDebugTool硬件级调优实战
  • Shopify自建站难吗 Shopify独立站建站需要找别人吗 - 麦麦唛
  • AXS人体工学评估系统:动作捕捉与AI如何革新制造业工效学分析