from machine import Pin, I2C, PWM, ADC
import ssd1306
from time import sleep_ms
# ESP32 Pin assignment
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
key_set = Pin(18, Pin.IN, Pin.PULL_UP)
key_up = Pin(19, Pin.IN, Pin.PULL_UP)
key_down = Pin(23, Pin.IN, Pin.PULL_UP)
BEEP = PWM(Pin(25),freq=1,duty=512) #定义蜂鸣器的PWM在端口25
#BEEP.duty(512) # 设置蜂鸣器的占空比 512
led_r = Pin(14, Pin.OUT)
led_g = PWM(Pin(27),freq=1000,duty=0)
led_b = Pin(26, Pin.OUT)
motor = PWM(Pin(13))
adc = ADC(Pin(34)) # 定义ADC在端口34
# LED灯的亮度不能超过1023,否则跑出异常duty must be from 0 to 1023
adc.width(ADC.WIDTH_10BIT) # 设置ADC的位数为9(0-1023)
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
threshold = 200 #阈值初始化
# 标记是否进入设置模式
setting_mode = False
def key_pros():
# 检查key1是否被按下
global threshold
global setting_mode
if not key_set.value():
sleep_ms(50) # 去抖动
if not key_set.value():
setting_mode = not setting_mode # 切换设置模式
led_r.value(1)
print("进入设置模式" if setting_mode else "退出设置模式")
oled.text('set mode',20,10)
oled.show()
sleep_ms(1000)
oled.fill(0)
while setting_mode:
if not key_up.value():
sleep_ms(100) # 去抖动
if not key_up.value():
threshold += 10
if threshold>=900:
threshold=900
print("阈值增加,当前阈值:", threshold)
oled.text("threshold: "+str(threshold),0,30)
oled.show()
sleep_ms(10)
oled.fill(0)
if not key_down.value():
sleep_ms(100) # 去抖动
if not key_down.value():
threshold -= 10
if threshold<=0:
threshold=0
print("阈值减少,当前阈值:", threshold)
oled.text("threshold: "+str(threshold),0,30)
oled.show()
sleep_ms(10)
oled.fill(0)
if not key_set.value():
sleep_ms(100) # 去抖动
if not key_set.value():
setting_mode = False
oled.text('work mode',20,50)
oled.show()
sleep_ms(1000)
oled.fill(0)
print("退出设置模式")
led_r.value(0)
sleep_ms(100)
if __name__ =="__main__":
led_r.value(0)
led_b.value(0)
motor.duty(0)
oled.text('Hello, Wokwi!', 10, 10)
oled.show()
sleep_ms(1000)
oled.fill(0)
while True:
key_pros()
value = adc.read() # 读取端口34的ADC值
led_g.duty(value)
if value>=threshold:
motor.duty(value)
# 此处加1是因为最小频率是1HZ,否则抛出异常freqency must be from 1Hz to 40MHz
BEEP.freq(value + 1 )
oled.text("value: "+str(value), 0, 10)
oled.text('warning!',50,30)
oled.show()
sleep_ms(100)
oled.fill(1)
sleep_ms(50)
motor.duty(0)
oled.text("value: "+str(value), 0, 10)
oled.text("threshold: "+str(threshold),0,30)
oled.show()
sleep_ms(10)
oled.fill(0)
print(value) # 打印PWM波的占空比
sleep_ms(300)