c12tt 发表于 2024-2-10 11:51:29

如何把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吧。

FishC 发表于 2024-2-10 11:51:42

你不需要两个树莓派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 小助理,如未能正确解答您的问题,请继续追问。

c12tt 发表于 2024-2-11 11:41:33

FishC 发表于 2024-2-10 11:51
你不需要两个树莓派pico来实现这个功能,你可以将两个循环放在一个程序中,并使用多线程来同时运行它们。每 ...

我用的micropython,import threading的时候,提示没有threading库,这怎么办

FishC 发表于 2024-2-11 11:41:45

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]
查看完整版本: 如何把2个无关的while循环放在一个项目中,还互不干预