公司动态
基于ESP32与GM管的桌面辐射监测仪DIY:硬件选型、低功耗设计与墨水屏显示
1. 项目缘起从好奇到桌面上的“守护者”几年前我在整理一个旧仓库时翻出了一些老旧的仪器和零件其中就包括一个苏联时期的盖革计数器。虽然它早已无法工作但那个标志性的“咔哒”声和闪烁的氖灯却勾起了我强烈的好奇心。我们生活在一个充满辐射的世界里从宇宙射线到脚下的花岗岩从香蕉里的钾-40到医疗X光检查辐射无处不在。虽然日常剂量微乎其微但了解身边环境的“背景音”总是一件有趣且略带科幻感的事情。市面上的成品盖革计数器要么是专业的工业仪表价格不菲且功能单一要么是玩具级别的产品精度和可靠性存疑。作为一个喜欢动手的硬件爱好者我萌生了一个想法为什么不自己做一台呢而且它不应该只是一个冰冷的测量工具更应该是一件能融入日常环境的桌面摆件像一只安静的“电子宠物”默默地告诉你周围世界的“心跳”。于是这个“桌面辐射探测摆件”的项目诞生了。它的核心目标很明确利用现成的盖革计数器模块和微控制器打造一个能持续监测环境辐射剂量率、并将数据以直观美观的方式显示出来的装置。它要足够安静物理上、足够省电并且拥有一个极具辨识度的复古或极客风格的“脸”——一块低功耗的墨水屏。最终我选择了ESP32作为大脑GM管盖革计数器模块作为感官2.13英寸墨水屏作为交互界面。这不仅仅是一个技术实现更是一次将科学探测、硬件DIY和桌面美学结合起来的尝试。无论你是对辐射物理感兴趣的极客还是想给工作台增添一个独特话题物件的创客这个项目都能带来十足的乐趣和成就感。2. 核心部件选型与原理浅析要搭建这样一个摆件我们需要理解几个核心部件是如何工作的以及为什么我做出了这样的选择。这不仅仅是“用什么”更是“为什么用这个”。2.1 盖革-米勒管捕捉不可见的粒子项目的核心传感器是盖革-米勒管俗称GM管。它是一个密封的玻璃或金属管内部充有惰性气体和少量猝灭气体如乙醇、卤素并设有两个电极中心的金属丝阳极和管壁的阴极。它的工作原理基于气体电离放大效应。当高能辐射粒子如α、β、γ射线穿过管壁进入内部时会与气体分子碰撞将其电离产生正离子和自由电子。在管子两端施加的高压电场通常为400-900V作用下这些初级电离产生的电子会被加速飞向阳极。在飞行途中它们会获得足够高的能量去碰撞更多的气体分子产生“雪崩式”的次级电离。这个过程在瞬间产生大量电子涌向阳极形成一个可被电路检测到的脉冲电流。每一个被探测到的辐射粒子就会产生这样一个电脉冲。注意GM管对不同类型的辐射灵敏度不同。常见的卤素管如J305βγ型对β和γ射线敏感但几乎无法探测α粒子因为α粒子穿透力太弱无法穿过管壁。如果需要探测α需选用云母窗极薄的专用α管。我选用的模块通常已经集成了GM管、必要的高压发生电路将电池的3.3V/5V升至GM管所需的高压以及脉冲整形电路。模块的输出端就是一个简单的数字脉冲信号平时为高电平每当探测到一个辐射粒子就输出一个短暂的低电平脉冲。我们的微控制器只需要计数这些脉冲即可。2.2 ESP32为何是它而非Arduino或树莓派主控的选择至关重要。Arduino Uno简单易用但性能有限缺乏高效的无线功能和深度睡眠管理不适合需要长期在线或复杂显示的项目。树莓派 Zero功能强大但运行完整的Linux系统功耗较高作为24小时运行的摆件不够“优雅”且有点杀鸡用牛刀。ESP32成为了近乎完美的选择原因如下双核与丰富外设拥有两个240MHz的核心处理脉冲计数和驱动墨水屏绰绰有余。内置Wi-Fi和蓝牙为未来扩展如数据上传到云端、手机通知预留了可能。超低功耗管理ESP32的深度睡眠模式电流可低至10μA左右。我们可以设计让ESP32大部分时间处于深度睡眠仅由GM管模块的脉冲通过外部中断唤醒进行一次计数后再次休眠。这对于使用电池或USB长期供电的摆件来说是维持“永久”运行的关键。完善的生态系统无论是使用Arduino框架还是乐鑫官方的ESP-IDF都有海量的库和社区支持驱动墨水屏、处理数据都非常方便。成本与体积价格低廉开发板尺寸小巧易于集成到最终外壳中。2.3 墨水屏静态显示的绝配为什么不用更常见的OLED或LCD因为我们的摆件显示的数据变化很慢辐射剂量率通常以分钟为单位变化但需要一直显示。OLED虽然漂亮但长期静态显示有烧屏风险且始终亮屏功耗较高。电子墨水屏完美解决了这个问题双稳态特性只在刷新画面时耗电显示静态内容时零功耗。这意味着我们的摆件可以始终展示信息而不用担心电量被屏幕耗尽。类纸质感视觉效果柔和不发光非常适合作为桌面摆件即使在夜间也不会造成光污染。它能赋予项目一种独特的复古或极简美学。可视角度广几乎180度从桌面的任何角度都能看清。我选择了2.13英寸的款式分辨率通常为250x122。这个尺寸足够显示剂量率、累计计数、历史曲线简图或一些装饰性元素同时又不会让整个摆件显得笨重。驱动这类屏幕通常需要SPI接口ESP32完全支持。3. 硬件电路设计与连接详解有了核心部件接下来就是如何将它们正确地连接起来并考虑电源、省电等实际工程问题。下图展示了系统的基本连接框图[系统连接框图] ------------------- ------------------- ------------------- | | 脉冲 | | SPI | | | 盖革计数器模块 |---------| ESP32 |---------| 2.13墨水屏 | | (GM Tube HV) | (GPIO) | (主控制器) | (GPIO) | (显示单元) | | | | | | | ------------------- ------------------- ------------------- ^ ^ ^ | | | | | | | -------------- | | | | | | -----v----- -----v----- | | | | | | | | | 5V Vin | | 3.3V/5V | | ---------------- 电源模块 --- 供电 -------------- | (可选) | | | ----------- -----------3.1 电源方案与功耗权衡整个系统的功耗主要来自三部分ESP32、盖革计数器模块的高压电路、墨水屏刷新。盖革计数器模块其高压电路持续工作电流通常在几毫安到十几毫安之间这是无法避免的持续功耗。墨水屏仅在刷新时耗电瞬间电流可达几十毫安静态显示时为零。ESP32这是功耗优化的关键。为了最大化续航如果使用电池或实现真正的“插电永动”必须优化ESP32的功耗。我的方案是使用ESP32的深度睡眠模式将ESP32配置为定时唤醒例如每10秒或由外部中断唤醒。利用GM管脉冲作为外部中断源将GM模块的脉冲输出引脚连接到ESP32的一个支持外部中断的GPIO如GPIO4。在软件中将该引脚设置为下降沿触发中断。ESP32进入深度睡眠后任何一次辐射粒子被探测到产生的脉冲下降沿都会将ESP32唤醒。唤醒后的工作流程唤醒后ESP32在中断服务程序里对一个计数器变量进行累加然后立即重新进入深度睡眠。这个过程极短平均功耗可以做得非常低。定时刷新显示我们不能每次计数都刷新墨水屏刷新耗时且耗电。可以设置另一个定时器每累积到一定时间如60秒或一定脉冲数后ESP32从深度睡眠中定时唤醒计算过去一段时间的平均剂量率更新屏幕显示然后再次休眠。电源输入建议采用Micro USB接口供电电压为5V。ESP32开发板如NodeMCU、Wemos D1自带稳压电路可将5V转为3.3V供自身和墨水屏使用。盖革计数器模块通常也支持5V输入。这样只需一根手机充电线就能让摆件长期工作。3.2 具体的引脚连接表以下是一个基于常见ESP32开发板如ESP32 DevKitC V4和通用2.13英寸墨水屏使用GDEW0213Z16驱动芯片的连接示例。请务必根据你手中模块的具体数据手册进行核对。ESP32 GPIO引脚连接至备注GPIO4盖革计数器模块PULSE/OUT引脚关键连接。用于检测辐射脉冲配置为输入下拉下降沿中断。GPIO18 (SCK)墨水屏SCK/CLKSPI时钟线。GPIO23 (MOSI)墨水屏MOSI/DINSPI数据线主出从入。GPIO5墨水屏CS/SSSPI片选低电平有效。GPIO17墨水屏DC/D/C数据/命令选择引脚。高电平为数据低电平为命令。GPIO16墨水屏RST复位引脚低电平复位。GPIO2墨水屏BUSY忙状态引脚。高电平表示屏幕忙不可发送指令。GND盖革计数器模块GND 墨水屏GND共地所有模块的GND必须连接在一起。5V / VIN盖革计数器模块VCC(5V)为GM模块高压电路供电。3.3V墨水屏VCC(3.3V)为墨水屏逻辑电路供电。注意屏幕的电源电压有的是3.3V有的是5V。实操心得在焊接或使用杜邦线连接前最好先用万用表确认一下墨水屏的电源电压要求。我曾烧坏过一块屏幕就是因为想当然地接了5V而它实际需要3.3V。ESP32的3.3V输出引脚电流有限通常~500mA如果驱动较大的屏幕感觉不稳定可以考虑从5V输入处接一个独立的3.3V稳压模块给屏幕供电。3.3 脉冲信号处理与抗干扰GM模块输出的脉冲非常短暂微秒级且可能伴随一些毛刺。直接接入中断可能会引入误计数。一个简单的硬件滤波可以大幅提升稳定性在GM模块的脉冲输出引脚和ESP32的GPIO之间串联一个1kΩ的电阻。在ESP32的GPIO引脚与地GND之间连接一个10nF ~ 100nF的陶瓷电容。 这构成了一个简单的RC低通滤波器可以吸收掉高频噪声确保只有真正的GM管脉冲才能触发中断。4. 软件逻辑与代码实现解析硬件搭好了接下来是赋予它灵魂的软件部分。我们将使用Arduino框架进行开发因为它库丰富上手快。整个软件逻辑围绕“低功耗中断计数”和“墨水屏驱动”展开。4.1 基础计数与剂量率计算首先我们需要定义关键变量和中断服务函数。// 引脚定义 #define GM_PIN 4 // 盖革管脉冲引脚 #define uSv_per_Count 0.00812 // 一个脉冲对应的剂量率系数需校准 volatile unsigned long pulseCount 0; // 中断内计数的变量必须用volatile修饰 unsigned long lastMillis 0; unsigned long lastPulseCount 0; float doseRate_uSv_h 0.0; // 当前剂量率单位微西弗/小时 // 中断服务程序尽可能短 void IRAM_ATTR GM_Impulse() { pulseCount; } void setup() { Serial.begin(115200); pinMode(GM_PIN, INPUT_PULLDOWN); // 启用内部下拉电阻避免悬空 attachInterrupt(digitalPinToInterrupt(GM_PIN), GM_Impulse, FALLING); // 下降沿触发 lastMillis millis(); // 初始化墨水屏... initDisplay(); // 显示启动画面... } void loop() { unsigned long currentMillis millis(); unsigned long elapsedTime currentMillis - lastMillis; // 每10秒计算一次剂量率 if (elapsedTime 10000) { noInterrupts(); // 临时关闭中断安全地读取计数 unsigned long currentPulseCount pulseCount; interrupts(); unsigned long deltaCount currentPulseCount - lastPulseCount; // 剂量率 (脉冲数 / 时间(小时)) * 转换系数 // 时间单位转换毫秒 - 小时 (elapsedTime / 1000.0 / 3600.0) doseRate_uSv_h (deltaCount / (elapsedTime / 1000.0 / 3600.0)) * uSv_per_Count; lastPulseCount currentPulseCount; lastMillis currentMillis; Serial.print(Counts: ); Serial.print(deltaCount); Serial.print( | Dose Rate: ); Serial.print(doseRate_uSv_h, 4); Serial.println( uSv/h); // 每60秒更新一次屏幕避免频繁刷新 static unsigned long lastDisplayUpdate 0; if (currentMillis - lastDisplayUpdate 60000) { updateDisplay(doseRate_uSv_h, currentPulseCount); lastDisplayUpdate currentMillis; } } // 这里可以添加深度睡眠逻辑替代 delay // esp_sleep_enable_timer_wakeup(10 * 1000000); // 睡眠10秒 // esp_deep_sleep_start(); }关键点解析volatile在中断中修改的全局变量pulseCount必须在声明时加上volatile关键字防止编译器优化导致读取错误的值。IRAM_ATTR中断服务函数应放入IRAM指令RAM中以确保即使Flash缓存被禁用时如深度睡眠唤醒初期也能立即执行。剂量率转换系数 (uSv_per_Count)这是整个系统校准的关键。这个系数取决于你使用的具体GM管型号其灵敏度和电路设计。通常模块供应商会提供一个参考值如0.00812 uSv/h per CPM即每分钟计数对应的剂量率。最准确的校准方法是在已知辐射场如一个微弱的放射源旁或与经过校准的专业仪表对比中进行比对计算。系数 已知剂量率 / 测量到的平均计数率。计数与时间剂量率是单位时间的计数。我们计算一段时间内的计数增量再除以这段时间换算为小时得到计数率最后乘以转换系数得到剂量率。4.2 驱动墨水屏显示信息驱动墨水屏需要专门的库。对于常见的GDEW系列屏幕可以使用GxEPD2库它支持广泛。首先在Arduino库管理中安装GxEPD2。#include GxEPD2_BW.h // 黑白屏驱动 #include Fonts/FreeMonoBold9pt7b.h // 字体 // 根据你的屏幕型号定义对象例如2.13英寸的GDEW0213Z16 GxEPD2_BWGxEPD2_213_Z16, GxEPD2_213_Z16::HEIGHT display(GxEPD2_213_Z16(/*CS*/5, /*DC*/17, /*RST*/16, /*BUSY*/2)); void initDisplay() { display.init(); display.setRotation(1); // 根据你的安装方向调整旋转角度 display.setTextColor(GxEPD_BLACK); display.setFullWindow(); } void updateDisplay(float doseRate, unsigned long totalCount) { display.firstPage(); do { display.fillScreen(GxEPD_WHITE); // 绘制标题/装饰 display.setFont(FreeMonoBold9pt7b); display.setCursor(10, 20); display.print(Radiation Monitor); // 显示核心数据剂量率 display.setFont(FreeMonoBold18pt7b); display.setCursor(30, 70); display.print(doseRate, 3); // 显示3位小数 display.setFont(FreeMonoBold9pt7b); display.print( uSv/h); // 显示累计计数 display.setFont(FreeMonoBold9pt7b); display.setCursor(10, 110); display.print(Total: ); display.print(totalCount); // 可以添加一个简单的状态指示例如根据剂量率改变文字 display.setCursor(10, 140); if (doseRate 0.15) { display.print(Status: Normal); } else if (doseRate 0.5) { display.print(Status: Elevated); } else { display.print(Status: High); } // 甚至可以画一个简单的条形图或历史曲线需要存储历史数据 // drawSimpleBar(doseRate); } while (display.nextPage()); // 更新完成后屏幕进入休眠以省电 display.hibernate(); }updateDisplay函数在需要更新屏幕时被调用。它首先清空屏幕然后分区域绘制文本信息。你可以充分发挥创意设计布局比如添加一个模拟仪表盘、历史趋势迷你图或者更艺术化的辐射符号图案。4.3 实现超低功耗深度睡眠模式为了实现真正的桌面摆件可能用电池供电我们需要将上面的loop()中定期唤醒的逻辑改为由定时器和GM管脉冲双重触发的深度睡眠模式。这能大幅降低功耗。RTC_DATA_ATTR unsigned long bootCount 0; // 存储在RTC内存深度睡眠后保持 RTC_DATA_ATTR unsigned long totalPulseCount 0; // 存储在RTC内存 #define TIME_TO_SLEEP 30 // 屏幕刷新间隔秒 #define PULSE_PIN GPIO_NUM_4 void setup() { Serial.begin(115200); delay(1000); // 给串口一点启动时间 Serial.println(Boot number: String(bootCount)); // 1. 初始化屏幕并显示仅唤醒后第一次 initDisplay(); updateDisplayFromRTC(); // 从RTC数据计算并显示剂量率 // 2. 配置唤醒源 // 源1: 外部中断GM管脉冲 esp_sleep_enable_ext0_wakeup(PULSE_PIN, 0); // 0 低电平唤醒 // 源2: 定时器定期刷新屏幕 esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * 1000000); // 微秒 Serial.println(Going to sleep now...); Serial.flush(); // 3. 进入深度睡眠 esp_deep_sleep_start(); } void loop() { // 深度睡眠模式下loop永远不会执行 } // 中断服务程序在深度睡眠被脉冲唤醒时执行 void IRAM_ATTR GM_Impulse() { totalPulseCount; // 直接增加RTC数据区的计数 } void updateDisplayFromRTC() { // 这里需要一种方法来计算“上次刷新到现在的剂量率” // 一种方法是在进入睡眠前记录时间和计数到RTC // 唤醒后读取当前计数与上次记录的值比较计算剂量率 // 由于涉及时间记录代码稍复杂但原理同上文剂量率计算 // 显示更新逻辑与之前相同 }深度睡眠逻辑解析RTC_DATA_ATTR将关键变量存储在ESP32的RTC慢速内存中这部分内存在深度睡眠下仍能保持数据。双重唤醒源esp_sleep_enable_ext0_wakeup: 配置GM管脉冲引脚为唤醒源。当脉冲到来引脚变低ESP32立即唤醒。在唤醒后的setup()中我们可以通过检查唤醒原因来判断是哪种唤醒并执行相应操作如增加计数。esp_sleep_enable_timer_wakeup: 配置定时唤醒用于定期更新屏幕显示。工作流ESP32上电或唤醒后执行setup()更新屏幕然后立即配置唤醒源并再次进入深度睡眠。loop()函数为空。绝大部分时间芯片都在深度睡眠中只有RTC模块和GM管模块在工作整机功耗可以降到非常低的水平毫安级甚至更低。踩坑实录在实现深度睡眠时我最初忘记将totalPulseCount变量用RTC_DATA_ATTR修饰导致每次唤醒后计数都被清零。另外ext0唤醒只支持特定的RTC GPIO引脚如GPIO0, 2, 4, 12-15, 25-27, 32-39务必确认你使用的脉冲引脚是其中之一。5. 外壳设计与制作从电路板到艺术品硬件和软件都跑通了但一堆裸露的电路板显然不适合放在桌面上。一个好的外壳不仅能保护电路更是决定这个摆件“颜值”和“气质”的关键。5.1 设计理念与材料选择我的设计目标是复古科技感同时要便于观察屏幕和更换电池如果使用电池。材料我选择了3mm厚的亚克力板。它易于激光切割透明度高可以展示内部电路营造一种“窥探科技内核”的感觉。你也可以选择木材温暖质感、金属工业风或者3D打印树脂造型自由。结构采用经典的“三明治”结构——前板、中间隔层、后板用铜柱和螺丝固定。中间隔层为电路板和电池仓留出空间。屏幕开窗前板需要为墨水屏开出精确的窗口。务必在设计中留出比屏幕可视区稍大一点的边框用于遮挡屏幕边缘。通风与安全虽然GM管需要接触空气但外壳不能完全密封以免高压部分积热或产生异味。可以在顶部或底部设计一些装饰性的散热孔。务必确保所有高压部分GM管本身、高压电路被良好绝缘无法被用户直接触碰。5.2 利用激光切割实现设计我使用Fusion 360进行建模然后导出DXF文件用于激光切割。设计时需要注意尺寸精确用游标卡尺精确测量ESP32开发板、GM模块、墨水屏、电池如18650的尺寸和安装孔位。装配关系考虑好各层板的顺序。通常顺序是前板带屏幕窗口 - 屏幕 - 中间隔层固定电路板 - 电路板 - 后板带电源接口孔和开关孔。走线空间在中间隔层设计走线槽让杜邦线或导线可以整齐地穿过避免挤压。标签与装饰可以在前板上用激光雕刻一些文字如“RADIATION MONITOR”、单位“µSv/h”、辐射警示标志等增加专业感和趣味性。将设计好的DXF文件交给激光切割机几分钟后所有亚克力部件就切割完成了。用砂纸轻轻打磨边缘去除毛刺。5.3 组装与调试组装过程需要耐心和细致预组装先不用螺丝把所有亚克力板、铜柱、电路板、屏幕像拼图一样摆在一起检查孔位是否对齐空间是否足够。固定核心部件使用M3尼龙螺丝和螺母将ESP32开发板和GM模块固定在中间隔层上。注意螺丝不要过紧以免压坏电路。连接线路按照之前的接线表用杜邦线或焊接连接各模块。建议使用不同颜色的线便于后期排查。线缆用扎带或胶水固定在走线槽内。安装屏幕将墨水屏放入前板背面的凹槽如果有或者用双面胶固定。排线小心地穿过中间隔层的开孔连接到ESP32。最终合体依次将前板、中间隔层已装好电路、后板用长铜柱和螺丝锁紧。确保屏幕正对窗口所有按钮、接口如USB口、开关都能从外壳的对应孔中露出。上电测试组装完成后先不要完全锁死接上USB电源测试功能是否正常。确认屏幕显示、脉冲计数都工作后再最终紧固所有螺丝。6. 校准、测试与日常使用一个测量仪器校准是赋予其“可信度”的灵魂。6.1 如何校准你的盖革计数器由于每个GM管的灵敏度存在差异出厂系数仅供参考。要进行相对准确的校准你需要一个已知的、稳定的参考源。寻找参考值最方便的方法是找一个已经过校准的商用盖革计数器可以向朋友借或有些科技馆有展示。将它们并排放置在同一个位置远离明显辐射源如大理石台面、某些釉面陶瓷静置至少24小时以消除统计涨落。记录与计算同时记录你的自制摆件和商用仪器的读数剂量率单位µSv/h。收集多个时间点的数据例如每小时记录一次计算平均值。你的仪器平均读数M_your 0.105 µSv/h参考仪器平均读数M_ref 0.125 µSv/h校准系数修正新的系数 旧系数 * (M_ref / M_your)例如旧系数是0.00812则新系数 0.00812 * (0.125 / 0.105) ≈ 0.00967更新代码将计算出的新系数替换代码中的uSv_per_Count常量重新烧录程序。使用环境本底验证在普通室内环境典型的γ辐射剂量率范围在0.08 ~ 0.15 µSv/h之间。校准后你的摆件读数应该落在这个区间内。靠近建筑材料如混凝土、花岗岩可能会略有升高。重要提示绝对禁止使用任何放射源即使是微弱的检查源进行非专业校准这不仅是法律和安全问题未经训练的普通人根本无法安全操作和评估风险。我们DIY的目的在于学习和监测环境本底而非进行精确计量。6.2 功能测试与异常排查组装并校准后需要进行全面测试计数稳定性测试将摆件放在室内固定位置连续运行几天观察剂量率读数是否在一个合理范围内波动。可以用串口打印出原始计数观察其统计规律。干扰测试尝试将手机、Wi-Fi路由器、电脑等电子设备靠近摆件观察读数是否有剧烈变化。正常情况下影响很小。如果出现持续异常高计数检查GM模块的高压电路和信号线是否受到电磁干扰屏蔽是否良好。功耗测试如果使用电池供电用万用表测量整机在工作模式和深度睡眠模式下的电流估算续航时间。常见问题排查屏幕不显示检查SPI引脚连接、电源电压3.3V还是5V、BUSY引脚接线是否正确。尝试在代码中增加display.init()后的长延时。计数为零或异常低检查GM模块的脉冲输出引脚是否连接正确高压是否正常警告高压危险非专业人士勿测。尝试用螺丝刀金属部分轻轻触碰GM管外壳模拟微弱干扰看是否会产生计数注意安全。计数异常高且持续可能是电磁干扰。检查信号线是否远离高压线和电源模块尝试加上文提到的RC滤波电路。也可能是GM管本身故障或环境中有未知辐射源。6.3 把它变成真正的桌面伴侣经过校准和测试你的辐射探测摆件就可以正式上岗了。你可以把它放在书桌、书架或床头柜上。观察日常变化你会发现读数在一天中会有细微波动这可能与大气压力、宇宙射线强度变化有关。雷雨天气前有时读数会略有上升这与氡子体沉降有关是一个有趣的现象。进行小实验拿一个含有微量钾-40的香蕉靠近它不要接触看看计数是否有可察觉的增加通常很微弱。或者观察靠近老式含钍或铀的陶瓷釉餐具、某些型号的旧烟雾探测器内含镅-241时的反应。请务必谨慎保持安全距离这些实验只是为了验证灵敏度并非鼓励接触放射性物质。数据记录与扩展如果你启用了ESP32的Wi-Fi功能可以很容易地将数据通过MQTT协议发送到家庭服务器如Home Assistant或物联网平台绘制长期趋势图。甚至可以设置阈值报警当剂量率超过某个值时向手机发送通知虽然在家里触发这种情况的概率极低。这个自制的桌面摆件从一个简单的脉冲计数器变成了连接不可见世界的一个窗口。它静静地待在那里用跳动的数字和复古的屏幕提醒着你宇宙和自然中那些默默运行的基本力量。每一次精心的校准每一行代码的调试每一次外壳的打磨最终都凝聚在这个独一无二的作品中。这或许就是DIY最大的魅力——将知识、技能和创意转化为一个看得见、摸得着、每天都在与你对话的实体。