辉光管温控器DIY:用Arduino打造复古Nixie恒温器
2026/8/27 2:13:10 网站建设 项目流程

从墙面上拆下原厂那个白色塑料温控器的时候,我心里其实是有点舍不得的——毕竟它默默工作了十几年,没出过什么大问题。但当我把它换成自制的 NixieStat,一块用 Nixie Tube 做显示屏的 Thermostat,晚上一盏橙红色的暖光映在墙上的那一刻,那种“设备终于有了人格”的感觉,我觉得值了。

NixieStat 不是一台智能家居概念机,它不连你的手机 APP,不会语音播报,也不存在什么云端联动。它做的事情非常朴素:用一根 DS18B20 温度传感器测室温,用三根俄罗斯 IN-12 辉光管把温度以数字形式亮出来,然后按你设定的目标温度,通过继电器去开关家里的锅炉或中央空调的加热回路。适合谁?适合手上正好有几颗辉光管、又折腾过 Arduino,同时对家里那台毫无审美的恒温器早就看不顺眼的人。如果你也喜欢那些会发光的老电子管,这篇文章应该能帮你省掉不少弯路。

1. NixieStat是什么,以及为什么要做它

1.1 恒温器不该是家里最无聊的设备

你想想,家里有哪些电子设备是你每天都要看、每天都要碰,但从来没想过让它变得好看起来的?大概率就是墙上的温控器。它满足了一台合格温控器的所有要求——能显示温度、能设定温度、能开机关机——但同时也无聊到了极点:白底液晶、蓝色背光、几个橡胶按键,放在十年前和放在今天几乎没什么区别。

我做 NixieStat 的初衷就是这么简单:让生活中最被忽视的电子设备,变成一件能让我抬头看一眼就开心的东西。恒温器是极少数“安装在墙上、一天看几十次、一年 365 天通电”的设备。这意味着你为它付出的每一次打磨、每一个细节设计,都会被反复看见。相比之下,桌面上那个辉光管时钟虽然也好看,但朋友来了才会被注意到;而墙上的温控器,是你每天晚上睡前如果不经意瞥到一眼,心里都会“哦”一声的存在。

1.2 辉光管的不可替代性

Nixie Tube 的发光原理和所有现代显示器件都不一样。它里面不是半导体,不是荧光粉,而是一堆叠在一起的金属数字阴极,外加一个金属网阳极,整个玻璃管里充着低压氖气。当阳极和某个数字阴极之间加上 150V 以上的直流电压时,阴极附近的氖气会被电离,发出那种非常标志性的暖橙色辉光。这种光的光谱非常接近烛光和低压钠灯,色温大概在 1700K 到 1800K 左右,和 LED 那种偏冷的光完全是两个物种。

这也决定了辉光管的几个性格:亮度不高,但非常“实”;颜色温暖,拍照片特别上镜;数字是分层金属结构,自带一种机械感和立体感,不像液晶屏是平的。另外辉光管工作时有极微弱的电流声和臭氧味——如果你凑得很近。这些特性组合在一起,让它成为复古电子设备里最“有生命感”的显示器件。做 NixieStat 的人,多半是先被这种光打动,才想着把它装到家里某个每天都在用的设备上。

1.3 项目的真实边界

NixieStat 本质上是一台“给自己看的温控器”。它不会智能学习你的作息,不会远程控制,也没有和 Home Assistant 联动的打算(当然你想加也不是不行)。它只做好三件事:准确测量室温、清晰显示温度、可靠地控制加热设备。这看起来很容易,但真正动手做的时候你会发现,把这三件事做到稳定可靠,要踩的坑远比想象中多——尤其是当温度和 170V 高压、继电器、老房子接线这些因素凑在一起的时候。

我建议你把 NixieStat 当作一个“半个家酿设备”来做:它的控制和显示部分完全由你掌控,但和家里暖通系统对接的那部分,一定要求稳。温控器一旦失控,轻则房间里忽冷忽热,重则可能损坏锅炉或压缩机。所以这篇文章里关于安全的内容,我写得比电路本身还多。

2. 硬件设计:从零件到电路

2.1 硬件选型清单

动手之前先把需要的零件列清楚。我这版 NixieStat 用的是比较基础和稳定的方案,全程不需要 PCB 打样,洞洞板加模块就能搭起来。

