别再只会打印数据了!用Arduino Uno + DHT11做个桌面温湿度显示器(附完整代码)

百里方欣

从串口调试到桌面神器:用Arduino Uno打造高颜值温湿度显示器

记得第一次用DHT11传感器时,盯着串口监视器里跳动的数字兴奋不已,但很快这种新鲜感就被"然后呢?"的疑问取代。那些冰冷的数字值得一个更优雅的呈现方式——这正是我们要解决的痛点。本文将带你用不到50元的硬件预算,把简陋的串口输出升级为实用的桌面显示器,让技术真正融入日常生活。

1. 硬件升级方案选择

市面上常见的显示模块主要分两类:经典的LCD1602和更现代的OLED。我在多个项目中反复对比后发现:

LCD1602特点

  • 价格亲民(约8-15元)
  • 蓝底白字辨识度高
  • 需要调节对比度电位器
  • 可视角度较小

OLED优势

  • 自发光无需背光(约18-30元)
  • 超高对比度
  • 支持多字体和图形显示
  • 0.96英寸版本非常适合桌面摆放

提示:如果追求极简风格,推荐SSD1306驱动的0.96寸OLED,其I2C接口仅需4根连线,比LCD1602的并行接口更节省IO口。

硬件购物清单:

  • Arduino Uno主板 ×1
  • DHT11温湿度传感器 ×1
  • SSD1306 OLED屏幕(I2C接口) ×1
  • 杜邦线(母对母) ×10
  • 微型面包板(可选) ×1

2. 硬件连接与注意事项

连接示意图如下(实际接线时建议先断电操作):

设备引脚 Arduino接口 备注
DHT11 VCC 5V 红色线
DHT11 GND GND 黑色线
DHT11 DATA D7 黄色线
OLED VCC 3.3V 注意不是5V!
OLED GND GND
OLED SCL A5 I2C时钟线
OLED SDA A4 I2C数据线

常见问题排查:

  1. OLED不亮:检查是否错接5V(必须接3.3V)
  2. 数据乱码:确认I2C地址是否为0x3C(部分型号是0x78)
  3. DHT11无响应:尝试在DATA引脚接4.7K上拉电阻
cpp复制// 快速测试I2C地址扫描
#include <Wire.h>
void setup() {
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);
  Serial.println("I2C扫描开始...");
}
void loop() {
  byte error, address;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("找到设备地址: 0x");
      if (address<16) Serial.print("0");
      Serial.println(address,HEX);
    }
  }
  delay(5000);
}

3. 代码重构与界面设计

基础功能实现后,我们要解决两个核心痛点:数据刷新时的屏幕闪烁,以及枯燥的数字显示。以下是优化后的完整方案:

cpp复制#include <DHT.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define DHTPIN 7
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// 自定义图标
const unsigned char humidityIcon[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; // 简化的图标位图

void setup() {
  Serial.begin(115200);
  dht.begin();
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306分配失败"));
    for(;;);
  }
  
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.display();
  delay(2000);
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(h) || isnan(t)) {
    Serial.println("读取DHT11失败!");
    return;
  }

  display.clearDisplay();
  
  // 绘制顶部边框
  display.drawRect(0, 0, display.width(), 16, SSD1306_WHITE);
  
  // 显示标题
  display.setTextSize(1);
  display.setCursor(5, 4);
  display.print("环境监测仪");
  
  // 温度显示区域
  display.drawRect(5, 20, 55, 40, SSD1306_WHITE);
  display.setCursor(15, 25);
  display.setTextSize(1);
  display.print("温度");
  display.setCursor(15, 40);
  display.setTextSize(2);
  display.print(t, 1);
  display.print("C");
  
  // 湿度显示区域
  display.drawRect(68, 20, 55, 40, SSD1306_WHITE);
  display.drawBitmap(70, 25, humidityIcon, 16, 16, SSD1306_WHITE);
  display.setCursor(90, 25);
  display.setTextSize(1);
  display.print("湿度");
  display.setCursor(80, 40);
  display.setTextSize(2);
  display.print(h, 1);
  display.print("%");
  
  // 底部状态栏
  display.fillRect(0, display.height()-8, display.width(), 8, SSD1306_WHITE);
  display.setTextColor(SSD1306_BLACK);
  display.setCursor(5, display.height()-7);
  display.print("更新: ");
  display.print(millis()/1000);
  display.print("s");
  
  display.display();
  delay(2000);
}

