滚珠开关(也叫倾斜开关、震动开关)是两脚元件,一根小管子里装着一颗钢珠,靠钢珠滚动接通或断开电路。
[接线图占位,后续添加]
文字说明(具体接法见下方代码注释):
GP14GNDPin.PULL_UP),不需要外接电阻先别急着写功能。拿着开关慢慢转一圈,看串口读数在什么姿势下变——每只开关的导通角度都不太一样。
# ============ 接线 ============
# 滚珠开关 一脚 → Pico GP14
# 滚珠开关 另一脚 → Pico GND(内部上拉,无需外接电阻)
# =============================
from machine import Pin
import time
tilt = Pin(14, Pin.IN, Pin.PULL_UP) # 内部上拉:导通读到 0,断开读到 1
print('慢慢转动手里的开关,看读数的变化')
while True:
if tilt.value() == 0: # 导通:钢珠滚到触点上了
print('导通')
else: # 断开:钢珠停在另一头
print('断开')
time.sleep_ms(200) # 每 200 毫秒看一眼
摇的时候钢珠会连续碰出很多下。我们要的不是"通不通",而是"摇了几下",所以用一个时间门槛把同一摇的抖动并成一下。
# ============ 接线 ============
# 滚珠开关 一脚 → Pico GP14
# 滚珠开关 另一脚 → Pico GND(内部上拉,无需外接电阻)
# =============================
from machine import Pin
import time
tilt = Pin(14, Pin.IN, Pin.PULL_UP)
SHAKE_GAP = 120 # 消抖门槛(毫秒):两次通断间隔小于它,算同一下抖动
shake = 0 # 计数器:摇了几下
last = 0 # 上一次有效摇动的时刻
def on_shake(pin): # 中断回调:开关一导通就自动跳进来
global shake, last # 要改函数外的变量,必须声明 global
now = time.ticks_ms() # 取当前时刻(毫秒)
if time.ticks_diff(now, last) > SHAKE_GAP: # 距上次够久了
shake += 1 # 才算新的一下
print('摇动次数 =', shake)
last = now # 记下这次时刻,供下次比较
tilt.irq(trigger=Pin.IRQ_FALLING, handler=on_shake) # 导通瞬间(下降沿)触发
while True:
time.sleep_ms(200) # 计数交给中断,主循环歇着
倾斜后持续导通,就当成"倒了"——蜂鸣器响、LED 亮。加一个时长门槛,路过的小震动就不会误报。
# ============ 接线 ============
# 滚珠开关 一脚 → Pico GP14,另一脚 → Pico GND(内部上拉)
# 有源蜂鸣器模块 VCC → 3V3,GND → GND,I/O → GP15
# LED 长脚(正极) → 220Ω 电阻 → GP16,短脚(负极) → GND
# =============================
from machine import Pin
import time
tilt = Pin(14, Pin.IN, Pin.PULL_UP) # 开关
buzzer = Pin(15, Pin.OUT) # 蜂鸣器
led = Pin(16, Pin.OUT) # 报警灯
HOLD_MS = 300 # 连续导通超过这个时长才算真的倒了
held = 0 # 已连续导通的时长
print('倾倒报警已启动')
while True:
if tilt.value() == 0: # 导通中
held += 20 # 累计(下面每次循环等 20 毫秒)
if held >= HOLD_MS: # 持续够久了
buzzer.on() # 蜂鸣器响
led.on() # 灯亮
else: # 断开:复位
held = 0
buzzer.off()
led.off()
time.sleep_ms(20) # 20 毫秒一轮
Pin(14, Pin.IN, Pin.PULL_UP)。不开上拉,断开时引脚悬空,读数会乱跳SHAKE_GAP 并成一下sleep,显示和判断都留给主循环Q: 读数一直不变? A: 先拿基础示例慢慢转一圈——很可能你现在的姿势正好卡在它固定导通(或固定断开)的角度上。怎么转都不变,就查两脚有没有一脚确实接到了 GND。
Q: 摇一下,计数加了好几下?
A: 钢珠滚动本身就是连续通断,属正常现象。把 SHAKE_GAP 从 120 往上调(200 以上),或者改用应用示例那种"持续导通才动作"的判法。
Q: 放着不动它自己也在计数?
A: 桌面震动、风吹都会让珠子动。换个稳的地方放,或把 SHAKE_GAP 调大。
Q: 它和按键有什么区别? A: 接口完全一样(数字输入 + 内部上拉),代码结构可以照搬按键。区别在动作方式:按键靠手按,它靠倾斜和摇动,而且一次摇动会产生一串通断,所以要配消抖。