模块型号/规格说明
主控Arduino Nano(ATmega328P)5V 逻辑,资料多,好调试
温度传感器DS18B20 防水探头单总线传输,精度 12 位,约 ±0.5°C
辉光管IN-12 ×3俄罗斯产,数字高约 15mm,驱动电压 170V
显示驱动K155ID1 ×3苏联版 74141,BCD 转十进制的专用驱动芯片
高压电源现成 Nixie 供电模块或 MC34063 升压电路输出 170V DC,电流容量不需要很大
控制输出5V 继电器模块(触点 10A)用于切换 24VAC 控制回路,注意触点额定值
交互EC11 旋转编码器旋动调节温度,按下切换显示模式
电源12V/1A 开关电源 + AMS1117-5.0给整机供电,辉光管高压从 12V 升压

IN-12 是市面上最常见的辉光管,价格相对友好,引脚间距也够大,适合初次焊接。如果你想用更大的 IN-14 或 IN-18,后面讲的驱动思路不变,只是引脚定义和高压要求要重新查。顺便说一下,IN-12 是俄罗斯产的,同一批里不同管子的亮度差异很常见,所以数量上建议多备一两根,调亮度的时候用得上。

2.2 辉光管驱动:为什么我建议从K155ID1开始

辉光管驱动看似简单——本质上就是给某个数字阴极接通地线,让阳极和它之间形成压差——但实际做的时候要解决两个问题:一是 MCU 的 5V 逻辑信号管不了 170V,二是单片机的 IO 口不够用。最经典的解法就是用 K155ID1 或者它的西方版本 74141。

K155ID1 是一个 BCD 转十进制的解码器,内部集成了 10 路高压开集晶体管输出。MCU 只需要给 4 根 BCD 数据线(0000~1001 对应 0~9),芯片就会把对应的那一路阴极输出拉低,其他 9 路保持开路。阳极侧接 170V,这样当前选中的数字就会被点亮。一个芯片驱动一根辉光管,三根管子就是三片 K155ID1。每片需要 4 根数据线,三片就是 12 根,Arduino Nano 的 IO 勉强够用,但为了以后扩展,我建议在 MCU 和芯片之间加一组 74HC595 移位寄存器,这样只需要 3 根线就能控制所有管子。

如果你不想用 K155ID1,也可以用 MPSA42 高压三极管(耐压 300V)搭一个 10 路开关矩阵,但从可维护性角度,我更推荐前者。K155ID1 是专门为辉光管设计的芯片,内部已经有保护逻辑,你只需要关心 BCD 编码对不对。唯一要注意的是,芯片本身需要用 5V 供电,输入逻辑也是 5V 电平,所以用 Arduino Nano 这类 5V 主控最顺。

2.3 高压电源怎么搭

辉光管工作需要的 170V 直流,不能直接用变压器从市电里抽,最安全的办法是从低压侧升压。我用的是一个现成的 Nixie 供电模块,把 12V 升到 170V,最大输出电流约 30mA,对三根管子来说绰绰有余——因为每根管子的工作电流其实只有 2mA 到 5mA,三根加起来最多不到 15mA。

如果你喜欢自己折腾电路,用 MC34063 搭一个 Boost 升压也可以。反馈电阻分压公式是:输出电压等于 1.25V 乘以(1 + R2/R1)。比如想得到 170V,可以取 R1 = 1kΩ,R2 = 135kΩ,得到约 170V。实际操作时,由于二极管压降和高频开关损耗,你需要的 R2 可能会略有偏差,建议用可调电阻微调。有一点必须强调:高压输出端的滤波电容一定要有足够的余量,至少选 200V 耐压,否则电容爆浆只是时间问题。

高压电源的纹波也很关键。如果纹波过大,辉光管的亮度会跟着微微闪动,虽然肉眼不容易察觉,但拍视频时会非常明显。解决办法是输出端并一个 10µF/250V 电解电容,再并联一个 0.1µF 陶瓷电容滤高频。高压走线要尽量短,远离 DS18B20 的信号线和继电器控制线,避免噪声被传感器采集到。

2.4 和家里暖通系统的接线

这可能是整个项目里最不能马虎的部分。绝大多数家用恒温器干的事情,本质上就是一个开关:把 24VAC 电源端(R)和加热控制端(W)接通,锅炉或空调就启动;断开就停止。你的 NixieStat 要做的,就是用 MCU 控制一个继电器,去接通或断开这个电路。

具体接线时,先把原温控器拆下来,拍照记录原来的接线,然后用万用表确认哪根线上有 24VAC。常见的美式暖通系统会有 R(24V 供电)、W(加热)、Y(制冷)、G(风扇)、C(公共地)几根线,但国内老房子的情况五花八门,很多甚至是两根线直接接壁挂炉,所以不要凭颜色猜,一定以实测为准。

