鱼C论坛

 找回密码
 立即注册
查看: 261|回复: 3

[已解决]如何把2个无关的while循环放在一个项目中,还互不干预

[复制链接]
发表于 2024-2-10 11:51:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我打算做个自动巡线的小车,加一个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[i]=(255,0,0)
        led.write()
        time.sleep(0.05)
        
        led[i-1]=(0,0,0)
        led.write()
        time.sleep(0.1)
    for c in range(6,-1,-1):
        led[c]=(255,0,0)
        led.write()
        time.sleep(0.05)
        
        led[c+1]=(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吧。
最佳答案
2024-2-11 11:41:45
c12tt 发表于 2024-02-11 11:41
我用的micropython,import threading的时候,提示没 ...


很抱歉,Micropython并不直接支持`threading`库。不过,你可以使用`uasyncio`库来实现类似的功能。 `uasyncio` 是一个针对MicroPython的异步IO库,它可以帮助你编写协程和实现简单的多任务。下面是一个使用`uasyncio`的示例代码,可以同时控制灯带和小车运动:

  1. import uasyncio as asyncio
  2. from machine import Pin

  3. # 创建引脚对象
  4. LED1 = Pin(1, Pin.OUT)
  5. gp16 = Pin(16, Pin.OUT)
  6. gp17 = Pin(17, Pin.OUT)

  7. # 控制灯带的协程
  8. async def control_led():
  9.     while True:
  10.         for i in range(8):
  11.             LED1.on()
  12.             await asyncio.sleep(0.05)
  13.             LED1.off()
  14.             await asyncio.sleep(0.1)
  15.         for c in range(6, -1, -1):
  16.             LED1.on()
  17.             await asyncio.sleep(0.05)
  18.             LED1.off()
  19.             await asyncio.sleep(0.1)

  20. # 控制小车运动的协程
  21. async def control_car():
  22.     cc = Pin(0, Pin.IN)
  23.     while True:
  24.         ccc = cc.value()
  25.         if ccc == 0:
  26.             gp16.on()
  27.             gp17.off()
  28.         else:
  29.             gp16.off()
  30.             gp17.off()
  31.         await asyncio.sleep_ms(100)  # 等待100毫秒

  32. # 创建事件循环
  33. loop = asyncio.get_event_loop()

  34. # 启动协程任务
  35. loop.create_task(control_led())
  36. loop.create_task(control_car())

  37. # 执行事件循环
  38. loop.run_forever()
复制代码


在这个示例代码中,我们使用`uasyncio`库来创建两个协程函数`control_led()`和`control_car()`。这两个协程函数分别控制了灯带和小车运动的行为。然后,我们通过`loop.create_task()`方法将这两个协程任务添加到事件循环中。最后,调用`loop.run_forever()`方法来执行事件循环,使得两个协程能够同时运行。

综上所述,使用`uasyncio`库可以实现类似多线程的效果。希望对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-10 11:51:42 | 显示全部楼层
你不需要两个树莓派pico来实现这个功能,你可以将两个循环放在一个程序中,并使用多线程来同时运行它们。每个循环都在一个独立的线程中运行,互不干扰。

首先,你需要导入 `threading` 模块来使用多线程功能。然后,创建两个函数,分别用于控制灯带和小车运动。
  1. import threading

  2. def control_led():
  3.     # 控制灯带的代码
  4.     while True:
  5.         for i in range(8):
  6.             led[i] = (255, 0, 0)
  7.             led.write()
  8.             time.sleep(0.05)
  9.         
  10.             led[i] = (0, 0, 0)
  11.             led.write()
  12.             time.sleep(0.1)
  13.         for c in range(6, -1, -1):
  14.             led[c] = (255, 0, 0)
  15.             led.write()
  16.             time.sleep(0.05)
  17.         
  18.             led[c] = (0, 0, 0)
  19.             led.write()
  20.             time.sleep(0.1)

  21. def control_car():
  22.     # 控制小车运动的代码
  23.     while True:
  24.         ccc = cc.value()
  25.         if ccc == 0:
  26.             gp16.high()
  27.             gp17.low()
  28.         else:
  29.             gp16.low()
  30.             gp17.low()

  31. # 创建两个线程并分别运行两个函数
  32. led_thread = threading.Thread(target=control_led)
  33. car_thread = threading.Thread(target=control_car)
  34. led_thread.start()
  35. car_thread.start()
复制代码

将灯带控制的代码放在 `control_led` 函数中,将小车运动控制的代码放在 `control_car` 函数中。然后,通过 `threading.Thread` 创建两个线程,并分别指定要运行的函数。最后,调用 `start()` 方法来启动这两个线程。

这样,你就可以同时控制灯带和小车运动,而它们互不干预。记得在程序的开头导入所需的模块和库,并进行相应的配置(如定义引脚、导入库等)。

希望能帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我用的micropython,import threading的时候,提示没有threading库,这怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-11 11:41:45 | 显示全部楼层    本楼为最佳答案   
c12tt 发表于 2024-02-11 11:41
我用的micropython,import threading的时候,提示没 ...


很抱歉,Micropython并不直接支持`threading`库。不过,你可以使用`uasyncio`库来实现类似的功能。 `uasyncio` 是一个针对MicroPython的异步IO库,它可以帮助你编写协程和实现简单的多任务。下面是一个使用`uasyncio`的示例代码,可以同时控制灯带和小车运动:

  1. import uasyncio as asyncio
  2. from machine import Pin

  3. # 创建引脚对象
  4. LED1 = Pin(1, Pin.OUT)
  5. gp16 = Pin(16, Pin.OUT)
  6. gp17 = Pin(17, Pin.OUT)

  7. # 控制灯带的协程
  8. async def control_led():
  9.     while True:
  10.         for i in range(8):
  11.             LED1.on()
  12.             await asyncio.sleep(0.05)
  13.             LED1.off()
  14.             await asyncio.sleep(0.1)
  15.         for c in range(6, -1, -1):
  16.             LED1.on()
  17.             await asyncio.sleep(0.05)
  18.             LED1.off()
  19.             await asyncio.sleep(0.1)

  20. # 控制小车运动的协程
  21. async def control_car():
  22.     cc = Pin(0, Pin.IN)
  23.     while True:
  24.         ccc = cc.value()
  25.         if ccc == 0:
  26.             gp16.on()
  27.             gp17.off()
  28.         else:
  29.             gp16.off()
  30.             gp17.off()
  31.         await asyncio.sleep_ms(100)  # 等待100毫秒

  32. # 创建事件循环
  33. loop = asyncio.get_event_loop()

  34. # 启动协程任务
  35. loop.create_task(control_led())
  36. loop.create_task(control_car())

  37. # 执行事件循环
  38. loop.run_forever()
复制代码


在这个示例代码中,我们使用`uasyncio`库来创建两个协程函数`control_led()`和`control_car()`。这两个协程函数分别控制了灯带和小车运动的行为。然后,我们通过`loop.create_task()`方法将这两个协程任务添加到事件循环中。最后,调用`loop.run_forever()`方法来执行事件循环,使得两个协程能够同时运行。

综上所述,使用`uasyncio`库可以实现类似多线程的效果。希望对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 12:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表