
从墙面上拆下原厂那个白色塑料温控器的时候我心里其实是有点舍不得的——毕竟它默默工作了十几年没出过什么大问题。但当我把它换成自制的 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 NanoATmega328P5V 逻辑资料多好调试温度传感器DS18B20 防水探头单总线传输精度 12 位约 ±0.5°C辉光管IN-12 ×3俄罗斯产数字高约 15mm驱动电压 170V显示驱动K155ID1 ×3苏联版 74141BCD 转十进制的专用驱动芯片高压电源现成 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。常见的美式暖通系统会有 R24V 供电、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 之后我养成了一个习惯每天晚上关客厅灯的瞬间会下意识看一眼墙上那块橙红色的数字。它不像普通温控器那样只是一个“设定好就不需要看”的功能件它更像是这个家的一部分有着自己的发光节奏。如果你也打算做一台我建议你多花一点时间在面板的设计上——毕竟温控器本来就是个每天都会看到的东西值得好好对待。