from machine import Pin, I2C
import ssd1306
import sys
#*******************************************************
from machine import Pin, PWM, ADC
import machine
import neopixel
import asyncio
import _thread
led = PWM(Pin(5), 5000)
pot = ADC(Pin(36))
pot.atten(ADC.ATTN_11DB)
brightness = int(round(pot.read() / 4))
#协程用async def 来定义, 利用延时的间隙来转移控制权,实现类似并行的效果!
#在协程a中,有一句await asyncio.sleep(0),
#await表示调用协程,
#asyncio.sleep()非阻塞延时(而time.sleep()则表示任何耗时的阻塞函数调用),
#它可将 CPU 的控制权交给下一个协程。
#这儿的asyncio.sleep(0)并不会真的sleep(因为时间为0),但是却可以把控制权交出去。
#
# await 挂起了本次所在协程的执行。
# 执行并等待await后的语句,同时将控制权交出
#设置LED亮度值给PWM
async def led_show():
global brightness
while True:
print("update PWM")
led.duty(brightness)
await asyncio.sleep(0.5) #延时0.5秒
led.duty(0)
await asyncio.sleep(0.5) #延时0.5秒
#电位器 --- 读取亮度值brightness
async def led_update_brightness():
global brightness
while True:
brightness = int(round(pot.read() / 4095 * 1023))
print("update_brightness",brightness)
await asyncio.sleep_ms(1000)
#睡眠3秒
async def a():
while 1:
await asyncio.sleep(3)
print('In a')
#呼吸灯 --- 控制三色灯渐变,
async def b():
v_i=0
while 1:
vg_pin_neopixel=machine.Pin(14,machine.Pin.OUT)
n=neopixel.NeoPixel(machine.Pin(14,machine.Pin.OUT),1,3,1)
v_i=v_i+10
n[0]=(0,v_i,0) #RGB颜色设置
n.write()
await asyncio.sleep(0.3)
print('In b')
#以下定义 3 个协程main1, main2, main3
async def main1():
await asyncio.gather(led_show(), led_update_brightness(),a(),b())
async def main2():
await asyncio.gather(led_show(), led_update_brightness(),a())
async def main3():
await asyncio.gather(b())
# 线程定义
# def thread_1(kk)
# n=0
# while true:
# n=n+1
# if n>100:
# _thread.exit() #满足条件,退出线程
# _thread.start_new_thread(thread_1, (1,))
# time.sleep(10)
#以上运行后,启动线程,同时主程序继续往下执行! 同时主程序继续往下执行!
#线程创建有数量上限限制,好像16个或者18个
#每次创建线程后,加个sleep,可以避免不能创建线程报错的问题
#模式:协程+线程(官方测试版的库) ok
#def run_on_core1():
# asyncio.run(main2())
#def run_on_core0():
# asyncio.run(main3())
#_thread.start_new_thread(run_on_core1, ( ))
#run_on_core0()
#协程执行方法1:ok
asyncio.run(main1())
#协程执行方法2:ok
#event_loop = asyncio.get_event_loop()
#event_loop.create_task(led_show())
#event_loop.create_task(led_update_brightness())
#event_loop.create_task(b())
#event_loop.run_forever()
print(11111111111111)
sys.exit()
#*******************************************************
#2024-06-10: okokok
import asyncio
print("**********************")
async def a():
print('Suspending a')
await asyncio.sleep(5)
print('Resuming a')
async def b():
while 1:
await asyncio.sleep(1)
print('In b')
async def c():
await asyncio.sleep(1.5)
print('In c')
async def main():
await asyncio.gather(a(), b(),c())
if __name__ == '__main__':
while 1:
asyncio.run(main())
print("**********************")
sys.exit()
#*******************************************************
#协程
import asyncio
async def blink(led, period_ms):
while True:
led.on()
await asyncio.sleep_ms(5)
led.off()
await asyncio.sleep_ms(period_ms)
async def main(led1, led2):
asyncio.create_task(blink(led1, 700))
asyncio.create_task(blink(led2, 400))
await asyncio.sleep_ms(3000)
# Running on a generic board
from machine import Pin
asyncio.run(main(Pin(1), Pin(5)))
sys.exit()
"""
#*******************************************************
from machine import Pin, I2C
import ssd1306
# ESP32 Pin assignment
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
oled.text('Hello, Wokwi!', 10, 10)
oled.show()
sys.exit()
"""