继电器模块用普通的 5V 继电器就行,但要注意两点。第一,触点额定电流要大于你控制的回路电流,24VAC 控制回路一般电流很小,但继电器触点最好选 10A 等级的,留足余量。第二,MCU 的地和暖通系统的地要隔离,推荐使用光耦隔离或者继电器本身自带的物理隔离。如果 MCU 和 24VAC 共地,一旦接线错误,可能把整块控制板烧掉。上电之前,先用万用表确认控制回路的电压极性,再决定继电器触点的接法。

3. 固件逻辑:控温这件事比想象中细节多

3.1 温度采集与滤波

DS18B20 是单总线传感器,用起来简单,但读数并不像想象中那么干净。12 位分辨率下,每个 LSB 代表 0.0625°C,听起来很精确,但实际上受供电纹波、线缆长度和走线位置影响,相邻两次读数可能差出 0.5°C 甚至更多。直接拿原始读数去做控制,继电器就会跟着这些噪声频繁跳动。

我的做法是在读取后加一层指数移动平均(EMA)滤波。公式很简单:T_smooth = T_smooth * 0.8 + T_raw * 0.2。这样既不会让响应变得太迟钝,又能把大部分随机噪声滤掉。采样周期我设置为 10 秒一次,控制逻辑每秒检查一次当前滤波值,但真正决定是否切换继电器的判断只允许每 30 秒执行一次。这个间隔已经足够,因为房间温度本身的变化是以分钟为单位的。

3.2 为什么用滞回控制,而不是PID

很多人一听“温控”,第一反应就是 PID。但恒温器控制的是一个开关量——继电器要么开要么关,不是连续可调的输出。PID 在这种系统上很容易出现两个问题:一是积分项导致输出频繁振荡,二是微分项对温度噪声非常敏感,最终结果可能就是锅炉在一个小时里启停二十次。

所以我从一开始就选了滞回控制。逻辑非常简单:设定目标温度 20.0°C,回差 0.5°C,那么当温度低于 19.5°C 时开启加热,高于 20.5°C 时关闭加热。这样既不会频繁启停,又能把温度维持在一个可以接受的范围内。如果你担心温度波动太大,可以把回差调到 0.3°C,但你要接受继电器动作次数变多。对于锅炉来说,频繁启停比让温度有半度的波动更伤设备。

这里给一段核心控制逻辑的伪代码,你可以直接参照写进 Arduino 项目里:

float target = 20.0; // 目标温度,可通过旋钮调整 float hyst = 0.5; // 回差 bool heaterOn = false; void updateHeater() { float t = getFilteredTemperature(); if (!heaterOn && t < target - hyst) { heaterOn = true; digitalWrite(RELAY_PIN, HIGH); } else if (heaterOn && t > target + hyst) { heaterOn = false; digitalWrite(RELAY_PIN, LOW); } }

这套逻辑的好处是系统天然稳定,不需要整定参数。如果你以后想加时间段编程,只需要在读取 target 的时候根据当前时间切换设定值就可以了。

3.3 显示状态机与抗阴极中毒

辉光管有个非常著名的毛病叫阴极中毒。简单说,如果某个数字长时间点亮,它的阴极材料会被慢慢地“消耗”或覆盖,导致后续亮起时比别人暗,甚至再也亮不起来。所以你不能让某一根管子永远显示同一个数字。

解决办法是定期“刷新”所有数字:每隔 30 秒,把三根管子各自遍历点亮 0~9,每个数字点亮几毫秒到几十毫秒。这个操作人眼几乎感知不到,但它能有效让每个阴极都保持活性。我通常把它放在主循环的“防发呆”任务里,和温度采集、继电器控制并行,但要注意别用阻塞式的 delay,不然温度控制会被打断。

显示状态机也不要太复杂。我的设计是:正常状态下,三根管子显示当前温度,也就是“21.5”这样的格式,十位、个位、一位小数各占一根管子。当你旋转编码器时,显示切换为设定温度,并且左数第一根管子的小数点闪烁,提示你现在调的是设定值。停止操作 3 秒后,自动切回当前温度。按下编码器按钮,可以切换显示模式(当前温度 / 设定温度 / 交替显示)。

3.4 保护逻辑与掉电恢复

