# author: Suroy
# mail: [email protected]
# blog: https://suroy.cn
from machine import Pin, I2C, PWM, ADC
import ssd1306
import time
# ESP32 Pin assignment
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
led = Pin(2, Pin.OUT)
# init oled
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
def play_note(note_name, buzzer_pin=15, duration=0.5):
"""
使用蜂鸣器播放指定的音符。
Args:
note_name: 要播放的音符名,例如 'C4', 'A#4'。
buzzer_pin: 蜂鸣器连接的引脚,默认为15。
duration: 音符播放的时长,单位为秒,默认为0.5秒。
"""
# 定义音符频率字典
notes_freq = {
'C4': 262, 'D4': 294, 'E4': 330, 'F4': 349,
'G4': 392, 'A4': 440, 'B4': 494, 'C5': 523,
'C#4': 277, 'D#4': 311,
'F#4': 370, 'G#4': 415, 'A#4': 466,
}
pwm = PWM(Pin(buzzer_pin))
if note_name in notes_freq:
frequency = notes_freq[note_name]
pwm.freq(frequency)
pwm.duty_u16(32768) # 设置占空比为50%
time.sleep(duration)
pwm.duty_u16(0) # 关闭声音
else:
print("Invalid note name!")
pwm.deinit() # 释放PWM资源
def read_finger(pin=34):
adc = ADC(Pin(pin)) # create an ADC object acting on a pin
val = adc.read() # read a raw analog value
voltage = val / 4095 * 3.3
return val
def handle_one_finger(pin, angle_a_tone, angle_b_tone):
angle_a = 200
angle_b = 600
if read_finger(pin) > angle_b: # angle b
play_note(angle_b_tone)
return True
elif read_finger(pin) > angle_a: # angle a
play_note(angle_a_tone)
return True
return False
while True:
f1 = handle_one_finger(34, 'C4', 'D4') # finger 1
f2 = handle_one_finger(35, 'E4', 'F4') # finger 2
f3 = handle_one_finger(32, 'G4', 'A4') # finger 3
f4 = handle_one_finger(33, 'B4', 'C5') # finger 4
f1_text = 'F1: ' + '*' if f1 else '-'
f2_text = 'F2: ' + '*' if f2 else '-'
f3_text = 'F3: ' + '*' if f3 else '-'
f4_text = 'F4: ' + '*' if f4 else '-'
oled.text('Fingers Recovery', 10, 10)
oled.text(f1_text + ' ' + f2_text, 10, 25)
oled.text(f3_text + ' ' + f4_text, 10, 45)
oled.show()
# 监测到电流通过
if f1 or f2 or f3 or f4:
led.on()
else:
led.off()