1. 项目概述与核心价值
最近在折腾一个智能花房的小项目,核心需求是实时监控几个关键花架区域的温度和湿度。市面上现成的温湿度计要么数据无法联网,要么价格不菲,对于我这种喜欢动手又有点“抠门”的开发者来说,自己动手丰衣足食显然更有吸引力。于是,我翻出了手边的ESP32开发板和经典的DHT11传感器,决定搭建一个低成本、可定制的温湿度监测节点。
这个项目听起来简单,就是把传感器的数据读出来、显示出来。但实际操作中,从硬件选型、环境搭建、代码调试到最终稳定运行,每一步都有不少细节值得琢磨。比如,为什么选DHT11而不是其他传感器?ESP32的众多引脚里,为什么偏偏用某个特定的GPIO?代码里那些延迟和校验逻辑又是为了什么?这些问题,恰恰是新手从“照抄代码”到“理解原理”的关键跨越。
本文将以ESP32(具体是M5Stick-C这款集成度很高的开发板)和DHT11传感器为核心,带你完整走一遍开发流程。你不仅能得到一个可以显示温度、湿度和体感温度(热指数)的实用设备,更重要的是,我会把我调试过程中遇到的坑、参数选择的考量,以及如何让系统更稳定的经验,毫无保留地分享出来。无论你是刚接触物联网开发和嵌入式系统的学生,还是想快速验证一个传感器方案的工程师,这篇内容都能给你提供一份可直接“抄作业”的详细指南。
2. 硬件选型与核心组件解析
在动手焊接和写代码之前,搞清楚我们手头“武器”的特性至关重要。硬件选型不是随便抓一个就用,每个选择背后都对应着不同的成本、精度和复杂度考量。
2.1 为什么是ESP32与M5Stick-C?
ESP32这颗芯片在物联网领域堪称“明星”,它集成了双核处理器、Wi-Fi和蓝牙,性能强大且功耗控制得不错。但对于新手来说,直接使用ESP32的裸芯片或最小系统板,还需要额外连接电源、调试接口和显示设备,步骤繁琐。
这里我选择了M5Stick-C,它本质上是一个以ESP32为核心的高度集成化开发板。它的优势非常明显:
- 开箱即用:板载了彩色LCD屏幕、按键、电池、电源管理芯片和六轴传感器(MPU6886)。这意味着我们不需要再为如何连接屏幕、如何供电而烦恼,大大降低了入门门槛和接线错误的风险。
- 体积小巧:整个设备比一包口香糖还小,非常适合作为最终产品的外壳封装,或者部署在空间有限的监测点。
- 生态友好:M5Stack官方提供了完善的
M5StickC库,用几行代码就能轻松驱动屏幕和读取按键状态,让我们能更专注于核心的传感器应用逻辑。
当然,如果你手头只有普通的ESP32开发板(如NodeMCU、ESP32-DevKitC),也完全没问题。你只需要额外准备一个OLED或LCD屏幕,并按照对应的引脚和库进行连接即可,项目的核心逻辑是完全相通的。
2.2 DHT11传感器的工作原理与局限
DHT11是一款经典的温湿度复合传感器。它通过一个电阻式感湿元件和一个NTC测温元件来测量环境参数,并通过内置的单片机将模拟信号转换为数字信号,通过单总线协议发送给主控制器。
单总线协议是理解DHT11通信的关键。它意味着只需要一根数据线(加上电源和地线共三根线)就能完成双向通信。主机(ESP32)通过发送特定的起始信号,然后切换为接收模式,等待DHT11响应并发送40位的数据帧。这40位数据包含了整数和小数部分的湿度、温度数据,以及一个8位的校验和。
选择DHT11主要基于以下几点:
- 成本极低:在要求不高的场合,它是性价比之王。
- 接口简单:三线制连接,节省微控制器的IO口。
- 数字输出:免去了额外的模数转换电路。
但是,必须清楚它的局限性,这决定了它适用的场景:
- 精度一般:湿度精度±5%RH,温度精度±2°C。这意味着它不适合需要高精度测量的实验室或工业控制场景,但对于家庭环境监测、花卉养护、仓库大体温湿度查看等应用是完全足够的。
- 响应速度慢:每次测量间隔至少需要2秒。在代码中必须预留足够的延迟,连续读取会导致失败。
- 通信时序要求严格:单总线协议对时序很敏感,这也是为什么我们需要一个经过优化的库来驱动它,而不是自己从头写底层时序代码。
注意:如果你的项目对精度要求较高,可以考虑DHT22(AM2302)或SHT系列传感器。DHT22的湿度精度可达±2%RH,温度±0.5°C,但价格也更高。更换传感器后,只需在代码中修改传感器类型定义,大部分逻辑可以复用。
2.3 物料清单与连接详解
除了核心的主控和传感器,一些细节配件同样重要:
- M5Stick-C开发板:1个。
- DHT11传感器模块:1个。建议购买市面上常见的三针模块(已带输出信号上拉电阻),比直接使用传感器元件更方便稳定。
- 杜邦线:若干(母对母或母对公,根据你的DHT11模块接口类型决定)。用于连接传感器和开发板。
- USB Type-C数据线:1根。用于供电和程序烧录。
连接是整个项目中最需要细心的一步,接错了轻则没数据,重则可能损坏设备。M5Stick-C的引脚排列比较紧凑,务必对照板子上的丝印确认。
接线图(核心原则:电源、地、信号线各就各位):
- DHT11 VCC(电源正极)->M5Stick-C的
3.3V引脚。绝对不要接到5V引脚,DHT11模块的工作电压通常是3.3V-5.5V,但为了与ESP32的IO电平匹配,使用3.3V最安全。 - DHT11 GND(电源地)->M5Stick-C的
GND引脚。确保共地,这是电路正常工作的基础。 - DHT11 DATA/S(信号线)->M5Stick-C的
G26引脚。这是代码中定义的数据引脚。选择G26是因为它在M5Stick-C的侧边引脚中易于连接,且没有默认的特殊功能(如某些引脚在启动时会有上拉或下拉,可能干扰通信)。
实操心得:在连接时,最好先断开USB供电。接好线后,先别急着上电,用手指顺着线捋一遍,对照上述三点再检查一次。我曾在熬夜调试时,把VCC和GND接反,导致传感器模块轻微发热,幸好发现及时没有烧毁。养成“上电前复查”的习惯,能避免很多不必要的损失。
3. 软件开发环境搭建与配置
硬件准备就绪后,我们需要在电脑上搭建一个能够“指挥”ESP32的软件环境。这里我们选择Arduino IDE,因为它对初学者非常友好,库生态丰富,足以应对我们这个项目。
3.1 Arduino IDE的安装与ESP32板卡支持
首先,去Arduino官网下载并安装最新版的Arduino IDE。安装过程很简单,一路下一步即可。
安装完成后,打开IDE,默认情况下它只支持Arduino自家的板卡(如Uno, Mega)。我们需要手动添加ESP32的开发板支持。
- 打开文件 -> 首选项。
- 在“附加开发板管理器网址”一栏中,填入以下网址(如果已有其他网址,用逗号隔开):
https://espressif.github.io/arduino-esp32/package_esp32_index.json这个网址指向了乐鑫官方维护的ESP32 Arduino核心库。 - 点击“好”保存。
接下来,打开工具 -> 开发板 -> 开发板管理器。这会弹出一个列表窗口,在顶部的搜索框中输入“esp32”。你应该会看到由“Espressif Systems”提供的“esp32”平台。点击它,然后选择右侧出现的“安装”按钮。
注意:这个过程需要从GitHub下载资源,网络状况不好的话可能会比较慢,甚至失败。如果遇到下载问题,可以尝试使用网络代理工具,或者查找国内开发者提供的镜像源进行配置。安装完成后,在“工具->开发板”菜单下,你应该能找到“ESP32 Arduino”分类,里面有很多型号,我们选择“M5Stick-C”。
3.2 必需库文件的安装与管理
Arduino的强大之处在于其海量的开源库。我们不需要自己编写复杂的单总线通信时序代码,直接使用成熟的库即可。
- 在Arduino IDE中,点击项目 -> 加载库 -> 管理库。会打开库管理器。
- 在搜索框中输入“DHT sensor library”。通常第一个结果就是由Adafruit维护的“DHT sensor library”。点击它,然后选择“安装”。这个库提供了读取DHT系列传感器的统一接口。
- 安装DHT库时,它可能会提示需要依赖项。或者,为了确保功能完整,我们最好再安装另一个库。继续在库管理器中搜索“Adafruit Unified Sensor”。找到并安装这个库。这是一个传感器抽象层,为Adafruit的各种传感器驱动提供后台支持,DHT库在某些功能(如计算热指数)上会依赖它。
安装成功后,你就可以在“项目->加载库”的菜单下方看到已安装的库列表,里面应该包含了“DHT sensor library by Adafruit”。
3.3 M5Stick-C专用库的引入
为了让M5Stick-C的屏幕和硬件正常工作,我们还需要其官方库。
- 再次打开库管理器。
- 搜索“M5StickC”。你应该能找到由“M5Stack”发布的库。点击安装。 这个库封装了屏幕驱动、按键读取、电源管理等所有硬件功能。安装后,我们在代码中只需包含
M5StickC.h,就可以轻松调用M5.Lcd来显示文字或图形,用M5.BtnA/B来读取按键状态。
至此,软件开发环境就全部配置完成了。这个过程看似步骤不少,但一旦配置好,以后所有基于ESP32和Arduino IDE的项目都可以复用这个环境,一劳永逸。
4. 代码逐行解析与编写实践
环境搭好了,现在进入核心环节——写代码。我将提供完整的代码,并逐段解释其作用,让你不仅知其然,更知其所以然。
4.1 代码框架与头文件包含
首先,我们创建一个新的Arduino项目(sketch)。代码的开头部分是包含必要的头文件和定义常量。
#include "M5StickC.h" #include "DHT.h" // 定义DHT11数据线连接的引脚 #define DHTPIN 26 // 定义屏幕背景色(一种灰色) #define TFT_GREY 0x5AEB // 定义我们使用的传感器类型,这里是DHT11 #define DHTTYPE DHT11 // 如果你用的是DHT22,就注释掉上面一行,取消注释下面这行 // #define DHTTYPE DHT22 // 初始化DHT传感器对象,参数是引脚和类型 DHT dht(DHTPIN, DHTTYPE);#include "M5StickC.h"和#include "DHT.h":引入我们安装的库,这样编译器才知道M5和dht这些对象是什么。#define DHTPIN 26:这是一个宏定义,将DHTPIN这个符号替换为数字26。这样做的好处是,如果你哪天想换一个引脚连接传感器,只需要修改这里的26为其他数字(例如32),后面所有用到DHTPIN的地方都会自动更新,代码可维护性更好。#define DHTTYPE DHT11:明确指定传感器型号。DHT库支持DHT11, DHT22等,它们的数据格式和校准略有不同,必须正确指定。DHT dht(DHTPIN, DHTTYPE);:这行代码创建了一个名为dht的DHT类对象。你可以把它理解为一个“传感器管家”,后续所有读取温度湿度的操作,都通过调用这个dht对象的方法来完成。构造函数传入了引脚号和类型,告诉“管家”该去哪个引脚、以什么协议读取数据。
4.2 初始化设置(setup函数)
setup()函数在设备上电或复位后只运行一次,用于进行初始化配置。
void setup() { // 初始化M5Stick-C硬件(屏幕、I2C、IMU等) M5.begin(); // 设置屏幕旋转方向。参数可以是0,1,2,3。3代表旋转270度。 // 你可以根据实际摆放设备的方向调整这个值,让文字正对你。 M5.Lcd.setRotation(3); // 初始化串口通信,波特率设置为9600。 // 这行代码非常重要,它打开了ESP32与电脑串口监视器之间的通信通道。 // 调试时,我们可以通过串口监视器打印信息,查看传感器数据或错误信息。 Serial.begin(9600); Serial.println("DHTxx test!"); // 在串口打印启动信息 // 启动DHT传感器 dht.begin(); }M5.begin():这是M5库的标准初始化函数,必须调用。M5.Lcd.setRotation(3):调整屏幕显示方向。M5Stick-C的屏幕是竖着的,但通常我们横着拿设备,所以旋转270度让显示内容横向。Serial.begin(9600)和Serial.println:这是调试的黄金工具。在后续的loop函数中,我们也会把数据打印到串口。当屏幕显示不正常时,通过串口监视器查看数据,可以快速判断是传感器读取问题,还是屏幕显示问题。
4.3 主循环逻辑(loop函数)
loop()函数会无限循环执行,我们的主要逻辑都在这里。
void loop() { // 两次测量之间至少等待2秒。DHT11传感器需要较长的采样时间。 // 更快的读取频率会导致读取失败。 delay(2000); // 每次更新显示前,用灰色清空整个屏幕,避免新旧文字重叠。 M5.Lcd.fillScreen(TFT_GREY); // 读取湿度值(百分比) float h = dht.readHumidity(); // 读取摄氏温度 float t = dht.readTemperature(); // 读取华氏温度(参数true表示返回华氏度) float f = dht.readTemperature(true); // 检查读取是否成功。如果读取失败,h, t, f中会得到NaN(非数字)。 if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); // 读取失败就直接返回,跳过本次循环的显示部分,等待下一次loop再尝试。 return; } // 设置屏幕光标起始位置为(0,0),并使用2号字体(M5库预定义的几种字体大小之一) M5.Lcd.setCursor(0, 0, 2); // 设置文本颜色为白色,背景为黑色 M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); M5.Lcd.setTextSize(1); // 设置文本大小 M5.Lcd.println(""); // 打印一个空行,作为顶部间距 // 计算热指数(体感温度)。注意:这里需要传入华氏温度和湿度。 float hi = dht.computeHeatIndex(f, h); // 在屏幕上显示湿度 M5.Lcd.print("Humidity: "); M5.Lcd.print(h); // 打印湿度数值 M5.Lcd.println(" %"); // 打印单位并换行 // 同时也在串口打印,方便调试 Serial.print("Humidity: "); Serial.print(h); Serial.println(" %"); // 改变文本颜色为黄色,显示温度 M5.Lcd.setTextColor(TFT_YELLOW, TFT_BLACK); M5.Lcd.setTextFont(2); // 切换字体 M5.Lcd.print("Temperature: "); M5.Lcd.print(t); M5.Lcd.println(" *C"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C / "); Serial.print(f); Serial.println(" *F"); // 改变文本颜色为绿色,显示热指数 M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK); M5.Lcd.setTextFont(2); M5.Lcd.print("Heat index: "); M5.Lcd.print(hi); M5.Lcd.println(" *F"); Serial.print("Heat index: "); Serial.print(hi); Serial.println(" *F"); }代码逻辑梳理与关键点解析:
- 延迟是必须的:
delay(2000)不是随意的。DHT11的数据手册明确要求,连续两次读取的间隔需大于1秒(实测2秒更稳定)。去掉这行延迟,你会看到大量的读取失败。 - 清屏操作:
M5.Lcd.fillScreen(TFT_GREY)用于清除上一帧的显示内容。如果不清屏,新的文字会覆盖在旧的文字上,导致显示混乱。你也可以用局部清屏来优化,但全屏清屏最简单可靠。 - 错误处理至关重要:
if (isnan(h) || isnan(t) || isnan(f))这段判断是代码健壮性的保证。DHT11通信容易受干扰,偶尔读取失败是正常的。通过检查返回值是否为NaN,我们能够捕获这次失败,在串口输出错误信息,并放弃本次显示,而不是显示一个错误的数据。 - 热指数的计算:
computeHeatIndex函数根据湿度和温度(华氏)来计算人体感受到的“体感温度”。这是一个非常有用的衍生数据,尤其在环境监测中。公式本身考虑了湿度对体感的影响,湿度越高,相同的温度下人体感觉越闷热。 - 双输出调试:代码同时向屏幕和串口输出数据。这是一个非常好的习惯。当项目复杂后,屏幕可能因为各种原因不显示,但串口数据只要线连着,就能最真实地反映程序运行状态和传感器读数,是排查问题的第一手资料。
5. 烧录、调试与功能验证
代码写完了,接下来就要把它放到硬件上运行,并解决可能出现的各种问题。
5.1 编译与上传流程
- 选择开发板与端口:在Arduino IDE的“工具”菜单下:
- 开发板:选择“M5Stick-C”。
- 端口:选择你的M5Stick-C连接的COM口(Windows)或
/dev/cu.usbserial-*(Mac)。如果端口列表是灰色的,检查USB线是否插好,或者是否需要安装CH340/CP210x等USB转串口芯片的驱动(M5Stick-C通常使用CP2102,系统一般能自动识别)。
- 编译:点击左上角的“√”(验证)按钮。IDE会检查代码语法错误。如果下方控制台输出“编译完成”,说明代码没问题。
- 上传:点击“→”(上传)按钮。此时,M5Stick-C上的红色LED可能会快速闪烁,表示正在烧录程序。等待控制台显示“上传成功”。
5.2 串口监视器的使用与数据分析
上传成功后,M5Stick-C会自动重启运行新程序。此时,打开Arduino IDE的“工具 -> 串口监视器”(或快捷键Ctrl+Shift+M)。
确保串口监视器右下角的波特率设置为9600,与代码中Serial.begin(9600)一致。如果设置错误,你会看到乱码。
正常情况下,你应该每隔2秒看到一行数据输出,例如:
Humidity: 45.00 % Temperature: 25.30 *C / 77.54 *F Heat index: 77.99 *F同时,M5Stick-C的屏幕上也应该同步显示这些信息。
通过串口数据,我们可以做几件事:
- 验证传感器工作:观察数值是否在合理范围内(湿度0-100%,温度根据环境)。用手握住DHT11传感器,温度值应该会缓慢上升。
- 判断通信稳定性:连续运行几分钟,看是否有“Failed to read from DHT sensor!”的错误信息出现。偶尔出现一两次是正常的,如果频繁出现,就需要排查硬件连接。
- 校准参考:虽然DHT11精度有限,但你可以把它和一个你认为准确的温湿度计放在一起,对比读数,了解其误差范围。
5.3 常见问题排查与解决
即使按照教程一步步来,也可能会遇到问题。下面是我在多次实践中总结的“排坑指南”:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 上传失败 | 1. 端口选择错误。 2. 开发板型号选择错误。 3. USB线仅供电,不支持数据。 4. 驱动未安装。 | 1. 重新拔插USB线,查看端口列表变化。 2. 确认“工具->开发板”选的是“M5Stick-C”。 3. 换一根确认能传输数据的USB线。 4. 前往芯片厂商官网(如Silicon Labs for CP2102)下载安装驱动。 |
| 串口监视器无输出或乱码 | 1. 波特率不匹配。 2. 代码中 Serial.begin()未执行或波特率设置错误。3. 串口被其他软件占用。 | 1. 检查并确保串口监视器波特率设为9600。 2. 检查 setup()函数中是否有Serial.begin(9600)。3. 关闭其他可能占用串口的软件(如其他串口助手、Putty等)。 |
| 屏幕有背光但无显示 | 1. 屏幕初始化或旋转设置问题。 2. 文本颜色与背景色相同。 3. 显示代码逻辑未执行。 | 1. 检查M5.begin()和M5.Lcd.setRotation()是否被调用。2. 尝试将文本颜色改为 TFT_RED等醒目颜色测试。3. 在 loop()开头增加M5.Lcd.println("Loop Start");测试显示功能。 |
| 串口持续输出“Failed to read from DHT sensor!” | 1. 接线错误(VCC, GND, DATA接错)。 2. 电源问题(电压不足或未共地)。 3. 引脚定义错误。 4. 传感器损坏。 5.未添加延迟或延迟不足。 | 1.这是最常见原因!再三检查三根线是否按“VCC-3.3V, GND-GND, DATA-G26”连接。 2. 确保使用M5Stick-C的3.3V引脚供电,GND连接牢固。 3. 检查代码中 #define DHTPIN的值是否与实际连接引脚一致。4. 更换一个DHT11模块试试。 5.确保 loop()函数开头有delay(2000);。 |
| 读数不变化或明显不准 | 1. 传感器处于热源或气流死角。 2. DHT11本身精度限制。 3. 传感器保护膜未撕。 | 1. 将传感器放置在能代表环境平均温湿度的位置,远离MCU(MCU工作会发热)、出风口、窗户。 2. 理解并接受DHT11的精度范围(湿度±5%,温度±2°C)。 3. 有些DHT11传感器元件上有一层蓝色的保护膜,使用前需要撕掉,否则会影响感应。 |
我的踩坑记录:有一次,所有接线和代码都确认无误,但就是读不到数据。折腾了半小时,最后发现是杜邦线接触不良。杜邦线用久了,内部的金属簧片会松动。解决方法是用手轻轻捏紧一下杜邦线的接头,或者直接换一根新线。所以,当遇到灵异问题时,硬件连接,尤其是这种插拔式的连接,永远是首要怀疑对象。
6. 项目优化与扩展思路
一个能跑通的基础项目只是起点。要让这个小设备真正变得有用、可靠,还需要一些优化。这里分享几个我实践过的进阶方向。
6.1 提升系统稳定性与数据准确性
基础的代码循环读取,一旦读取失败就放弃本次显示。我们可以做得更好:
增加软件重试机制:当一次读取失败后,不要立即返回,可以加入一个小的延迟(如50ms),然后重试读取,最多重试3-5次。只有多次重试都失败,才报错。这能有效应对偶尔的时序干扰。
int retryCount = 0; float h, t, f; bool readSuccess = false; while (retryCount < 5 && !readSuccess) { h = dht.readHumidity(); t = dht.readTemperature(); f = dht.readTemperature(true); if (!isnan(h) && !isnan(t) && !isnan(f)) { readSuccess = true; } else { delay(50); retryCount++; } } if (!readSuccess) { Serial.println("Sensor read failed after retries."); // 可以在屏幕上显示错误图标或上一次的有效数据 return; }数据平滑滤波:传感器读数可能会有微小跳动。我们可以采用滑动平均滤波,存储最近N次的读数,每次显示其平均值,使显示更稳定。
const int numReadings = 10; float humidityReadings[numReadings]; float tempReadings[numReadings]; int readIndex = 0; float humidityTotal = 0; float tempTotal = 0; // 在loop中,读取到有效数据h和t后: humidityTotal = humidityTotal - humidityReadings[readIndex] + h; humidityReadings[readIndex] = h; float averageHumidity = humidityTotal / numReadings; tempTotal = tempTotal - tempReadings[readIndex] + t; tempReadings[readIndex] = t; float averageTemp = tempTotal / numReadings; readIndex = (readIndex + 1) % numReadings; // 循环覆盖旧数据 // 使用averageHumidity和averageTemp进行显示和计算
6.2 连接网络与数据上传
ESP32最大的优势是Wi-Fi。让设备联网,数据价值将倍增。
连接本地Wi-Fi:在
setup()中加入Wi-Fi连接代码,将数据通过串口打印,或者显示在屏幕上。#include <WiFi.h> const char* ssid = "你的Wi-Fi名称"; const char* password = "你的Wi-Fi密码"; void setup() { // ... 其他初始化代码 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected."); Serial.print("IP address: "); Serial.println(WiFi.localIP()); }上传到物联网平台:连接Wi-Fi后,可以将数据定期发送到云平台,如ThingsBoard、阿里云物联网平台、或者简单的Blynk、EasyIoT等。这样你就可以在手机App或网页上远程查看历史数据和曲线图。这需要学习平台提供的HTTP或MQTT SDK,并集成到你的代码中。
6.3 低功耗设计与电池续航优化
M5Stick-C自带电池,如果想做成便携或长期离线监测的设备,功耗是关键。
深度睡眠模式:对于每分钟甚至每半小时才需要采集一次数据的场景(如仓库监测),可以让ESP32在采集和发送数据后,进入深度睡眠模式。
// 在loop函数末尾,数据上传完成后 esp_sleep_enable_timer_wakeup(60 * 1000000); // 睡眠60秒(单位:微秒) Serial.println("Going to sleep now."); delay(100); // 等待串口发送完成 esp_deep_sleep_start(); // 进入深度睡眠设备会休眠,功耗极低(约10μA),直到定时器唤醒它,然后从头执行
setup()。注意,深度睡眠下,RAM中所有变量会丢失,需要将关键数据存入RTC内存或外部EEPROM。关闭不必要的硬件:在初始化时,如果不用到M5Stick-C的IMU(六轴传感器)、屏幕背光(在不需要常亮显示时),可以在
M5.begin()后,调用相应函数关闭它们以省电。
6.4 外壳设计与实际部署
一个裸露的开发板既不安全也不美观。你可以使用3D打印为M5Stick-C和DHT11设计一个外壳。设计时注意:
- 为DHT11传感器开孔,确保其能充分接触空气,同时避免灰尘和凝露直接接触。
- 为M5Stick-C的屏幕、USB口、复位键和按键预留开口。
- 考虑安装方式,比如背面设计挂孔,或者底部增加脚垫。
最后,将这个完成的小设备放在你需要监测的地方——书桌、花盆边、鱼缸旁、路由器附近,它就能默默为你提供环境数据了。从一串代码到一个实实在在的、在真实环境中运行的小装置,这种成就感,正是嵌入式开发和物联网的魅力所在。