这部分是 NixieStat 和普通桌面辉光管项目最大的区别——它是一个挂在墙上、负责控制真实设备的东西,必须有“保底”逻辑。我加了这么几条:

  • 压缩机/锅炉最短停机保护:如果加热刚关闭不到 5 分钟,即使温度又低于阈值,也不允许立即启动。这个保护对空调压缩机尤其重要,否则会缩短设备寿命。
  • 传感器断线检测:DS18B20 如果读不到数据或返回乱码,立刻进入安全模式,显示“E”,强制关闭继电器,防止锅炉在失控状态下干烧。
  • EEPROM 保存设定值:目标温度和模式选择掉电后自动恢复,省得每次停电都要重新设定。
  • 看门狗定时器(WDT):如果 MCU 跑飞了,看门狗自动重启,不会让继电器卡在常开状态。

我在第一版固件里就是吃了没有看门狗的亏。有一次传感器线被老鼠咬断,固件读到乱码后反而触发了加热,还好人在家及时发现。从那以后我坚持把保护逻辑放在和显示逻辑同等重要的位置上。

4. 组装调试实录:从洞洞板到上墙

4.1 电路布局与绝缘细节

第一个版本我图省事,把所有电路都堆在一块洞洞板上,高压区和低压区挨得很近。结果一上电,温度读数就开始乱跳,后来发现是高压电感的磁场干扰了 DS18B20 的信号线。这个教训让我在第二版彻底改了布局:高压模块单独放在板子一角,和 MCU 之间留至少 3cm 的间距;DS18B20 的信号线从板子另一侧走,并且用双绞线绕了两圈。

辉光管本身的引脚很细,尤其是从玻璃根部引出来的那一段,非常脆弱。焊接时最好在引脚上先套一层热缩管,弯折也尽量在热缩管保护范围内进行。如果直接硬掰,一个角度不对,可能就听到“啪”的一声——管子的引脚断了。三根管子的位置我是用一块 3D 打印的面板固定的,如果你没有打印机,用亚克力板开孔也可以。关键是开孔直径要略大于管子的玻璃部分,否则安装时应力会传到引脚上。

高压区还有一个容易忽略的细节:焊点的毛刺。170V 的电压虽然不算离谱,但在间距不足的情况下,焊点毛刺会造成尖端放电,晚上能听到微弱的“嘶嘶”声,甚至看到蓝色闪光。焊接完成后,用放大镜检查所有高压焊点,有毛刺就用锉刀或者美工刀清理干净,再涂一层三防漆。

4.2 新管的活化与亮度平衡

刚拿到的 IN-12 辉光管,有些年份久远的库存管会存在“起辉不稳”的问题,也就是刚通电时个别数字亮不起来,要等一会儿才稳定。这种情况需要“老化”:把所有数字轮流点亮,每个数字持续 5 秒,循环几次,一般十几分钟后就能稳定。

亮度平衡是辉光管爱好者绕不开的坎。同一批管子里,有的数字特别亮,有的数字特别暗,这是制造时阴极材料和电流分布不均匀导致的。最直接的办法是每根管子的阳极回路里串不同的限流电阻。辉光管的工作电流推荐在 2mA 到 5mA 之间。我的经验是先用 10kΩ 的电阻试,然后根据亮度微调。如果某个数字明显偏暗,可以把它所在的那一路电阻减小 1~2kΩ,电流稍微加大,亮度会提升一些。

有一个误区:限流电阻越大越安全。其实电阻太大,电流低于维持辉光放电的最小值(一般是 1mA 左右),管子就会时亮时灭,反而闪烁得更厉害。所以一定要保证最小电流,在这个前提下再追求亮度均匀。

4.3 温度校准到底要做到什么程度

DS18B20 出厂精度是 ±0.5°C,对于家用温控器来说,这个精度其实够用了。但如果你对温度比较敏感,或者想追求更好的精度,可以做两点校准。冰水混合物的温度是 0°C,一个大气压下沸水是 100°C,把探头放进去,记录 DS18B20 的读数,然后算一个偏移量和斜率修正。不过我的实际感受是,温控器挂在墙上的读数误差,更多来自安装位置而不是传感器本身。

所以比校准更重要的是怎么放探头。探头不要放在阳光直射的地方,不要放在空调出风口下方,不要离继电器太近。继电器工作时会发热,如果探头贴在继电器旁边,你读到的是继电器的体温而不是室温。建议把探头用一支 1.5m 的延长线引出,固定在室内中部偏下、大约 1.4m 高度的墙上,这个高度才比较接近人体活动区域的温度。

4.4 整机联调的顺序

不要一上来就接家里的锅炉。我踩过的坑告诉我,联调一定要分步走。

第一步,空载测试。只接 MCU、传感器、显示模块和继电器模块,不接任何外部负载。看显示是否正常,旋钮是否灵敏,设定温度是否会被保存。

