ZTMR开发板+DHT11温湿度传感器入门:接线、代码与避坑指南
一直想给卧室做个温湿度显示翻出抽屉里吃灰的ZTMR开发板又花几块钱买了颗DHT11温湿度模块。这个搭配听起来朴素实际用下来却是我玩过的传感器组合里最能打的那种成本低、库成熟、成功率高。这篇文章就把从接线、装库到烧录读取的完整流程记录下来包括我反复踩过的坑适合第一次接触ZTMR的入门者也适合想用最小成本给普通项目加一个环境感知能力的同学。先说结论整套方案半小时能跑通难点不在代码而在接线和时序。很多人一上来就把模块插在面包板上编译烧录一气呵成结果串口永远打印255或-999最后只能一句“传感器坏了”草草收场。实际上DHT11没那么容易坏多数是供电不稳、上拉缺失或者读取频率太高。这篇文章会把这几个问题一次讲清楚。1. 为什么选择ZTMR搭DHT11从成本到生态的匹配1.1 什么是ZTMR开发板它和DHT11为什么投缘ZTMR是一种兼容类Arduino开发环境的板子常见于大学生创新项目和电子设计竞赛的备料清单。板型小巧引脚间距和标准面包板对齐用USB线就能供电和烧录串口监视器也能直接调程序。我手里这块是从二手平台淘来的表面丝印已经有点模糊但不影响使用这也是ZTMR最大的特点足够便宜坏了不心疼。DHT11是很多人接触的第一个数字温湿度传感器。它把温度、湿度两个物理量打包在一个塑料封装里通过单根数据线就能把测量结果传给主控芯片。相比模拟量传感器还要自己算电压和温度的关系DHT11的输出已经是数字格式主控读到的就是湿度百分比和温度值省掉大量换算工作。这两者配对的最大优势在于生态。ZTMR的开发环境支持Arduino生态的库和语法而DHT11的驱动库早在多年前就被社区反复打磨过时序细节全部封装好。你不需要理解微秒级的电平变化只需要调用几个函数就能拿到数据。对一个只想快速验证传感器好不好用的人来说这种“开箱即用”的体验极其重要。另外DHT11的功耗极低工作电流在0.5mA到2.5mA之间ZTMR的板载稳压芯片完全带得动不需要额外供电模块。所以整套系统只需要一根USB线避免了多路电源共地那些乱七八糟的问题。1.2 材料清单与选型模块比裸传感器省心十倍我用到的材料如下表所示基本都是手边现成的东西材料型号 / 规格备注主控板ZTMR开发板带USB线电脑能识别串口温湿度传感器DHT11模块蓝色PCB板上已集成上拉电阻和滤波电容连接线母对母杜邦线3根长度尽量控制在15cm以内面包板可选方便做临时测试不用焊万用表可选确认引脚通断避免接反这里强烈建议优先买“模块版”的DHT11而不是只有三只引脚的光裸传感器。裸传感器数据线上默认没有上拉电阻你必须自己在外面接一颗4.7k到10k的电阻到VCC否则大概率读数异常。模块版把上拉电阻、滤波电容都集成在板子上插上就能用差价最多一两块钱。对新手来说这一两块钱能省掉大量排查时间。1.3 第一件事先确认板子引脚和模块引脚版本ZTMR开发板不同批次之间丝印偶尔会有差异IO口编号不一定都在同一个位置。DHT11模块也一样蓝色板子的引脚顺序常见是VCC、DATA、GND但白色板子和某些杂牌版会把DATA放在最左边。所以拿到板子的第一件事不是插线而是对照丝印确认引脚。我习惯用万用表的通断档来验证一个表笔接模块的VCC脚另一个笔去量排针另一端如果蜂鸣器响了就说明这段是通的。至少确认VCC和GND引脚是真实的而不是靠颜色猜。否则一旦接反模块通电后会发烫几次下来就会彻底烧掉。2. 硬件接线细节供电、上拉与信号线的三个关键选择2.1 完整的接线对应关系我的接法是直接用母对母杜邦线把ZTMR和DHT11模块连起来不经过面包板减少中间接触电阻。对应关系如下ZTMR引脚DHT11模块引脚3.3VVCCGNDGNDD2GPIO2DATA为什么选D2当作数据口因为它是一个普通数字IO不占用串口也不影响板载功能。不要选择D4这种经常和板载LED绑定的引脚因为在后台上电初始化时可能产生额外电平变化干扰或引发电平竞争。2.2 3.3V还是5V电平兼容比“手册能接受”更重要很多DHT11模块的说明书写着“供电3.3V到5.5V”所以部分教程直接让你接5V。单独看模块5V确实没问题但回到整套系统里事情就变了。ZTMR的GPIO高电平是3.3V如果模块VCC接5V数据线返回的高电平也是5V。虽然很多芯片引脚标称“5V容忍”可长期运行或者引脚驱动能力不足时这种电平差会给主控带来额外压力有的板子甚至会程序跑飞。我的建议是统一用3.3V供电。实测下来3.3V下DHT11的温度读数和5V没有明显差异湿度读数的跳变也在传感器本身的误差范围内。负责一点说这样做对主控引脚最友好也能避免一些莫名其妙的烧录失败。2.3 上拉电阻没有它数据线就是一条“悬空线”DHT11用的是单总线协议数据线在空闲时必须被上拉到高电平。主机发起通信时把总线拉低让传感器感知到起始信号传感器响应后再通过不同宽度的电平脉冲回传数据。如果数据线悬空电平会被环境噪声干扰主控可能完全收不到传感器的应答信号。模块版DHT11板上已经有一颗上拉电阻但如果你用杜邦线延长到20cm以上线间电容变大电平边沿会被拖慢偶发读取失败会明显增加。这种情况下最稳妥的做法是在靠近模块一侧的DATA引脚再并联一颗4.7k到10k上拉电阻到VCC。不需要精确阻值常见10k即可。我第一次做项目时用了一根40cm的杜邦线数据读取十次能成功八次后来加上拉电阻后变成十次全通这个改善很直观。2.4 接线顺序与一次烧坏传感器的教训接线顺序是先接GND再接VCC最后接DATA。这个顺序的本质是要求地线先建立共同参考电位避免接上电源瞬间造成浪涌电流冲击。我之前贪图方便把母对母杜邦线全部插好再统一上电结果有一次模块VCC和GND接反USB一插上手指摸到模块表面已经烫手。等反应过来拆线时传感器已经彻底报废温度湿度永远输出0。那之后我才养成了“先接地后接电源信号线最后插”的习惯。另外一个容易忽略的点是拆线之前必须先拔USB线。杜邦线插拔过程中如果板子是通电状态一根线同时搭到两个引脚会造成短路。几块钱的模块倒还好把ZTMR板的USB串口芯片弄坏就得不偿失了。3. 读取代码背后的单总线协议以及为什么直接用库更实在3.1 40位数据是怎么传回来的DHT11的通信流程可以类比成两个人对话主机先喊一声“喂”具体动作是把数据线拉低至少18ms然后松开并释放总线。传感器接到这个足够长的低电平信号后会自己把总线拉低80us再释放80us作为“我听到了”的应答。接着传感器开始连续发送40位二进制数据。这40位数据由五部分组成湿度整数、湿度小数、温度整数、温度小数、校验和。每个字节8位高位在前。例如湿度62%、温度26℃时原始二进制是“00111110 00000000 00011010 00000000 01001000”。前四个字节相加取低8位恰好等于第五字节校验和的00101000实际最后一位校验值会补到一致。这就是为什么读取结果不需要你去解码因为库已经帮你完成了解析。每一位的读法也非常原始传感器用高电平持续的时间来表示0还是1高电平约26us算0约70us算1。这个差别在微秒级普通delay()函数无法精确定时必须用库或者中断来操作。3.2 环境准备内核安装和DHT驱动库ZTMR在Windows电脑上使用需要先安装串口驱动然后把板卡支持包放进开发环境里。这个过程不复杂但容易卡在“找不到开发板”这一步。打开开发环境里的开发板管理器搜索对应内核并安装完成后在开发者选项里就能选中ZTMR对应的型号。DHT11的驱动我推荐直接用社区维护的DHT sensor library它依赖一个统一传感器库来管理数据单位。千万别图省事下载那种老旧的单文件库虽然也能读但代码风格和错误处理都很弱后续想扩展其他传感器时会很痛苦。在开发环境的库管理器中搜索“DHT sensor library”安装后它会自动提示你安装依赖库选择安装即可。安装完成后新建一个工程把下面的代码粘贴进去。3.3 完整示例代码与逐行解读下面这段代码是我实测可用的版本简单到可以当作模板反复使用#include DHT.h #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); Serial.println(F(ZTMR DHT11 start)); dht.begin(); } void loop() { // DHT11采样周期约1秒读取频率不要过快 delay(2000); float h dht.readHumidity(); float t dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println(F(DHT11 read failed)); return; } Serial.print(F(Humidity: )); Serial.print(h); Serial.print(F(% Temperature: )); Serial.print(t); Serial.println(F(C)); }逐行拆解一下关键点#include DHT.h引入驱动库。#define DHTPIN 2定义数据脚为D2和接线一一对应。DHT dht(DHTPIN, DHTTYPE);创建传感器对象传入引脚号和类型。dht.begin();初始化传感器。dht.readHumidity()和dht.readTemperature()是核心读取函数内部完成起始信号、应答、解码、校验的全流程。isnan()判断返回值是否是非数字如果读到NaN说明这次通信失败直接跳过本次打印避免后续运算出错。这个串口波特率我用的是115200如果你用的是9600记得把右上角串口监视器的速率也改成9600否则打印出来全是乱码。3.4 连续读取为什么必须至少间隔2秒DHT11的数据手册明确写着“采样周期为1秒”。这意味着传感器每秒钟最多完成一次温湿度测量如果你在极短时间内发起多次读取传感器来不及完成新一轮采样就会回传上一次甚至是一堆无效数据。实际表现是第一次读取正常第二次开始偶发返回255或者一直卡在同一个值上不动。后来我在代码里加了两秒间隔问题基本消失。如果你在loop里看到失败率极高除了检查间隔还要看看是不是其他地方占用了data引脚。比如调试时把信号线插到了D4而板载LED初始化时把这个脚拉高传感时序就会被破坏。最典型的症状是第一天能读第二天换了引脚后偶尔能读第三次重启又彻底失败。这类问题的根源都在物理连接而不是代码逻辑。4. 上电实测串口输出、失败排查与数据校准4.1 成功输出什么样失败输出什么样编译烧录成功后打开串口监视器正常情况大约每两秒输出一行ZTMR DHT11 start Humidity: 62.00% Temperature: 26.00C Humidity: 62.00% Temperature: 26.00C Humidity: 63.00% Temperature: 26.00C失败时则可能是DHT11 read failed Humidity: 255.00% Temperature: -999.00C其中255是最具迷惑性的失败现象因为它是DHT11输出字节全1时对应的值。这种情况通常是数据线电平没有被正确识别导致每位都被误读成高电平。而-999则来自库函数在解析失败时的返回值代表无效数据。4.2 排查顺序从物理层到协议层的检查清单我一次遇到过“前十分钟正常之后开始不断失败”的情况折腾了很久才发现是杜邦线插针氧化导致接触不良。所以排查不能只看代码必须按顺序走一遍先看模块是否发热。发热说明VCC和GND接反立即断电。用万用表测模块VCC脚和GND脚之间的电压应该接近3.3V或5V如果低于3V换一根USB线或者换电脑USB口。检查DATA引脚是否确实连着ZTMR的D2用通断档量一下杜邦线两端是否导通。把杜邦线长度减到最短如果用了面包板检查面包板内部接触是否可靠。确认代码中DHTPIN和实际接线引脚相同这个错误很低级但出现率很高。把delay(2000)改成delay(3000)再试一次排除采样周期不足的问题。这套顺序覆盖了从供电、连接、到协议时序的全部可能。实践下来能把95%的失败问题定位出来。4.3 在代码里加一道数据合理性过滤即使库内部做过校验我还是建议在业务代码里加一层“数据合理性过滤”因为嵌入式环境里什么都可能被干扰。比如这样if (h 0.0 || h 100.0 || t -20.0 || t 60.0) { Serial.println(F(data out of range, discard)); return; }湿度不可能超过100%温度在一般室内也不会低于-20℃或高于60℃。一旦读到超范围值宁可直接丢弃这一帧也不要让这个脏数据进入后续逻辑。用在自动风扇、加热器控制这类项目里时这一层过滤尤其重要否则一个错误读数就可能让继电器疯狂切换。另外DHT11的返回值看起来是浮点数其实分辨率只有1%。也就是说你看到26.00C实际值可能是25.x℃或26.x℃这是传感器本身的设计不是程序出bug。4.4 误差认识DHT11不是精密仪器DHT11的温度精度是±2℃湿度精度是±5%RH放在实验室计量场景里完全不够看。它最大的价值是给智能家居、环境监测这类场合提供一个“大概对”的参考值比如室温是25℃还是30℃空气是干还是潮。我用它做过一个小型温湿度记录仪连续记录72小时后和旁边另一块工业级传感器对比温差最多2.5℃湿度差最多7%而且数值波动肉眼可见。如果你的项目要求精准到小数点后一位或者要用于科学实验请直接换DHT22或SHT30。但如果你只是做入门验证DHT11的误差完全可以接受没必要为了“更准”而纠结。5. 让数据更有用OLED显示、远程上报与后续扩展5.1 加一个0.96寸OLED显示卡片串口看数据终究不方便尤其是在做桌面小摆件时我更愿意接一块0.96寸OLED屏幕把温湿度直接显示出来。OLED的SCL和SDA两个引脚分别接到ZTMR的I2C引脚上一般为D1和D2不同板子定义不同需要看官方引脚图。驱动OLED需要对应的显示库在库管理器里搜“SSD1306”安装即可。显示逻辑也不难先初始化屏幕然后在loop里清屏、设置文本大小、打印温湿度最后调用显示接口刷新。整个过程跑通后一个独立的桌面温湿度计就诞生了成本依旧控制在20元以内。5.2 把温湿度送进局域网做自动化触发如果你的ZTMR型号带有网络功能或者你另外接了一块网络透传模块那就可以做更有意思的事情把温湿度数据通过HTTP或MQTT协议上报到局域网内的服务端再在服务端设定自动化规则。我最常做的场景是当室内温度超过设定阈值时自动打开风扇或启动加湿器。把阈值判断放在主控端做不用依赖云端断网也能正常工作。上报频率也不需要每2秒一次通常30秒到1分钟一次就够了既省电又不会把服务端日志刷爆。需要注意网络请求是耗时操作千万不要在loop里直接每2秒发一次否则下一次DHT11读取会被阻塞导致数据采集时序被打乱。推荐把传感器读取和网络上报拆成两个时间段比如传感器每2秒读一次并缓存最新值网络部分每30秒上报一次缓存值。5.3 换DHT22还是直接上SHT30我的选择顺序很多人问DHT11玩明白之后下一步该玩什么我的建议是看钱包和需求。如果想继续用单总线只是要求温度小数位和湿度精度更高可以换DHT22。它的引脚定义和DHT11基本兼容代码只需把DHTTYPE改成DHT22大部分接线不用动迁移成本极低。如果想直接进入工业级那我推荐SHT30或BME280这类I2C接口传感器。I2C的通信逻辑比单总线稳得多库也成熟而且BME280还能顺便测气压。但代价是接线从一根数据线变成两根代码也要换一套API学习成本稍高。以我个人的经验DHT11适合用来理解“传感器驱动到底是怎么回事”等你对时序、上拉、读取频率这些概念都有了直观感受再去碰I2C设备会非常轻松。直接把DHT11抬到SHT30反而会因为跳过太多底层概念遇到问题无从下手。最后分享一个我后来一直沿用的细节DHT11不要紧贴ZTMR板载稳压芯片放置否则你测到的温度会稳定偏高几度。我最初把传感器直接用杜邦线插在板子旁边读出来26℃但房间空调显示24℃一量板子上散热区温度已经接近30℃。后来把传感器用一根短线引开固定读数才正常。这个细节虽然小但做桌面温湿度计这类项目时很关键希望对你有用。

