如何把2个无关的while循环放在一个项目中,还互不干预
我打算做个自动巡线的小车,加一个ws2812灯带。我用树莓派pico(单片机),其中先写了一个程序是控制ws2812灯带的效果,其中使用到了while,以达到让灯好像霹雳游侠车一样,前脸一排灯来回扫描
如下
from machine
from machine import Pin
LED1=Pin(1,machine.Pin.OUT)
import time
import neopixel
led=neopixel.NeoPixel(LED1,8)
while 1:
for i in range(8):
led=(255,0,0)
led.write()
time.sleep(0.05)
led=(0,0,0)
led.write()
time.sleep(0.1)
for c in range(6,-1,-1):
led=(255,0,0)
led.write()
time.sleep(0.05)
led=(0,0,0)
led.write()
time.sleep(0.1)
-----------------------------------
但是为了让小车检测到障碍就转向,我还得设置另一个while循环。
import machine
import time
from machine import Pin,PWM
gp16 = machine.Pin(16,machine.Pin.OUT)
gp17 = machine.Pin(17,machine.Pin.OUT)
pwm15=machine.PWM(Pin(15), freq=10000, duty_u16=65535)
cc = machine.Pin(0,machine.Pin.IN)#光线传感器
while 1:
ccc=cc.value()
if ccc == 0:
#pwm16.duty_u16(1000)
gp16.high()
gp17.low()
else:
#pwm16.duty_u16(1000)
gp16.low()
gp17.low()
----------------
我现在想让小车的灯程序一直运行的同时,也可以自动避障,让2个循环互不干预,可是我不知道该如何实现,哪位大哥帮忙解答下。
总不会需要2个树莓派pico吧。 你不需要两个树莓派pico来实现这个功能,你可以将两个循环放在一个程序中,并使用多线程来同时运行它们。每个循环都在一个独立的线程中运行,互不干扰。
首先,你需要导入 `threading` 模块来使用多线程功能。然后,创建两个函数,分别用于控制灯带和小车运动。
import threading
def control_led():
# 控制灯带的代码
while True:
for i in range(8):
led = (255, 0, 0)
led.write()
time.sleep(0.05)
led = (0, 0, 0)
led.write()
time.sleep(0.1)
for c in range(6, -1, -1):
led = (255, 0, 0)
led.write()
time.sleep(0.05)
led = (0, 0, 0)
led.write()
time.sleep(0.1)
def control_car():
# 控制小车运动的代码
while True:
ccc = cc.value()
if ccc == 0:
gp16.high()
gp17.low()
else:
gp16.low()
gp17.low()
# 创建两个线程并分别运行两个函数
led_thread = threading.Thread(target=control_led)
car_thread = threading.Thread(target=control_car)
led_thread.start()
car_thread.start()
将灯带控制的代码放在 `control_led` 函数中,将小车运动控制的代码放在 `control_car` 函数中。然后,通过 `threading.Thread` 创建两个线程,并分别指定要运行的函数。最后,调用 `start()` 方法来启动这两个线程。
这样,你就可以同时控制灯带和小车运动,而它们互不干预。记得在程序的开头导入所需的模块和库,并进行相应的配置(如定义引脚、导入库等)。
希望能帮到你!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-2-10 11:51
你不需要两个树莓派pico来实现这个功能,你可以将两个循环放在一个程序中,并使用多线程来同时运行它们。每 ...
我用的micropython,import threading的时候,提示没有threading库,这怎么办 c12tt 发表于 2024-02-11 11:41
我用的micropython,import threading的时候,提示没 ...
很抱歉,Micropython并不直接支持`threading`库。不过,你可以使用`uasyncio`库来实现类似的功能。 `uasyncio` 是一个针对MicroPython的异步IO库,它可以帮助你编写协程和实现简单的多任务。下面是一个使用`uasyncio`的示例代码,可以同时控制灯带和小车运动:
import uasyncio as asyncio
from machine import Pin
# 创建引脚对象
LED1 = Pin(1, Pin.OUT)
gp16 = Pin(16, Pin.OUT)
gp17 = Pin(17, Pin.OUT)
# 控制灯带的协程
async def control_led():
while True:
for i in range(8):
LED1.on()
await asyncio.sleep(0.05)
LED1.off()
await asyncio.sleep(0.1)
for c in range(6, -1, -1):
LED1.on()
await asyncio.sleep(0.05)
LED1.off()
await asyncio.sleep(0.1)
# 控制小车运动的协程
async def control_car():
cc = Pin(0, Pin.IN)
while True:
ccc = cc.value()
if ccc == 0:
gp16.on()
gp17.off()
else:
gp16.off()
gp17.off()
await asyncio.sleep_ms(100)# 等待100毫秒
# 创建事件循环
loop = asyncio.get_event_loop()
# 启动协程任务
loop.create_task(control_led())
loop.create_task(control_car())
# 执行事件循环
loop.run_forever()
在这个示例代码中,我们使用`uasyncio`库来创建两个协程函数`control_led()`和`control_car()`。这两个协程函数分别控制了灯带和小车运动的行为。然后,我们通过`loop.create_task()`方法将这两个协程任务添加到事件循环中。最后,调用`loop.run_forever()`方法来执行事件循环,使得两个协程能够同时运行。
综上所述,使用`uasyncio`库可以实现类似多线程的效果。希望对你有所帮助!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]