### ex6-1 ### from machine import Pin import utime sw520d = Pin(13, Pin.IN) # 設為讀取模式 while True: print(sw520d.value()) # 讀取狀態 utime.sleep_ms(100) ### ex6-2 ### from machine import Pin, I2C, PWM from ssd1306 import SSD1306_I2C import utime sw520d = Pin(13, Pin.IN, Pin.PULL_UP) oled = SSD1306_I2C(128, 64, I2C(scl=Pin(5), sda=Pin(4))) buzzer = PWM(Pin(15, Pin.OUT), freq=880, duty=0) while True: oled.fill(0) oled.text("Shake status:", 0, 0) # 判斷震動開關狀態 if sw520d.value() == 1: buzzer.duty(512) oled.text("!!! TIPPED !!!", 0, 16) print("!!! 感測器傾倒 !!!") else: buzzer.duty(0) oled.text("- Standby -", 0, 16) print("感測器狀態正常") oled.show() utime.sleep_ms(100) ### ex6-3 ### from machine import Pin, I2C, PWM from ssd1306 import SSD1306_I2C import utime sw520d = Pin(13, Pin.IN, Pin.PULL_UP) oled = SSD1306_I2C(128, 64, I2C(scl=Pin(5), sda=Pin(4))) buzzer = PWM(Pin(15, Pin.OUT), freq=392, duty=0) oled.text("Step counter", 0, 8) oled.show() print("計步器已啟動") count = 0 while True: if sw520d.value() == 1: # 震動開關晃動 # 紀錄震動開關受到晃動的時間起點 start_time = utime.ticks_ms() # 等待震動開關停止晃動 (傳回 0) while sw520d.value() == 1: pass # 什麼事也不做,但用 pass 這句來維持迴圈結構 # 如果搖晃導致狀態改變的時間間隔超過 50 毫秒,代表是正確人為搖晃,步數加 1 if utime.ticks_ms() - start_time > 50: count += 1 print("步數: " + str(count)) buzzer.duty(512) oled.fill(0) oled.text("Count:", 0, 0) oled.text(str(count) + " step(s)", 0, 16) oled.show() # OLED 本身讀寫有時間延遲,故不再加入額外延遲 buzzer.duty(0) ### ex6-4 ### from machine import Pin, I2C, PWM from ssd1306 import SSD1306_I2C import utime, urandom sw520d = Pin(13, Pin.IN, Pin.PULL_UP) oled = SSD1306_I2C(128, 64, I2C(scl=Pin(5), sda=Pin(4))) buzzer = PWM(Pin(15, Pin.OUT), freq=440, duty=0) laser = Pin(16, Pin.OUT) laser.off() oled.fill(0) oled.text("Reaction test", 0, 0) oled.text("SHAKE to start", 0, 16) oled.show() print("反應大考驗 - 搖晃震動開關來啟動測試") while True: if sw520d.value() == 1: # 啟動測試 laser.off() # 倒數 3 秒,用 reversed 讓 i 從 2 減到 0 for i in reversed(range(3)): oled.fill(0) oled.text("Reaction test", 0, 0) oled.text("Ready in " + str(i + 1) + " secs", 0, 16) oled.show() print("倒數 " + str(i + 1) + " 秒...") buzzer.freq(440) buzzer.duty(512) utime.sleep(0.1) buzzer.duty(0) utime.sleep(0.9) buzzer.freq(880) buzzer.duty(512) oled.fill(0) oled.text("Started!", 0, 0) oled.text("SHAKE when laser", 0, 16) oled.text("turns on:", 0, 32) oled.show() print("測試開始! 在雷射光一點亮時搖晃震動開關") utime.sleep(0.3) buzzer.duty(0) utime.sleep(0.7) utime.sleep(3 + urandom.getrandbits(2)) # 隨機等待 3 至 6 秒 laser.on() start_time = utime.ticks_ms() while sw520d.value() == 0: pass # 測到搖晃,計算反應時間 reaction_time = (utime.ticks_ms() - start_time) / 1000 # 報告結果 oled.fill(0) oled.text("Reaction time:", 0, 0) oled.text(str(reaction_time) + " secs", 0, 16) oled.text("SHAKE to start", 0, 40) oled.text("again", 0, 54) oled.show() print("反應時間: " + str(reaction_time) + " 秒") print("測試結束 - 搖晃震動開關以再次測試") buzzer.freq(440) buzzer.duty(512) utime.sleep(0.1) buzzer.freq(880) utime.sleep(0.3) buzzer.duty(0) utime.sleep(1.6) # 結束時停頓片刻,確定開關狀態保持靜止