### lab4-1 ### from machine import Pin, I2C from ssd1306 import SSD1306_I2C import bh1750fvi, utime i2c = I2C(scl = Pin(5), sda = Pin(4)) oled = SSD1306_I2C(128, 64, i2c) while True: light_level = bh1750fvi.sample(i2c, mode = 0x23) oled.fill(0) oled.text("Light level:", 0, 0) oled.text(str(light_level) + " lux", 0, 16) oled.show() print("偵測亮度: " + str(light_level) + " lux") ### lab4-2 ### from machine import Pin, PWM, I2C from ssd1306 import SSD1306_I2C import bh1750fvi, utime i2c = I2C(scl = Pin(5), sda = Pin(4)) oled = SSD1306_I2C(128, 64, i2c) buzzer = PWM(Pin(15, Pin.OUT), freq = 110, duty = 0) while True: light_level = bh1750fvi.sample(i2c, mode = 0x23) print("偵測亮度: " + str(light_level) + " lux") oled.fill(0) oled.text("Light level:", 0, 0) oled.text(str(light_level) + " lux", 0, 16) if 20 < light_level < 300: oled.text("!! Warning !!", 0, 32) oled.text("TOO DARK", 0, 48) print("警告 !! 亮度不足 !!") buzzer.freq(110) buzzer.duty(512) else: buzzer.duty(0) oled.show() ### lab4-3 ### from machine import Pin, I2C, PWM import bh1750fvi, utime score = 0 buzzer = PWM(Pin(15, Pin.OUT), freq = 784, duty = 0) while score < 10: light_level = bh1750fvi.sample(I2C(scl = Pin(5), sda=Pin(4)), mode = 0x23) print("偵測亮度: " + str(light_level) + " lux, 得分: " + str(score)) if light_level > 10000: print("==== 命中! ====") score += 1 # 播放得分音效 buzzer.freq(784) buzzer.duty(512) utime.sleep_ms(100) buzzer.freq(988) utime.sleep_ms(300) buzzer.duty(0) utime.sleep_ms(10) print("=== 遊戲結束! ===") # 播放遊戲結束音效 buzzer.freq(784) buzzer.duty(512) utime.sleep_ms(100) buzzer.freq(659) utime.sleep_ms(100) buzzer.freq(523) utime.sleep_ms(300) buzzer.duty(0) ### lab4-4 ### from machine import Pin, I2C, PWM import bh1750fvi, utime def getLightLevel(): data = bh1750fvi.sample(I2C(scl = Pin(5), sda = Pin(4)), mode = 0x23) return data buzzer = PWM(Pin(15, Pin.OUT), freq = 768, duty = 0) count = 0 print("系統校準中, 請讓雷射持續照射在亮度感測器5秒鐘...") while count < 5: # 雷射校準迴圈 light_level = getLightLevel() if light_level > 10000: # 偵測到雷射光 count += 1 print("已校準 " + str(count) + " 秒...") else: count = 0 # 歸零重新校準 utime.sleep_ms(1000) while True: # 雷射偵測迴圈 light_level = getLightLevel() if light_level < 10000: # 雷射光被遮斷 print("!! 警報觸發 !!") buzzer.duty(512) else: buzzer.duty(0) print("-- 待命中 --")