Arduino 倾斜提醒器:持续歪倒两秒才亮灯,过滤短暂晃动

2026-10-17 / 0 评论 / 1 阅读

Arduino 倾斜提醒器:持续歪倒两秒才亮灯,过滤短暂晃动 教程示意图

发布日期:2026-10-17。

适用场景

想知道桌面收纳盒是否被持续放倒,却不希望轻碰一下就触发提醒,可以使用滚珠倾斜开关配合延时判断。本教程使用 Arduino UNO R3、一个不含汞的两脚滚珠倾斜开关和板载指示灯,实现持续异常两秒后亮灯、恢复正常姿态后熄灯。它适合作为编程与传感器入门实验,不用于人员安全、运输责任认定或精确角度测量。

原理:先确认触点,再判断持续时间

滚珠开关内部通过滚珠位置改变通断状态,它输出的是接通或断开,无法告诉程序具体倾斜了多少度。器件的安装方向会影响触发姿态,需要实际调整。可参阅 Adafruit 倾斜开关教育教程。

把开关接在数字引脚和地之间,并启用内部上拉后,开关断开时读到高电平,接通时读到低电平。本例约定正常姿态接通、异常姿态断开。因此断线也会被视为异常,但这不等于系统具备完整的故障诊断能力。内部上拉的接线逻辑见 Arduino 官方输入上拉示例。

程序采用两层判断:原始电平连续稳定 40 毫秒后才接受为新状态;接受异常状态后,再等待两秒才报警。前者减少触点抖动的影响,后者过滤短暂姿态变化。计时使用毫秒计数相减,主循环可以持续读取输入,不需要暂停两秒。

准备工作

准备 UNO R3、两脚无源滚珠倾斜开关、面包板、跳线、一只 1 千欧电阻及 USB 数据线。不要用三脚模块直接替换两脚开关,因为模块可能有额外供电和输出逻辑。板载灯已有板上配套电路,本例不增加外部灯,也不驱动蜂鸣器或电机。

先拔掉 USB,再把 D2 经 1 千欧电阻连接开关一端,另一端接 GND。电阻作为接线误设情况下的附加限流,不代替正确配置引脚。不要把开关接到 5V 与 GND 之间,否则闭合时会形成电源短路。

分步骤操作

第一步:固定开关方向

用胶带临时固定开关,避免金属引脚接触其他导体。在不接开发板电源的情况下,可用万用表通断档观察两种姿态,选定正常姿态能够稳定接通的安装方向。如果轻微移动就连续通断,应调整角度,让正常位置离切换边界远一些。

第二步:上传程序

连接 USB,在开发环境中选择开发板(Board)为 Arduino UNO,再选择端口(Port)。新建程序并完整替换为以下代码,先验证(Verify),再上传(Upload)。

const byte tiltPin = 2;
const unsigned long debounceMs = 40;
const unsigned long alarmMs = 2000;

int rawState;
int stableState;
unsigned long rawSince;
unsigned long stableSince;
bool lastAlarm = false;

void setup() {
  pinMode(tiltPin, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  Serial.begin(9600);
  rawState = digitalRead(tiltPin);
  stableState = rawState;
  rawSince = millis();
  stableSince = rawSince;
  Serial.println("READY");
}

void loop() {
  unsigned long now = millis();
  int reading = digitalRead(tiltPin);

  if (reading != rawState) {
    rawState = reading;
    rawSince = now;
  }

  if (stableState != rawState &&
      now - rawSince >= debounceMs) {
    stableState = rawState;
    stableSince = now;
  }

  bool alarm = stableState == HIGH &&
               now - stableSince >= alarmMs;
  digitalWrite(LED_BUILTIN, alarm ? HIGH : LOW);

  if (alarm != lastAlarm) {
    Serial.println(alarm ? "ALARM" : "OK");
    lastAlarm = alarm;
  }
}

代码可以直接用于上述接线。tiltPin 表示实际使用的输入引脚;若改接其他数字引脚,要同步修改它。debounceMs 是消抖时间,alarmMs 是稳定异常后的等待时间,单位均为毫秒。LED_BUILTIN 指 UNO 的板载灯,不是需要填写的外部引脚编号。非阻塞计时思路可参阅 Arduino 官方无延时闪灯示例。

第三步:观察状态变化

打开串口监视器(Serial Monitor),波特率设为 9600。启动时应出现 READY。保持正常姿态,板载灯应熄灭;把盒子放倒并保持超过两秒,灯应点亮并输出 ALARM;恢复正常姿态后,经过消抖确认,灯熄灭并输出 OK。串口只在报警状态变化时输出,避免大量重复信息掩盖关键事件。

第四步:安装到桌面物件

先拔掉 USB,再把开关和面包板固定到轻便的非金属盒体上,给跳线留出余量。重新接电后重复验证。安装完成后触发方向可能与手持实验不同,应以固定后的结果为准。

验证方法

分别检查正常静置、短暂放倒、持续放倒和恢复正常四种情况。短暂异常应明显短于两秒,例如约半秒。持续异常应明显长于两秒,例如三秒。开机时已经处于异常姿态,也应在等待后报警。这里的两秒从软件接受稳定异常状态后开始计算,不能理解成精密测量的机械动作时刻。

常见错误

一直报警,先检查开关方向、断线和引脚编号;一直不报警,检查 D2 是否被错误地永久接地。串口乱码通常与波特率不一致有关。若晃动时偶尔亮灯,应先检查是否真的保持了异常电平,而不是一味增大消抖时间。滚珠开关本身存在机械差异,软件无法把它变成精确的角度传感器。

安全与回退

实验只使用 USB 提供的低压直流供电,所有改线必须先断电,保留串联限流电阻。不要同时接外部电源,不要连接高压负载。若板子发热或电脑提示 USB 过流,立即断开并检查接线。需要回退时,断电拆下开关线路,再通过开发环境上传原先保存的程序即可。

参考资料与转载说明

本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。

评论一下?

OωO
取消