关键优化点:

  1. 采用双缓冲机制避免闪烁(Adafruit库自动处理)
  2. 界面分区显示,增加边框和图标元素
  3. 添加运行时间状态栏
  4. 错误检测机制更健壮

4. 进阶美化与功能扩展

基础版本运行稳定后,可以考虑这些提升体验的改造:

视觉增强方案

  • 使用FreeMonoBold等矢量字体替换默认字体
  • 添加温度变化趋势图(需要记录历史数据)
  • 当温度超过阈值时显示警告图标
cpp复制// 添加字体库示例
#include <Fonts/FreeMonoBold9pt7b.h>
void setup() {
  // ...
  display.setFont(&FreeMonoBold9pt7b);
}

硬件改造思路

  1. 3D打印外壳(推荐厚度2mm的ABS材料)
  2. 添加5V静音风扇散热系统
  3. 改用18650电池供电实现无线化
  4. 增加光敏电阻自动调节屏幕亮度

数据记录方案对比

存储方式 优点 缺点 适用场景
SD卡模块 容量大 需要额外库 长期数据收集
EEPROM 无需外设 仅4KB空间 关键数据备份
云端传输 远程查看 依赖网络 智能家居整合

实际项目中,我更喜欢用ESP-01S WiFi模块将数据同步到私有服务器,这样既保留了本地显示,又能实现远程监控。一个典型的MQTT上传代码片段:

cpp复制#include <ESP8266WiFi.h>
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);

void setupWIFI() {
  WiFi.begin("SSID", "password");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  client.setServer("mqtt.server.com", 1883);
}

void sendData(float t, float h) {
  char payload[50];
  sprintf(payload, "{\"temp\":%.1f,\"humi\":%.1f}", t, h);
  client.publish("sensor/dht11", payload);
}

5. 常见问题解决方案

DHT11读数不稳定

  • 现象:湿度值偶尔跳变10%以上
  • 解决方法:
    1. 在DATA引脚添加0.1μF去耦电容
    2. 将读取间隔从2秒延长到5秒
    3. 采用滑动平均滤波算法
cpp复制// 滑动平均滤波实现
#define FILTER_LEN 5
float tempHistory[FILTER_LEN] = {0};
byte filterIndex = 0;

float getFilteredTemp() {
  tempHistory[filterIndex] = dht.readTemperature();
  filterIndex = (filterIndex + 1) % FILTER_LEN;
  
  float sum = 0;
  for(byte i=0; i<FILTER_LEN; i++) {
    sum += tempHistory[i];
  }
  return sum / FILTER_LEN;
}

OLED残影问题

  • 现象:切换画面时留有上一屏痕迹
  • 解决方案:
    1. 每次刷新前调用display.clearDisplay()
    2. 设置display.dim(false)关闭省电模式
    3. 定期(如每24小时)执行全白-全黑刷新循环

功耗优化技巧

  • 将刷新率从2秒降为5秒可减少30%功耗
  • 使用display.ssd1306_command(SSD1306_DISPLAYOFF)在无人时关闭屏幕
  • 替换线性稳压为DC-DC降压模块(效率提升20%以上)

在办公室部署这个显示器三个月后,最意外的收获是同事们开始主动讨论环境舒适度,而原本枯燥的技术demo变成了人人关心的实用工具。有一次空调故障,正是显示器上的异常温度数据第一时间引起了大家注意。

内容推荐