相关新闻

Ubuntu上从零搭建Django开发环境:虚拟环境、项目初始化与配置实战

Ubuntu上从零搭建Django开发环境:虚拟环境、项目初始化与配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:25:00 阅读更多 →
PY32F002A极限压榨:定时器分时调度实现焊机数字电压表

PY32F002A极限压榨:定时器分时调度实现焊机数字电压表

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:24:00 阅读更多 →
Java面向对象进阶:类名接口参数、内部类与常用API实战解析

Java面向对象进阶:类名接口参数、内部类与常用API实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:24:00 阅读更多 →

最新新闻

从源码编译GMSSL:国密算法支持与HTTPS链接调试实战

从源码编译GMSSL:国密算法支持与HTTPS链接调试实战

1. 从源码到动态库:为什么选择自己编译GMSSL很多人第一次接触国密算法开发时,第一反应是找现成的二进制包或者系统自带的包管理器直接安装。这个思路在大多数场景下没问题,但一旦涉及国密算法,情况就完全不一样了。GMSSL作为国内广…

2026/10/15 2:46:27 阅读更多 →
SpringBoot+Vue学院管理系统开发实战

SpringBoot+Vue学院管理系统开发实战

1. 项目概述与适用场景这个基于SpringBootVue技术栈的学院个人信息管理系统,是典型的教学级全栈开发项目。我在高校信息化部门工作期间,曾主导开发过类似系统,也指导过多名学生完成此类毕业设计。这类系统之所以成为热门选题,关键…

