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)


$abcdeabcde151015202530fghijfghij