基于ESP8266与触摸屏的DIY盖革计数器:从原理到实践
1. 项目概述与核心价值
如果你对身边的辐射环境感到好奇,或者想亲手制作一个能“看见”放射性物质的仪器,那么这个基于ESP8266和触摸屏的DIY盖革计数器项目,绝对值得你投入时间。盖革计数器,这个听起来颇具冷战色彩的设备,其核心原理其实非常优雅:它利用一个充满低压气体的玻璃管(盖革-弥勒管),在高电压电场下,将看不见的辐射粒子(如β或γ射线)转化为清晰可闻的“咔哒”声或可计数的电信号。市面上的成品要么价格昂贵,要么功能单一、界面简陋。我这个项目的初衷,就是想做一个既专业又好玩的设备——它不仅有精准的探测能力,还要有一个漂亮的触摸屏图形界面,让数据一目了然,操作直观顺手。
我选择了ESP8266作为大脑,不仅因为它编程像Arduino一样简单,更因为它强大的处理能力和内置的Wi-Fi,为未来扩展(比如远程数据记录)留足了空间。搭配一块2.8寸的SPI触摸屏,整个设备瞬间从“实验室仪器”变成了“智能终端”。无论是测量环境本底辐射,还是鉴别一块矿石是否含有铀矿,它都能胜任。整个制作过程涵盖了高压电路设计、单片机编程、3D建模打印等多个领域,是一次非常综合的电子DIY实践。下面,我就把从原理到成品,再到调试避坑的完整经验分享给你。
2. 核心原理与器件选型解析
2.1 盖革-弥勒管是如何工作的?
理解原理是成功制作的第一步。盖革-弥勒管(GM管)是设备的心脏。你可以把它想象成一个非常灵敏的“电火花触发器”。管子内部是低压的惰性气体(如氩、氖混合气),两端电极加上几百伏的高压。在平时,这个电压不足以击穿气体,电路是断开的。
当高能辐射粒子(如γ光子)或带电粒子(如β电子)穿过管壁时,会与管内气体分子发生碰撞,撞出电子,形成电子-正离子对。这些被撞出来的电子,在管内强大电场的作用下,会像雪球一样加速冲向正极。在加速过程中,它们会获得足够的能量,去碰撞更多的气体分子,产生更多的电子-离子对。这个过程像雪崩一样瞬间发生,形成一次短暂的、可观的电流脉冲。
注意:这个“雪崩”过程需要被迅速淬灭,否则会持续放电损坏管子。现代GM管通常在气体中加入少量卤素或有机蒸气作为“淬灭气体”,它能吸收多余能量,让放电自动停止,为下一次探测做好准备。
电路的任务,就是捕捉这个纳秒级的微小电流脉冲,并将其放大、整形为一个单片机GPIO口可以识别的干净数字脉冲。每一个脉冲,就代表探测到了一个辐射粒子。
2.2 关键器件选型与考量
1. 盖革-弥勒管:SBM-20我选择俄制的SBM-20管,原因很实际:性价比高,在二手市场(如eBay)上容易买到,且对β和γ射线都有不错的灵敏度。它的工作电压通常在400V左右,属于常见范围。在购买时要注意,有些管子是“端窗式”的,对α粒子也敏感,但SBM-20是侧窗式,主要探测β和γ。
2. 微控制器:NodeMCU (ESP8266)为什么不用更简单的Arduino Uno?主要考虑三点:
- 性能:ESP8266的主频更高(80MHz),内存更大,能更流畅地驱动触摸屏并处理复杂的UI图形,避免操作卡顿。
- 生态:它完全兼容Arduino IDE,库资源丰富,学习成本低。
- 未来性:内置Wi-Fi模块是最大的亮点。虽然本项目第一版固件未启用,但它为后续添加网络时间同步、数据上传到服务器等功能铺平了道路,让你的设备不至于很快过时。
3. 高压电源模块这是安全与稳定的关键。我选用了一款常见的400V DC-DC升压模块。这里有一个至关重要的细节:这类模块的输出端通常不能直接用万用表测量电压!因为万用表的内阻(通常10MΩ)相对于模块的输出阻抗来说太低了,接上去会形成一个分压,导致读数远低于实际电压。正确的方法是用两个高阻值电阻(例如10MΩ和100kΩ)串联成一个1000:1的分压器,再去测量小电阻两端的电压,然后换算。
4. 触摸显示屏:2.8寸 SPI TFT选择SPI接口的屏幕是因为它比并行接口占用更少的IO口,这对于IO资源并不算特别富裕的ESP8266来说很重要。2.8寸的大小在便携性和信息显示量之间取得了很好的平衡。确保你的屏幕驱动芯片是ILI9341,这是Adafruit GFX库广泛支持的型号。
5. 电源系统采用单节18650锂电池供电(约3.7V)。这里用了两个升压模块:
- 主电源Boost:将电池电压升压至稳定的4.2V,为ESP8266、屏幕和逻辑电路供电。选择4.2V是因为它是锂电满电电压,且高于ESP8266的3.3V工作电压,可以经过板载LDO稳压,确保稳定。
- 高压Boost:将4.2V升压至GM管所需的400V。 这种架构效率较高,且高压部分与逻辑部分相对隔离。
3. 电路设计与PCB制作要点
3.1 核心电路原理图解读
整个电路可以分成几个功能模块:
- 高压生成与GM管接口:高压模块输出接GM管阳极,阴极通过一个高阻值电阻(如1-10MΩ)接地。这个电阻是必须的,它一方面限制了GM管放电时的电流,保护管子;另一方面,放电脉冲会在这个电阻上产生一个电压降,这就是我们要采集的信号。
- 脉冲信号调理电路:从高阻值电阻上取出的脉冲信号电压幅度小且波形不规则,需要调理。通常使用一个高速比较器(如LM393)或一个晶体管放大整形电路。在我的设计中,使用了一个简单的NPN晶体管(2N3904)共射极放大电路。GM管阴极的脉冲信号通过一个电容耦合到晶体管基极,被放大并反相后,在集电极输出一个干净的、0-3.3V的方波脉冲,直接送入ESP8266的中断引脚。
- 微控制器及外围:ESP8266负责计数脉冲、驱动屏幕、处理触摸信号、控制蜂鸣器和LED报警。脉冲信号最好接到支持硬件中断的引脚(如GPIO5/D1),以确保不错过任何一次计数。
- 电源管理:电池输入处建议增加一个反接保护二极管和滤波电容。4.2V升压模块的输出端也要有足够的滤波电容,以应对屏幕背光开启等瞬间大电流需求。
3.2 PCB设计经验与避坑指南
使用PCB能让项目更规整、可靠,但设计时陷阱不少。
布局要点:
- 高压隔离:400V走线是重中之重!必须与其他低压信号线保持足够距离(建议至少3mm以上)。绝对不要让高压走线从芯片或连接器下方穿过。在PCB上可以用开槽(即挖掉高压走线区域的铜皮和FR4基材)来增加爬电距离,这是专业设计里常用的方法。
- 电源路径:电池输入到两个升压模块的路径要粗而短。4.2V电源到ESP8266和屏幕的路径也要保证线宽,减少压降。
- 信号完整性:脉冲信号线应尽量短,远离高频或噪声源(如ESP8266的Wi-Fi天线区域)。
我踩过的坑与修改建议:
- 封装错误:最初版本的PCB,NodeMCU和高压升压模块的焊盘间距画错了,导致模块插不进去。教训:在画PCB之前,务必用游标卡尺精确测量实物模块的引脚间距和尺寸,或者直接从可靠的元件库调用封装。
- 高压线间距不足:第一版设计中,一条400V走线与一个螺丝孔的距离太近,存在击穿风险。在后续版本中,我加宽了间距并增加了开槽处理。
- 测试点:务必在关键节点添加测试点,如电池电压、4.2V输出、高压分压点、脉冲信号点。这会在调试时救你的命。
- 固定孔:PCB的固定孔位置一定要与3D打印外壳的柱子位置精确对应。最好先完成外壳设计,再根据外壳来定位PCB的固定孔。
实操心得:对于DIY项目,我强烈建议在第一次打样PCB前,先用万用板或洞洞板搭建一个原型机,验证所有电路功能,并确定好各模块的物理位置。这能极大避免因设计错误导致PCB报废的浪费。
4. 固件开发与用户界面设计
4.1 开发环境搭建与代码结构
我使用PlatformIO(基于VS Code)进行开发,它比Arduino IDE更专业,库管理更方便。核心依赖库是Adafruit_GFX和对应的触摸屏驱动库(如Adafruit_ILI9341和XPT2046_Touchscreen)。
代码主要分为以下几个模块:
main.ino:程序入口,负责初始化硬件(屏幕、触摸、脉冲中断、EEPROM)、创建UI页面和主循环。DisplayManager.cpp/.h:封装所有屏幕绘制逻辑,如绘制主页、菜单、更新剂量率数字等。RadiationSensor.cpp/.h:封装GM管脉冲计数逻辑,包括中断服务程序、计算CPM(每分钟计数)和剂量率。TouchManager.cpp/.h:处理触摸屏输入,解析点击坐标并转换为按钮事件。SettingsManager.cpp/.h:管理设备设置(如报警阈值、校准系数),并负责将设置保存到ESP8266的EEPROM中,实现掉电记忆。
4.2 辐射测量算法与校准
核心算法:设备的核心是计算计数率(CPM)和估算剂量率(如µSv/h)。
- 计数:在中断服务程序里,对一个全局变量进行简单的加一操作。注意要将此变量声明为
volatile类型。 - CPM计算:不能简单用1分钟内的总计数,因为那样数据更新太慢。我采用“滑动时间窗”法:维护一个长度为N的计数队列(例如,每秒记录一次计数)。每分钟的CPM就是过去60个秒计数值之和。这样既能得到每分钟的计数率,又能每秒更新一次显示,响应迅速。
- 剂量率估算:这是最需要校准的环节。剂量率 = CPM * 校准系数。这个系数与使用的GM管型号密切相关。SBM-20管的一个常见参考系数是0.0057 µSv/h per CPM,但这只是一个粗略值。绝对准确的系数需要通过已知活度的标准放射源(如铯-137)进行校准获得。
UI设计思路:主页设计力求清晰直观:
- 中央大字体显示当前剂量率。
- 下方显示实时CPM和累计剂量。
- 顶部有电池电量图标。
- 底部设置虚拟按钮,用于切换“快速/慢速”积分模式、开关蜂鸣器/LED报警。 设置菜单采用列表式,通过触摸选择和滑动条进行调整,所有更改自动保存。
编程技巧:驱动触摸屏刷新时,避免在
loop()函数中进行全屏刷新,这会导致严重闪烁。只刷新需要改变的区域(如数字部分)。对于ESP8266,图形操作比较耗时,可以将复杂的静态界面(如背景、按钮框)预先绘制好,只动态更新文本。
5. 组装、调试与实测全记录
5.1 硬件组装步骤详解
- 焊接PCB:建议先焊接高度最低的贴片电阻电容,再焊接IC插座、晶体管,最后是接插件(排母、电池座、开关)。焊接高压升压模块时,确保其底部的焊点不会接触到PCB上的其他走线,我用一小块绝缘胶布做了隔离。
- 安装GM管:使用标准的6.5*32 mm熔断器座(保险丝座)来固定SBM-20管,既牢固又便于更换。将GM管引脚小心插入座子,高压端(通常是管体有金属条或标有“+”的一端)接高压输出。
- 连接屏幕与NodeMCU:通过排针排母将屏幕模块与PCB连接。务必对照原理图,确认SPI的引脚(CLK, MISO, MOSI, CS, D/C)一一对应,触摸屏的引脚(T_CS, T_IRQ)也要接对。
- 装入外壳:将焊接好的PCB放入3D打印的外壳底盒,用M2或M3的螺丝配合尼龙柱固定。然后安装18650电池,最后盖上屏幕面板。面板和底壳之间可以用小螺丝或卡扣固定。
5.2 上电调试与高压校准
这是最紧张也最关键的步骤。
- 低压测试(先不接GM管!):装上电池,打开开关。首先用万用表测量给逻辑电路的4.2V输出是否正常。然后观察屏幕能否点亮,触摸是否正常。
- 高压测试与校准(极端小心!):
- 绝对不要直接用万用表笔去测400V输出点!
- 按照前文所述,焊接一个由10MΩ和100kΩ电阻串联的分压器。将10MΩ一端接高压输出,100kΩ一端接地,两个电阻的中间点就是分压点。
- 将万用表拨到直流电压档,测量100kΩ电阻两端的电压。假设读数是
V_measure。 - 实际高压
V_actual = V_measure * (10M + 100k) / 100k ≈ V_measure * 101。 - 用小螺丝刀缓慢调节高压模块上的可调电阻(电位器),同时监测
V_measure,直到计算出的V_actual达到SBM-20的推荐工作电压400V。
- 功能测试:关闭电源,接上GM管。再次上电。在无放射源的情况下,设备应该每分钟有15-30次的随机计数,这是环境本底辐射。你可以用一块含铀的釉料陶瓷(某些旧餐具底部)或一块烟感探测器里的镅-241源(务必谨慎,避免破损和接触)靠近GM管,应该能看到CPM显著上升,并听到蜂鸣器跟随计数鸣叫。
5.3 实测数据与性能评估
在我的实测中:
- 环境本底:稳定在18-25 CPM之间,符合预期。
- 铀矿石样本:距离约5厘米时,CPM升至400左右。
- 钍气灯罩(一种含有放射性钍-232的旧式户外灯罩,是爱好者常用的弱放射源):紧贴GM管时,CPM可飙升至5000以上,蜂鸣器响成一片,效果非常明显。
- 功耗:整机工作电流约180mA @ 3.7V。一块2000mAh的18650电池可以持续工作约11小时(2000mAh / 180mA ≈ 11.1h)。
6. 常见问题排查与进阶优化
6.1 问题排查速查表
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 屏幕不亮 | 1. 电源未接通或电池没电。 2. 4.2V升压模块故障。 3. 屏幕背光电路问题。 | 1. 测量电池电压和4.2V输出。 2. 检查屏幕排线是否插紧。 3. 短接屏幕背光引脚到4.2V,看是否亮起。 |
| 触摸屏无反应 | 1. 触摸屏驱动引脚接错。 2. 代码中触摸屏初始化失败。 3. 触摸芯片供电问题。 | 1. 检查T_CS, T_IRQ, T_CLK, T_DIN, T_DO引脚连接。 2. 在代码中启用串口调试,查看触摸屏初始化信息。 3. 测量触摸芯片的VCC(通常是3.3V)。 |
| 计数始终为0 | 1. GM管未工作(高压不正常)。 2. 脉冲信号调理电路故障。 3. 中断引脚配置错误。 | 1.先确认高压是否正常(用分压法测量)。 2. 用示波器探头(或一个简单的LED+电阻串联电路)探测GM管阴极,在辐射源靠近时看是否有脉冲。 3. 检查脉冲信号是否送到了正确的ESP8266引脚,并在代码中确认中断配置正确。 |
| 计数异常高(无源时) | 1. 高压过高,导致GM管自放电。 2. 电路中有噪声干扰,被误认为是脉冲。 | 1. 重新校准高压至准确值。 2. 检查脉冲信号线是否过长,是否靠近噪声源。尝试在晶体管基极对地加一个小的滤波电容(如10pF)。 |
| 设备工作时重启 | 1. 电池电量不足,带载后电压骤降。 2. 电源纹波过大。 3. ESP8266软件看门狗复位。 | 1. 更换满电电池测试。 2. 在4.2V电源输出端并联一个更大容量的电解电容(如220µF)。 3. 检查代码中是否有耗时过长的阻塞操作(如 delay()),考虑用非阻塞方式重构。 |
6.2 进阶优化与扩展想法
这个项目的基础框架已经搭建完成,但还有很多可以玩的地方:
- Wi-Fi数据记录:这是ESP8266的天然优势。可以修改代码,让设备定期将CPM和剂量率数据通过Wi-Fi发送到本地服务器(如运行Home Assistant的树莓派)、物联网平台(如ThingsBoard)或简单的网络数据库。你就能绘制长期的辐射环境变化曲线。
- 更精确的剂量算法:环境辐射的脉冲在时间上是随机分布的。可以引入更专业的算法,如“中值滤波”来平滑短期波动,或者根据脉冲间隔的泊松分布特性来识别异常高计数事件。
- 声音模拟:将经典的“咔哒”声用PWM驱动一个更优质的扬声器播放出来,而不仅仅是蜂鸣器的哔哔声,复古感拉满。
- 低功耗优化:目前屏幕背光是耗电大户。可以增加光线传感器,自动调节背光亮度;或者设计一个休眠模式,只有检测到辐射超标时才唤醒亮屏。
- 多语言UI与主题:为触摸屏界面增加更多主题颜色和语言支持,让设备更具个性化。
制作这个盖革计数器的过程,就像打开了一扇观察微观世界的窗。每一次清脆的计数声,都是来自宇宙深处或地球深处的一次问候。从电路板上小心翼翼的焊接,到代码调试时看到第一个脉冲被正确计数的喜悦,再到用自己制作的设备验证一个物理原理,这种成就感是购买成品无法比拟的。希望这份详细的指南能帮你绕过我踩过的那些坑,顺利打造出属于你自己的、带触摸屏的智能辐射侦探。如果在制作中遇到任何问题,回顾一下第六部分的排查表,大多数麻烦都能找到答案。