2026/10/15 2:46:27 阅读更多 →
SpringBoot+Vue高校医务室预约管理系统设计与实践

SpringBoot+Vue高校医务室预约管理系统设计与实践

1. 项目背景与核心价值高校医务室作为校园健康保障的第一道防线,长期面临着就诊高峰期排队混乱、病历管理低效、健康数据分散等痛点。这个基于SpringBootVue的预约管理系统,正是为了解决这些实际问题而设计的数字化解决方案。我在参与某高校医疗信息化改…

2026/10/15 2:46:27 阅读更多 →
医疗陪诊小程序开发:功能架构与技术实现详解

医疗陪诊小程序开发:功能架构与技术实现详解

1. 陪诊小程序的市场需求与产品定位医疗陪诊服务正在成为城市生活中的刚需。根据我过去三年参与医疗信息化项目的经验,独居老人、术后康复患者、异地就医人群构成了核心用户群体。这类用户往往面临"挂号难""流程陌生""行动不便"三大痛…

2026/10/15 2:46:27 阅读更多 →
KingdeeERP插件开发实战:从入门到精通

KingdeeERP插件开发实战:从入门到精通

1. 项目概述KingdeeERP作为国内主流的企业管理软件,其插件开发能力为系统功能扩展提供了强大支持。作为一名在ERP领域深耕多年的开发者,我见证了从K/3到Cloud版本的技术演进过程。插件开发不仅仅是简单的功能叠加,更是对企业业务流程的深度定…

2026/10/15 2:46:27 阅读更多 →
Flutter 欢迎页实战:用 intro_slider 构建引导页并实现「只显示一次」的路由跳转(Flutter-Notebook slider_screen 示例解析)

Flutter 欢迎页实战:用 intro_slider 构建引导页并实现「只显示一次」的路由跳转(Flutter-Notebook slider_screen 示例解析)

示例工程移动开发 【免费下载链接】Flutter-Notebook FlutterDemo合集,今天你fu了吗 项目地址: https://gitcode.com/gh_mirrors/fl/Flutter-Notebook 点击查看 免费下载 本文以 Flutter-Notebook 仓库中 mecury_project/example/slider_screen 示例为核…

2026/10/15 2:45:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →