1. 项目概述:一个能“思考”的智能加湿器

作为一个常年折腾智能家居和嵌入式开发的老玩家,我一直在寻找一个能把环境感知和主动调节真正结合起来的项目。市面上的智能加湿器大多只是连个Wi-Fi,用手机开关,顶多再加个定时,离真正的“智能”还差得远。它们不知道你房间现在到底有多干,也不知道空气干不干净,更不会根据这些信息自己做出调整。这次,我决定用树莓派这个“万能小电脑”作为大脑,搭配DHT11和MQ7这两个经典传感器,亲手打造一个能看、能闻、能自己动的智能加湿器。它不仅能监测温湿度和一氧化碳浓度,还能根据这些数据自动决定是否加湿、何时通风,把物联网(IoT)那套“感知-决策-执行”的闭环逻辑,实实在在地落地到一个生活设备上。

这个项目非常适合有一定动手能力和编程基础的爱好者,无论你是想深入学习树莓派GPIO控制和传感器应用,还是想搞明白物联网系统从硬件连接到软件逻辑的完整链条,它都是一个绝佳的练手案例。整个过程涉及电路搭建、Python编程、简单的数据库操作以及3D打印外壳设计,综合性很强。接下来,我会把从元器件选型、电路连接、代码编写到外壳组装的每一个细节,连同我踩过的坑和总结的经验,毫无保留地分享出来。

2. 核心硬件选型与电路设计解析

2.1 核心控制器:为什么是树莓派4B?

在这个项目中,我选择了树莓派4B Model B作为主控。很多人可能会问,用个Arduino或者ESP32不行吗?当然可以,但它们和树莓派的定位不同。Arduino更擅长实时控制,ESP32在无线连接上性价比高,但树莓派的核心优势在于它是一台完整的微型计算机。

选择树莓派4B的主要原因有三点: 强大的计算能力 丰富的接口 成熟的开发生态 。我们的系统需要同时处理多个传感器的数据读取(涉及模拟信号和数字信号)、运行逻辑判断(比如“湿度低于40%且一氧化碳浓度正常则启动加湿”)、驱动外围设备(LCD屏、风扇、加湿器雾化片),还可能需要在后台运行一个轻量级数据库来记录历史数据。树莓派可以轻松地用Python编写一个多线程或异步程序来管理所有这些任务,这是单片机难以比拟的。其自带的40针GPIO接口为连接各种传感器和模块提供了便利,而USB、以太网、Wi-Fi/蓝牙则为未来扩展(如接入家庭物联网平台)预留了空间。

注意 :树莓派4B的功耗和发热比前代大,务必使用官方推荐的5V/3A电源适配器,并考虑加装散热片或小风扇,否则在高负载运行时可能因过热而降频,导致程序卡顿。

2.2 传感器模块:环境感知的“五官”

传感器的选型直接决定了项目的感知能力。我选择了两种类型、三个关键的传感器。

DHT11温湿度传感器 :这是一个数字传感器,通过单总线协议与树莓派通信。它内部已经集成了模数转换电路,所以树莓派直接读取到的就是数字信号,精度对于室内环境监测(温度±2°C,湿度±5%RH)来说足够用了。它的优点是接口简单(只需一根数据线连接一个GPIO口)、价格低廉、有成熟的Python库(如 Adafruit_DHT )支持。接线时,除了数据线(Data),一定要接好电源(VCC)和地线(GND),模块上通常还有一个空置的引脚,不用管它。

MQ-7一氧化碳(CO)传感器 :这是一个模拟传感器。它的核心是一个对一氧化碳敏感的半导体气敏元件,其电阻值会随着CO浓度变化而变化。模块会将这个电阻变化转换为电压信号(模拟量)输出。树莓派的GPIO口本身无法直接读取模拟电压,所以我们需要一个“翻译官”—— MCP3008模数转换器(ADC) 。MQ-7模块的输出引脚(AO)需要连接到MCP3008的某个输入通道上。

水位传感器 :这是一个安全装置,用于防止加湿器在无水状态下干烧。我选用的是简单的模拟式水位传感器,它本质上是一个通过暴露的平行导线测量水导电性的探头。水位越高,导电性越好,输出模拟电压越高。同样,它也需要通过MCP3008来读取。将其安装在储水罐的侧壁合适高度,当水位低于安全阈值时,系统应强制关闭加湿器并报警。

2.3 执行器与驱动电路:让系统“动”起来

系统需要控制两个大功率设备:24V的直流风扇和超声波雾化片。树莓派的GPIO口只能提供3.3V、几十毫安的电流,完全无法直接驱动它们。这就需要用到晶体管或MOSFET作为电子开关。

风扇控制 :我使用了 TIP120达林顿晶体管 。这是一个非常经典的用于中等功率驱动的元件。它的基极(B)通过一个220Ω的限流电阻连接到树莓派的某个GPIO口(例如GPIO17)。当GPIO输出高电平(3.3V)时,TIP120导通,24V电源的电流可以流过它的集电极(C)和发射极(E),从而驱动风扇转动。那个220Ω的电阻至关重要,它限制了流入基极的电流,保护了树莓派的GPIO口。

雾化片控制 :超声波雾化片工作电压较高,通常需要24V或以上,且瞬间电流较大。这里我用了另一个方案:用一个小功率的 BC337 NPN晶体管 去控制一个 5V继电器模块 。树莓派的GPIO口(通过限流电阻)控制BC337的导通与截止,从而控制继电器线圈的通断电。继电器的常开触点则串联在雾化片的24V供电回路中。这样,树莓派用微弱的信号,通过继电器这个“电磁开关”,间接地控制了大功率的雾化片。这种“弱电控强电”的方式既安全又可靠。

LCD显示屏 :我选用了一款常见的1602字符型LCD(16列2行),并搭配了PCF8574 I2C转接板。这样只需要连接SDA、SCL、VCC、GND四根线到树莓派,就能通过I2C协议显示温湿度、CO浓度和系统状态,大大节省了GPIO口,也简化了接线。

2.4 电路连接实战与Fritzing图的重要性

把所有元件正确地连接在一起是成功的第一步,也是最容易出错的一步。我强烈建议,在动手插线之前, 务必使用Fritzing或类似的软件绘制电路图 。这不仅能帮你理清思路,更能避免接错线烧毁元件的悲剧。

我的核心连接逻辑如下:

  1. 电源部分 :5V电源给树莓派、DHT11、MQ-7模块、水位传感器、MCP3008、LCD屏供电。24V电源专门给风扇和雾化片供电。 两个电源的“地”(GND)必须连接在一起 ,形成共同的参考零电位,这是电路正常工作的基础。
  2. 信号部分
    • DHT11的数据线接GPIO4(可自定义)。
    • MCP3008的SPI接口(CLK, MISO, MOSI, CE0)接树莓派对应的SPI引脚。MQ-7的AO接MCP3008的CH0,水位传感器的AO接CH1。
    • LCD的I2C接口(SDA, SCL)接树莓派的SDA1 (GPIO2)和SCL1 (GPIO3)。
    • TIP120的基极通过220Ω电阻接GPIO17,发射极接公共地,集电极接风扇负极(风扇正极接24V+)。
    • 继电器模块的信号输入端(IN)通过一个220Ω电阻接GPIO27,用于控制雾化片。

绘制Fritzing图时,要仔细核对每一个元件的引脚定义。例如,三极管的三个脚(B、C、E)绝对不能接反;MCP3008的引脚序号和方向要看清。完成图纸后,再对照图纸在面包板上一步步搭建电路,每连接一部分,就做一次功能测试,比如先只接DHT11,写个简单脚本看能否读到数据。这种“分步测试、增量集成”的方法能极大提高调试效率。

3. 软件环境配置与核心代码实���

3.1 树莓派系统与SPI接口使能

首先确保你的树莓派已经安装了Raspberry Pi OS(原Raspbian)。系统启动后,打开终端,我们需要启用SPI接口,因为MCP3008 ADC芯片需要通过SPI协议与树莓派通信。

sudo raspi-config

在出现的配置界面中,依次选择:

  1. Interface Options -> SPI -> Yes 启用SPI驱动。
  2. 同样在 Interface Options 中,确保 I2C 也已启用(用于LCD屏)。
  3. 完成后选择 Finish ,并同意重启。

重启后,可以通过以下命令检查SPI和I2C是否已被内核加载:

lsmod | grep -E \"(spi|i2c)\"

如果看到 spi_bcm2835 i2c_bcm2835 之类的模块,说明启用成功。

3.2 Python库依赖安装

我们的控制程序主要用Python编写,需要安装几个关键的库:

sudo apt update
sudo apt install python3-pip python3-venv
pip3 install adafruit-circuitpython-mcp3xxx adafruit-circuitpython-dht RPi.GPIO
pip3 install adafruit-circuitpython-charlcd  # 用于I2C LCD屏
  • adafruit-circuitpython-mcp3xxx :这是Adafruit官方提供的用于MCP3008等ADC芯片的库,封装得很好,读取模拟值非常方便。
  • adafruit-circuitpython-dht :用于读取DHT11传感器数据。注意,DHT11对时序要求较严,这个库能很好地处理。
  • RPi.GPIO :树莓派GPIO控制的基础库,用于控制风扇和继电器的开关。
  • 如果使用其他LCD库(如 RPLCD ),请根据实际情况安装。

3.3 核心控制逻辑代码拆解

程序的核心是一个循环,持续读取传感器数据,根据逻辑规则控制执行器,并更新显示。下面我分块解析关键代码。

3.3.1 传感器数据读取

首先是初始化硬件和库:

import time
import board
import busio
import digitalio
import adafruit_mcp3xxx.mcp3008 as MCP
from adafruit_mcp3xxx.analog_in import AnalogIn
import adafruit_dht
import RPi.GPIO as GPIO
# ... 其他LCD库导入

# 初始化GPIO
GPIO.setmode(GPIO.BCM)
FAN_PIN = 17
HUMIDIFIER_PIN = 27
GPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(HUMIDIFIER_PIN, GPIO.OUT, initial=GPIO.LOW)

# 创建SPI总线及MCP3008对象
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
cs = digitalio.DigitalInOut(board.D8)  # CE0引脚对应GPIO8
mcp = MCP.MCP3008(spi, cs)

# 定义MCP3008的通道,对应MQ7和水位传感器
mq7_channel = AnalogIn(mcp, MCP.P0)  # CH0
water_level_channel = AnalogIn(mcp, MCP.P1) # CH1

# 初始化DHT11,数据引脚接GPIO4
dht11 = adafruit_dht.DHT11(board.D4)

# 初始化LCD(以Adafruit库为例)
i2c = busio.I2C(board.SCL, board.SDA)
lcd = adafruit_charlcd.Character_LCD_I2C(i2c, 16, 2)
lcd.clear()

读取数据的函数需要处理可能的异常,尤其是DHT11偶尔会读取失败:

def read_sensors():
    sensor_data = {\"temp\": None, \"humi\": None, \"co_ppm\": None, \"water_level\": None}
    
    # 读取DHT11
    try:
        sensor_data[\"temp\"] = dht11.temperature
        sensor_data[\"humi\"] = dht11.humidity
    except RuntimeError as e:
        print(f\"DHT11读取失败: {e}\")
        # 这里可以保留上一次的有效读数,或者标记为错误
    
    # 读取MQ-7(模拟值转一氧化碳浓度)
    # MQ-7的输出电压与气体浓度成近似对数关系,需要校准!
    mq7_voltage = mq7_channel.voltage
    # 示例:使用简单的线性近似(实际需根据数据手册和校准确定公式)
    # RS/RO比值法更准确,这里仅为演示
    sensor_data[\"co_ppm\"] = int((mq7_voltage - 0.1) * 1000)  # 假设公式,需替换
    
    # 读取水位(电压越高,水位越高)
    water_voltage = water_level_channel.voltage
    # 假设满水时电压2.5V,无水时0.5V
    sensor_data[\"water_level\"] = int((water_voltage - 0.5) / 2.0 * 100)  # 百分比
    sensor_data[\"water_level\"] = max(0, min(100, sensor_data[\"water_level\"])) # 限制在0-100
    
    return sensor_data

3.3.2 核心控制逻辑与决策

这是智能的体现。我们基于读取的数据,制定控制策略:

def control_logic(sensor_data):
    # 默认状态关闭
    fan_on = False
    humidifier_on = False
    alarm = \"\"
    
    # 安全检查:水位过低,强制关闭加湿器并报警
    if sensor_data[\"water_level\"] is not None and sensor_data[\"water_level\"] < 15:
        humidifier_on = False
        alarm = \"LOW WATER!\"
        # 即使其他条件满足,也优先执行安全关闭
        return fan_on, humidifier_on, alarm
    
    # 规则1:一氧化碳浓度过高,启动风扇通风
    if sensor_data[\"co_ppm\"] is not None and sensor_data[\"co_ppm\"] > 50: # 阈值可调
        fan_on = True
        alarm = \"CO HIGH!\"
    
    # 规则2:湿度过低且温度适中,启动加湿器
    # 同时考虑CO浓度,如果CO高,优先通风,暂不加湿
    if sensor_data[\"humi\"] is not None and sensor_data[\"temp\"] is not None:
        if sensor_data[\"humi\"] < 40 and sensor_data[\"temp\"] > 18:
            if not fan_on:  # 如果风扇没因为CO高而启动,则可以加湿
                humidifier_on = True
                alarm = \"HUMIDIFYING\"
            else:
                alarm = \"VENTING, HUMIDIFY PAUSED\"
    
    # 规则3:湿度过高,关闭加湿器(防冷凝)
    if sensor_data[\"humi\"] is not None and sensor_data[\"humi\"] > 70:
        humidifier_on = False
        if not fan_on:
            alarm = \"HUMIDITY OK\"
    
    return fan_on, humidifier_on, alarm

3.3.3 执行器控制与状态显示

根据决策结果,控制GPIO口输出,并更新LCD屏:

def apply_control(fan_state, humidifier_state, sensor_data, alarm_msg):
    # 控制风扇
    GPIO.output(FAN_PIN, GPIO.HIGH if fan_state else GPIO.LOW)
    # 控制加湿器继电器
    GPIO.output(HUMIDIFIER_PIN, GPIO.HIGH if humidifier_state else GPIO.LOW)
    
    # 更新LCD显示
    lcd.clear()
    # 第一行:温湿度
    lcd.message = f\"T:{sensor_data[\"temp\"]:2.1f}C H:{sensor_data[\"humi\"]:2.0f}%\\n\"
    # 第二行:CO浓度和状态/报警
    co_disp = f\"CO:{sensor_data[\"co_ppm\"]:4d} \" if sensor_data[\"co_ppm\"] else \"CO:--- \"
    lcd.message += co_disp + alarm_msg[:6]  # 显示前6个字符

3.3.4 主循环与数据记录

最后,将一切整合到一个主循环中,并可以考虑加入数据记录功能(如使用SQLite数据库):

import sqlite3
import datetime

# 初始化数据库(仅首次运行需要)
def init_db():
    conn = sqlite3.connect(\'sensor_data.db\')
    c = conn.cursor()
    c.execute(\"\"\"CREATE TABLE IF NOT EXISTS history
                 (timestamp DATETIME, temp REAL, humi REAL, co_ppm INTEGER, water_level INTEGER,
                  fan INTEGER, humidifier INTEGER, alarm TEXT)\"\"\")
    conn.commit()
    conn.close()

def log_data(timestamp, sensor_data, fan_state, humidifier_state, alarm_msg):
    conn = sqlite3.connect(\'sensor_data.db\')
    c = conn.cursor()
    c.execute(\"\"\"INSERT INTO history VALUES (?, ?, ?, ?, ?, ?, ?, ?)\"\"\",
              (timestamp, sensor_data[\"temp\"], sensor_data[\"humi\"],
               sensor_data[\"co_ppm\"], sensor_data[\"water_level\"],
               fan_state, humidifier_state, alarm_msg))
    conn.commit()
    conn.close()

# 主程序
init_db()
print(\"智能加湿器系统启动...\")
try:
    while True:
        # 1. 读取传感器
        data = read_sensors()
        
        # 2. 根据数据做出决策
        fan_state, humidifier_state, alarm = control_logic(data)
        
        # 3. 执行控制并更新显示
        apply_control(fan_state, humidifier_state, data, alarm)
        
        # 4. 记录数据(例如每分钟记录一次)
        current_time = datetime.datetime.now()
        if current_time.second == 0:  # 每分钟整点时记录
            log_data(current_time, data, fan_state, humidifier_state, alarm)
            print(f\"[{current_time}] 数据已记录: {data}\")
        
        # 5. 等待一段时间再循环(例如2秒)
        time.sleep(2)
        
except KeyboardInterrupt:
    print(\"\\n程序被用户中断\")
finally:
    # 清理GPIO,确保所有设备关闭
    GPIO.output(FAN_PIN, GPIO.LOW)
    GPIO.output(HUMIDIFIER_PIN, GPIO.LOW)
    GPIO.cleanup()
    lcd.clear()
    print(\"GPIO已清理,程序退出\")

4. 机械结构设计与组装要点

4.1 外壳设计与3D打印

一个稳定、安全、美观的外壳能让项目从“实验原型”升级为“可用产品”。我的设计主要考虑以下几点:

  1. 功能分区 :外壳分为上下两层。下层是 设备舱 ,固定树莓派、面包板(或后续的PCB)、电源模块、继电器等电子部件。上层是 雾化舱 ,放置超声波雾化片、风扇和水位传感器,并与储水罐连接。这样的物理隔离能防止水汽侵蚀下方的电路板。
  2. 风道设计 :风扇的安装位置和方向至关重要。我的设计是让风扇从设备舱后部或侧部吸入干燥空气,吹向上层的雾化片区域,将产生的水雾从正面的出风口带出。风扇前方最好设计一个格栅,防止手指误触。 务必在组装前测试风扇风向 ,用一张小纸条就能试出来,确保它是向壳内吹风(鼓风)而不是抽风。
  3. 水密性 :雾化舱底部是安装雾化片和水位传感器的地方,这里需要做好防水。雾化片本身是防水的,但其电极引线穿孔处需要用热熔胶或防水密封胶密封。水位传感器的导线穿孔处同样处理。储水罐与雾化舱的接口可以采用螺纹旋紧加橡胶垫圈的方式,确保不漏水。
  4. 散热与维护 :设备舱需要开足够的通风孔为树莓派和电源模块散热。同时,外壳的设计应便于拆装,比如采用螺丝固定而非完全封闭的卡扣,方便日后检修或更换部件。

我使用PLA材料进行3D打印,填充率设为10%-15%以兼顾强度和打印速度。对于有悬垂结构的部分(如内部的支撑柱、风扇格栅),需要启用支撑材料。打印完成后,仔细去除支撑,并用砂纸打磨结合面,确保各部件能平整地组装。

4.2 安全组装与布线工艺

组装顺序建议从内到外:

  1. 固定核心电子部件 :先将树莓派、电源模块用尼龙柱或螺丝固定在外壳底板上。面包板或自制PCB也一并固定好。
  2. 连接内部线缆 :按照之前验证过的电路图,连接所有传感器和执行器到控制板。 强烈建议使用不同颜色的杜邦线或硅胶线 ,例如红色接正极(VCC/V+),黑色或棕色接负极(GND),黄色、绿色等接信号线。这能在复杂的线束中快速定位。线缆长度要合适,预留一点余量但不要过长,用扎带或线卡规整地捆扎好。
  3. 安装上层雾化组件 :将雾化片用防水胶或配套的橡胶圈固定在外壳上层的开孔处。水位传感器固定在侧壁预定高度。风扇用螺丝固定在风道入口。将这些部件的引线穿过设计好的线孔,引到下层设备舱。
  4. 最终连接与密封 :将雾化片、风扇、水位传感器的引线与下层的驱动电路(继电器、TIP120)连接。在所有导线穿过隔板的位置点涂热熔胶,做好密封,防止水汽下渗。最后安装储水罐。
  5. 通电前最终检查 :这是最关键的一步!对照电路图,用万用表通断档或电阻档, 再次检查所有电源线(特别是5V和24V)是否短路 。确认24V大功率回路没有接到树莓派的GPIO口上。确认所有接地线都已可靠连接。

重要安全提示 :本项目涉及220V市电转24V/5V直流电源模块。请务必使用有安全认证的成品电源适配器,切勿自行改装劣质电源。在调试阶段,可以先只用5V部分给树莓派和传感器供电,24V部分暂不连接,待逻辑控制全部调试无误后,再接入24V电源进行整机测试。整个操作应在干燥环境下进行,远离水源。

5. 系统调试、校准与问题排查实录

5.1 传感器校准:让数据更可信

直接从传感器读出的原始值,尤其是模拟传感器,往往不能直接代表真实的物理量,必须经过校准。

DHT11校准 :DHT11作为数字传感器,出厂已校准,通常不需要用户校准。但你可以用一个可靠的温湿度计作为参考,同时读取两者的数值,记录下系统性的偏差(如果有),在代码里进行偏移补偿。例如,如果DHT11始终比参考温度计高0.5°C,那么在代码显示或记录时减去这个偏移量即可。

MQ-7校准(关键且复杂) :这是本项目的难点。MQ-7的模拟输出电压与一氧化碳浓度的关系是非线性的,且受环境温湿度影响。简易校准步骤如下:

  1. 预热 :MQ-7传感器需要通电预热24小时以上,其读数才会趋于稳定。新传感器或长时间未使用的传感器,务必进行充分预热。
  2. 获取基准值 :在洁净空气中(远离烟雾、厨房废气),读取传感器稳定后的输出电压,这个电压值对应的是传感器在洁净空气中的电阻值 R0 (在模块内部已转换为电压)。记录这个电压作为 V0
  3. 建立粗略关系 :如果你有已知浓度的CO气源( 注意:安全第一!必须在通风良好的专业环境下操作,切勿在家尝试 ),可以通入不同浓度的气体,记录对应的输出电压 Vx 。根据传感器数据手册中的灵敏度特性曲线图,可以拟合出一个近似的公式,将 (Vx/V0) 的比值转换为PPM浓度。对于业余项目,更实际的做法是进行 定性而非定量 监测。即,我们关注的是浓度的“相对变化”和“超过安全阈值”。你可以通过点燃一支香烟在远处短暂熏一下传感器(模拟污染),观察电压的上升幅度,将这个幅度设定为你系统的“高浓度报警阈值”。代码中的 50 PPM阈值就需要通过这样的实验来确定对应的电压值。

水位传感器校准 :将传感器插入空水箱,读取电压值 V_low ;将传感器插入满水箱,读取电压值 V_high 。代码中的线性转换公式 百分比 = (V_current - V_low) / (V_high - V_low) * 100 就基于这两个基准点。注意,水的导电性受水质影响,蒸馏水和自来水的读数会不同,建议使用实际应用中的水进行校准。

5.2 典型问题排查速查表

在调试过程中,你几乎一定会遇到下面这些问题。别慌,按表索骥:

问题现象 可能原因 排查步骤与解决方案
树莓派无法启动 电源不足或SD卡问题。 1. 检查电源是否为5V/3A及以上。2. 重新烧录系统镜像到SD卡。3. 检查电源线是否接触良好。
DHT11读取总是失败 接线错误、供电不足、传感器损坏或库问题。 1. 确认VCC、GND、DATA线接对。2. 尝试给DHT11的VCC和GND之间并联一个4.7k-10kΩ的上拉电阻。3. 更换一个DHT11模块试试。4. 确保安装了正确的 adafruit-circuitpython-dht 库。
MQ-7读数一直不变或为0 MCP3008未正确读取或传感器未预热。 1. 用 sudo raspi-config 确认SPI已启用。2. 用万用表测量MQ-7模块的AO引脚对地电压,观察在传感器附近吹气时电压是否有变化。3. 检查MCP3008与树莓派的SPI连接(CLK, MISO, MOSI, CE)。4. 传感器需长时间预热。
风扇/雾化片不工作 驱动电��问题或GPIO控制错误。 1. 首先,在代码中手动设置GPIO口为高电平,用万用表测量该引脚是否有3.3V输出。2. 检查TIP120/BC337的引脚是否接错(B、C、E)。3. 检查24V电源是否正常,用万用表测量风扇/雾化片两端是否有电压。4. 检查继电器模块的指示灯是否随GPIO控制亮灭。
LCD屏无显示 I2C地址错误、接线错误或背光未开。 1. 用命令 i2cdetect -y 1 扫描I2C设备,查看LCD的地址(通常是0x27或0x3F)。2. 在代码中更正I2C地址。3. 检查SDA、SCL、VCC、GND四根线。4. 在代码中尝试打开背光 lcd.backlight = True
系统运行一段时间后死机 树莓派过热或电源不稳定。 1. 触摸树莓派芯片是否烫手,加装散热片和风扇。2. 检查5V电源在树莓派满载时电压是否跌落严重(应不低于4.8V)。3. 检查程序是否有内存泄漏(如无限创建对象),或逻辑错误导致死循环。
加湿器工作但不出雾 雾化片未接触水面或已损坏。 1. 确保储水罐有水,且水位足以淹没雾化片的工作面。2. 断电后,用万用表测量雾化片两电极间电阻,正常应为兆欧级,如果短路或开路则损坏。3. 检查24V电源是否正常加载到雾化片两端。

5.3 从面包板到成品:稳定性优化

在面包板上验证成功后,如果你想让它成为一个能长期稳定运行的设备,建议将电路转移到 洞洞板(万用板) 上进行焊接,或者直接设计一块简单的 PCB 。焊接能消除杜邦线接触不良的隐患。对于大电流路径(如24V到风扇、雾化片的线路),可以使用更粗的导线。将所有电子部件固定在外壳内,避免因移动导致松脱。

此外,考虑为你的Python程序添加 系统服务 ,让它能在树莓派开机时自动启动,并在崩溃时尝试重启。可以创建一个systemd服务文件来实现。同时,实现一个简单的Web界面(使用Flask等轻量级框架)来远程查看数据和手动控制,会让这个项目更加完整和实用。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