告别SD卡和PinePhone!用一加6T和Fastboot 5分钟搞定Nethunter Pro刷机
本文详细介绍了如何在一加6T手机上使用Fastboot工具快速刷入Nethunter Pro系统,仅需5分钟即可完成移动渗透测试平台的部署。教程涵盖准备工作、Fastboot刷机全流程、常见问题排查及Nethunter Pro特色功能应用,帮助安全研究人员高效搭建专业测试环境。
博通时代VMware兼容性查询实战:从服务器到IO设备的全链路指南
本文详细介绍了博通时代VMware兼容性查询的实战指南,涵盖从服务器整机到IO设备的全链路验证。通过具体案例演示如何利用博通兼容性指南网站查询Dell服务器和存储控制器的兼容性,并分享常见问题排查技巧与复杂场景应对策略,帮助IT管理员高效完成硬件兼容性验证。
uniapp手机号一键登录实战:从云空间配置到自定义基座避坑指南
本文详细介绍了在uniapp中实现手机号一键登录的完整流程,包括云空间配置、自定义基座避坑指南以及完整代码实现。通过实战经验分享,帮助开发者快速解决常见问题,如包名不一致、机型兼容性等,提升开发效率和应用转化率。
【Python】shutil.make_archive() 实战指南:从基础到高级应用
本文详细介绍了Python中shutil.make_archive()函数的使用方法,从基础操作到高级应用,帮助开发者高效实现文件打包功能。通过实战案例和性能优化技巧,展示了如何在不同场景下灵活运用该函数,提升开发效率并避免常见问题。
从M-PHY到UniPro:手把手拆解UFS 4.0的物理层与链路层,看它如何实现23.2Gbps
本文深入解析UFS 4.0如何通过M-PHY v5.0物理层与UniPro v2.0传输层的协同优化实现23.2Gbps的高速传输。从差分信号设计、多Lane绑定时序挑战到协议栈升级与时钟架构优化,详细拆解了UFS 4.0的技术细节与工程实践,揭示了其在移动设备存储技术中的领先优势。
告别闪屏与撕裂:用ESP32-S3的RGB接口和LVGL打造流畅UI界面的保姆级教程
本文详细介绍了如何利用ESP32-S3的RGB接口和LVGL图形库打造流畅UI界面,解决闪屏与撕裂问题。从硬件选型、基础配置到LVGL移植与优化,再到性能优化实战和高级技巧,提供了全面的保姆级教程,帮助开发者实现嵌入式设备的高质量视觉体验。
FastAPI中间件实战:从基础到高级应用
本文深入探讨了FastAPI中间件的实战应用,从基础概念到高级技巧全面解析。通过示例代码详细展示了内置中间件(如CORSMiddleware、GZipMiddleware)的使用方法,并指导如何开发自定义中间件实现限流、响应格式化等功能。文章还分享了中间件执行顺序、性能优化和错误处理等最佳实践,帮助开发者高效构建安全、高性能的FastAPI应用。
【bitbake系列】高效调试:bitbake命令的进阶使用技巧
本文深入探讨了bitbake命令的进阶调试技巧,帮助开发者高效解决Yocto项目构建中的复杂问题。通过日志输出控制、环境变量探查、依赖关系可视化等实用方法,大幅提升构建问题的诊断效率。重点介绍了-v、-D、-e等关键参数的组合使用,以及任务执行控制和签名调试等高级技巧。
Windows Server 2022域控+NLB负载均衡全流程配置指南
本文详细介绍了Windows Server 2022环境下域控制器(Active Directory)与网络负载均衡(NLB)的完整配置流程。从域控基础架构搭建、证书服务配置到NLB集群创建与IIS集成,提供企业级高可用解决方案的实战指南,帮助IT管理员构建稳定可靠的业务支撑平台。
告别玄学连接:深度解析K210与MaixPy IDE通信背后的串口、驱动与固件机制
本文深度解析K210开发板与MaixPy IDE通信不稳定的根本原因,从CH552驱动安装、Windows COM端口分配到kflash_gui烧录参数选择,提供系统级解决方案。通过硬件排查和固件优化,帮助开发者彻底解决连接问题,提升开发效率。
【NoteExpress】样式库“失而复得”:从会员限制到本地化恢复的实战指南
本文详细介绍了如何通过NoteExpress 3.2清华大学授权版恢复本地化样式库,解决因会员权限失效导致的参考文献格式问题。文章提供了从版本选择、数据迁移到风险防控的完整实战指南,帮助用户高效管理学术文献,特别适合面临毕业论文死线的研究生群体。
变频+移相混合控制避坑指南:全桥LLC谐振变换器软开关失败的5个常见原因
本文深入分析了全桥LLC谐振变换器在变频+移相混合控制下软开关失败的5个常见原因,包括死区时间与谐振电流相位失配、模式切换瞬态震荡、驱动信号时序紊乱等。通过Simulink仿真案例和实测数据,提供了实用的解决方案和优化措施,帮助工程师避免设计陷阱,提升电源系统的可靠性和效率。
基于ICP算法的点云相机手眼标定实战(AX=XB方程解析)
本文详细解析了基于ICP算法的点云相机手眼标定实战,重点探讨了AX=XB方程的原理与实现。通过PCL库的应用,结合ICP算法进行点云匹配,有效解决相机与机械臂坐标系转换问题。文章包含参数调优、数学推导及实战代码,为工业自动化领域提供高效标定方案。
别再死记硬背了!用大白话+图解搞懂RDMA的Memory Region到底是个啥
本文通过钥匙和地图模型生动解析了RDMA中Memory Region的核心机制,包括地址映射、权限管理和内存锁定等关键技术。详细介绍了MTT表、L_Key与R_Key机制,并提供了性能优化策略和真实案例,帮助开发者高效应用RDMA技术提升分布式系统性能。
蓝桥杯单片机实战:PCF8591模数转换与电压监测
本文详细介绍了蓝桥杯单片机竞赛中PCF8591模数转换芯片的应用,包括其工作原理、硬件连接、I2C通信协议、ADC数据采集与处理技术。通过实战案例解析,帮助读者掌握电压监测系统的设计与实现,提升在单片机开发中的综合能力。
FPGA实战:用Verilog手把手教你设计24进制计数器(附7段数码管显示)
本文详细介绍了如何使用Verilog设计一个24进制计数器系统,并实现7段数码管显示。从开发环境搭建、Verilog编码、仿真验证到数码管驱动设计,提供了完整的实战教程和优化建议,帮助读者快速掌握FPGA数字电路设计技巧。
告别网页版卡顿!手把手教你用BLAST+在Ubuntu上搭建本地核酸比对流水线(附批量建库脚本)
本文详细介绍了如何在Ubuntu系统上搭建本地BLAST+核酸比对流水线,解决网页版BLAST卡顿问题。通过安装最新版BLAST+套件、优化存储配置、自动化建库脚本以及高性能参数调优,显著提升比对速度与效率。附带的批量建库脚本和实战技巧,帮助用户快速构建企业级分析流程。
CentOS 7 x86_64 系统下利用 QEMU 用户态模拟器运行 ARM64 Docker 镜像的实践与排错
本文详细介绍了在CentOS 7 x86_64系统下使用QEMU用户态模拟器运行ARM64 Docker镜像的实践方法。通过分析内核版本差异、配置binfmt_misc陷阱及提供两种实战解决方案(直接挂载和自定义镜像),帮助开发者解决跨架构兼容性问题。文章还包含常见错误排查指南和性能优化建议,特别适合物联网开发者在x86机器上调试ARM64应用。
从入门到实战:TypeScript 全栈开发核心指南
本文全面解析TypeScript全栈开发的核心技术与实战策略,涵盖环境配置、类型系统、前后端类型共享、数据库集成等关键环节。通过React+Express+TypeORM技术栈示例,展示如何实现端到端类型安全,提升大型项目的开发效率与维护性,特别适合从JavaScript迁移到TypeScript的开发者参考。
别再用通用数据集了!盘点2024年Hugging Face上那些宝藏级医学问答数据集(含下载链接)
本文精选2024年Hugging Face平台上12个高质量的医学问答数据集,涵盖医学推理、跨语言医学智能、生物医学前沿和医学教育等多个领域。这些数据集如NEJM_Reasoning和MedMCQA-CoT,不仅提供精准的医学逻辑和术语体系,还包含诊断思维链和多语言对齐,助力开发者构建专业的医疗AI系统。
已经到底了哦
精选内容
热门内容
最新内容
STM32(五):Systick精准延时实战(标准库函数)
本文详细介绍了STM32中Systick定时器的精准延时实现方法,重点解析了标准库函数下的寄存器配置与微秒级延时技巧。通过实战案例展示了如何利用Systick实现高精度延时,包括时钟树关联分析、多任务时间片管理等高级应用,帮助开发者提升STM32项目的时序控制精度。
Visual Studio环境下编译libredwg与libdxfrw的实战指南
本文详细介绍了在Visual Studio环境下编译libredwg与libdxfrw的实战指南,包括环境准备、源码获取、CMake配置技巧及常见问题解决方案。特别针对VS 2019及以上版本,提供了从依赖项处理到生成测试的全流程操作建议,帮助开发者高效完成编译工作。
从代码结构到实战策略:RoboCup 2D智能体架构深度解析
本文深入解析RoboCup 2D智能体的架构设计与实战策略,涵盖世界模型层、行为决策层和动作执行层的核心代码实现。通过动态角色分配、团队通信协议和定位球战术等关键技术模块,提升智能体在仿真足球比赛中的表现。文章还分享了视觉感知处理、体力管理模型和意图识别系统等优化方案,帮助开发者构建高效的RoboCup 2D智能体。
别再简单分离实部虚部了!用PyTorch手把手实现复数神经网络,搞定音频频谱处理
本文详细介绍了如何使用PyTorch实现复数神经网络,特别针对音频频谱处理场景。通过对比传统实数网络处理复数数据的缺陷,展示了深度复数网络(Deep Complex Networks)在保持复数运算规则上的优势,并提供完整的复数卷积、批归一化和激活函数实现代码。文章还分享了复数网络在音频分类任务中的实战技巧,包括数据预处理、训练策略和模型评估方法。
Unity AzureKinect Demo实战指南:从入门到精通
本文详细介绍了Unity与AzureKinect结合的开发实战指南,从基础配置到核心功能拆解,包括虚拟人偶控制、绿幕抠像、手势识别和点云数据应用。通过具体代码示例和避坑指南,帮助开发者快速掌握AzureKinect在Unity中的高级应用,提升交互式应用的开发效率。
高通平台Camera驱动适配:从XML配置到BIN文件生成
本文详细解析了高通平台Camera驱动适配的全过程,从XML配置文件到BIN文件生成的完整流程。重点介绍了Sensor XML、Module XML等关键配置文件的实战技巧,以及使用ParameterFileConverter工具进行转换的注意事项。文章还提供了常见问题排查指南和性能优化建议,帮助开发者高效完成Camera驱动适配工作。
QT Quick Qml 之property alias进阶:构建动态可配置的Repeater与Column布局组件
本文深入探讨了QT Quick Qml中property alias的高级应用,特别是在构建动态可配置的Repeater与Column布局组件时的实践技巧。通过实际案例展示了如何利用property alias实现组件内部与外部接口的解耦,提升代码复用性和灵活性。文章还分享了性能优化策略和常见陷阱,帮助开发者高效构建学生信息管理系统等复杂界面。
CiteSpace实战指南:从数据采集到可视化分析的完整流程
本文详细介绍了CiteSpace在科研数据分析中的应用,从数据采集到可视化分析的完整流程。通过CiteSpace的强大功能,研究者可以高效进行文献计量分析,生成直观的知识图谱,帮助识别研究热点和前沿趋势。文章还提供了数据清洗、参数设置和结果解读的实用技巧,适合需要提升科研效率的研究生和学者。
LDO芯片反向电流损伤?手把手教你用锗二极管保护电路(附实测数据)
本文详细解析了LDO芯片反向电流损伤问题,并提出采用锗二极管构建保护电路的解决方案。通过实测数据对比,展示了锗二极管在降低压降和分流反向电流方面的显著优势,帮助工程师有效预防LDO过流损伤,提升系统可靠性。
从Adam到AdamW:解耦权重衰减如何重塑大模型训练
本文深入探讨了从Adam到AdamW优化器的演进,解析了权重衰减解耦如何显著提升大模型训练效果。通过对比Adam和AdamW的数学原理及实际训练案例,揭示了AdamW在避免动量污染、自适应干扰和梯度混淆方面的优势,并提供了针对不同规模模型的AdamW配置策略和实战技巧。