第二步,假负载测试。用一盏 60W 的白炽灯泡接到继电器触点,代替真实的加热回路。设定目标温度比当前温度高 2°C,观察灯泡是否在温度低于阈值时点亮,高于阈值时熄灭。这个测试同时也能验证最小停机保护逻辑是否生效:你把温度探头捂在手心,让温度快速升高,灯泡熄灭后再放开探头,看它是不是真的等了 5 分钟才重新亮起。

第三步,24 小时桌面运行测试。把整机平放在桌上,接上假负载,连续跑一天一夜,观察有没有偶尔死机、显示乱码、继电器粘连之类的问题。这一步能发现很多偶发性的 bug。等一切稳定了,再考虑上墙。

5. 常见问题与排查技巧

5.1 数字乱跳或全亮

现象是某根管子的数字不受控制,或者所有数字同时亮起。最常见的原因有三个:BCD 数据线接触不良;MCU 复位导致驱动芯片输入悬空;高压电源的纹波过大。

排查时先查接线,尤其是 K155ID1 输入引脚和移位寄存器连线之间有没有虚焊。如果接线没问题,再看 MCU 是否频繁复位——可以在固件里加一个计数,打印复位次数。高压电源纹波过大也会导致驱动芯片逻辑误判,这时需要加强输出端滤波,或者把高压模块挪远一点。最后,要在每片 K155ID1 的电源引脚旁放一个 100nF 陶瓷电容,这个去耦电容能解决很多莫名其妙的逻辑问题。

5.2 温度读数乱飘

症状是显示的温度在几个数字间跳来跳去,有时候甚至 1 秒跳一次。先别怪传感器,十有八九是测量环境问题。继电器吸合瞬间产生的电磁干扰会耦合到 DS18B20 的长线上,导致读数跳变。

我的处理方案是:传感器线用屏蔽线,屏蔽层单端接地;在 DS18B20 的数据线和地之间加一个 100nF 电容;在固件里把采样频率降下来,用中位数滤波加 EMA 滤波组合。还有一个容易被忽略的源头:MCU 的供电。继电器吸合瞬间电流波动会拉低 5V 电压,如果传感器正好在读数据,也会出错。解决办法是给继电器模块单独供电,或者至少用一个 1000µF 的电容稳住电压。

5.3 继电器频繁启停

如果你发现温度在目标值附近波动时,继电器 30 秒一次来回切换,先检查滞回设置。0.5°C 的回差对于大多数房间已经够了,如果还频繁,说明探头位置有问题。有一种隐蔽的自激情况:继电器安装在探头旁边,吸合时发热,把探头吹热了,温度很快越过阈值断开,断开后继电器的温度又回落,探头测到的温度又降下来,如此反复。这是典型的反馈回路自激,解决方法是把探头远离继电器,或者用延长线拉出去。

5.4 高压端异响

如果听到“嘶嘶”声,大概率是高压走线之间的尖端放电,或者是升压电感的磁芯在啸叫。区分方法很简单:用一根绝缘塑料棒轻轻抵住电感,如果声音变小,就是电感磁芯松动,点一点胶固定即可。如果声音还是存在,就要仔细检查高压焊点和走线间距,补涂三防漆,或者重新布局。

5.5 替换旧温控器的接线坑

最后提醒一个特别容易踩的坑:老房子温控器的线色是完全不可信的。有些电工喜欢红色接火线,但不排除有人用了黄色、绿色甚至白色。我遇到过最离谱的情况是,原温控器拆下来后,里面有五根线,实际只有两根有电压,另外三根根本没用。如果你不量电压直接按颜色接,很可能把自己新做的 NixieStat 烧掉。

正确的流程是:先拍照记录原接线,然后用万用表交流档逐个测量线对之间的电压,确定哪根是 24VAC 供电、哪根是负载控制线,最后再决定继电器怎么接。如果原来的温控器是两线制,没有公共线给 MCU 供电,最简单的方案是采用低功耗设计,用 3 节 AA 电池加一颗升压芯片给 MCU 供电,电池撑一两年没有问题。如果你不想换电池,也可以从 24VAC 上取电,但那个电路复杂度明显上升,我个人不建议新手尝试。

做完 NixieStat 之后,我养成了一个习惯:每天晚上关客厅灯的瞬间,会下意识看一眼墙上那块橙红色的数字。它不像普通温控器那样只是一个“设定好就不需要看”的功能件,它更像是这个家的一部分,有着自己的发光节奏。如果你也打算做一台,我建议你多花一点时间在面板的设计上——毕竟温控器本来就是个每天都会看到的东西,值得好好对待。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询