基于Raspberry Pi、SW-420振动传感器与Python的洗衣机检测问题求助
解决SW-420振动传感器检测洗衣机状态时的误报问题
嘿,这个问题我之前帮朋友调试类似的家电振动检测项目时也碰到过——SW-420本质是个触发式振动开关,它的输出是高低电平跳变,很容易被洗衣机运行过程中的短暂停振(比如脱水前的停顿、注水后的间歇)误导,误判成停机状态。给你几个经过实际验证的解决方案:
1. 增加时间窗口滤波(最易实现)
不要仅凭单次传感器状态就判定停机,而是统计一段时间窗口内的振动触发频率。比如设定:只有连续3-5秒内,振动触发次数低于某个阈值(比如2次),才认定为真正停机。
举个简单的Python实现示例,用滑动窗口统计触发次数:
import time import RPi.GPIO as GPIO SENSOR_PIN = 17 # 配置参数:5秒窗口内至少触发3次才算有振动 TIME_WINDOW = 5 MIN_TRIGGERS = 3 def setup_gpio(): GPIO.setmode(GPIO.BCM) GPIO.setup(SENSOR_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) def get_vibration_status(): trigger_count = 0 start_time = time.time() # 在时间窗口内统计触发次数 while time.time() - start_time < TIME_WINDOW: if GPIO.input(SENSOR_PIN) == GPIO.HIGH: trigger_count += 1 time.sleep(0.2) # 防抖,避免同一振动被重复计数 return trigger_count >= MIN_TRIGGERS def main(): setup_gpio() washer_running = False try: while True: has_vibration = get_vibration_status() if has_vibration and not washer_running: print("洗衣机已启动") washer_running = True elif not has_vibration and washer_running: print("洗衣完成!触发Hue灯泡闪烁") # 这里插入你的Hue灯泡控制代码 washer_running = False time.sleep(1) finally: GPIO.cleanup() if __name__ == "__main__": main()
2. 调整传感器硬件灵敏度
SW-420模块上有个小型电位器,你可以用螺丝刀微调它:
- 顺时针拧:降低灵敏度,只对较强的持续振动有反应
- 逆时针拧:提高灵敏度,轻微振动就会触发
现场调试时,可以边拧边观察传感器输出,直到它能过滤掉洗衣机运行时的短暂间歇,同时又能准确捕捉停机后的无振动状态。
3. 引入多维度判断(进阶方案)
如果条件允许,搭配一个电流检测模块(比如ACS712),同时监测洗衣机的电流消耗:
- 洗衣机运行时,电流会维持在一个稳定区间(比如1-3A,取决于机型)
- 停机后,电流会骤降到接近0
在Python里通过ADC读取电流模块的数值,把振动状态+电流状态做逻辑与判断,误报率会大幅降低。比如:只有当振动消失+电流低于阈值时,才触发停机动作。
4. 优化状态机逻辑
设计一个简单的状态机来管理洗衣机状态:
- 初始状态:
待机 - 当检测到连续10秒内多次振动,切换到
运行中 - 只有在
运行中状态下,连续10秒无振动,才切换到已完成,触发Hue灯泡闪烁
这种方式能有效过滤掉运行过程中的短暂停振,避免误触发。
内容的提问来源于stack exchange,提问作者Jakov Grams
相关产品推荐
相关产品推荐

