X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
DigiKey得捷技术专区
[作品提交] 【得捷电子Follow me第2期】+任务3:控制WS2812B【光感控幻彩灯】
alanlan86
2023-9-2 19:27
楼主
#准备工作 - Adafruit ESP32-S3 TFT Feather开发板 - (A)支持板载按键(BOOT/BUTTON)作为输入 - (B)板载WS2812B 三色LED灯(集成驱动) ![](https://www.eeworld.com.cn/huodong/digikey_follow_me/image/5483.jpg) - DFRobot的一块模拟环境光传感器板 - (A)光照度范围:支持1~6000Lux - (B)支持3.3V和5V输入,模拟信号输出,采用ESP32的ADC(A0引脚)进行电压采集 - (C) 环境光监测模块介绍资料:https://wiki.dfrobot.com/DFRobot_Ambient_Light_Sensor_SKU_DFR0026 ![](https://dfimg.dfrobot.com/data/DFR0026/20140710/_DSC0318.jpg?imageView2/1/w/564/h/376) #WS2812B ![](https://www.eeworld.com.cn/huodong/digikey_follow_me/image/5483zst.jpg) ###幻彩LED - 虽然在CiruitPython的代码库中,有相对现成的WS2812B的驱动库neopixel,但是从了解和弄清楚原理的角度大家可以详细查阅一下WS2812B的规格书: https://pdf1.alldatasheetcn.com/datasheet-pdf/view/1179113/WORLDSEMI/WS2812B.html ###特性 - WS2812B不仅有LED光源,而且集成了驱动控制部分,可以用串接方式进行连接,使得灯珠阵列连接线简洁方便 - WS2812B每个芯片接收一个24bit的RGB颜色数值,串接之间通过移位进行传递。 - WS2812B识别串接信号线上的”0“和”1“信号是通过判断信号高电平持续时间和低电平的持续时间,进行宽度识别,从而判断出RGB数据。 - 其中,通常的单片机(或其他主控)采用C代码驱动/与WS2812B通信时,会TIMER+GPIO反转,或者硬件SPI传数来实现。满足0和1信号的宽度,即可被WS2812B芯片识别。 #软件设计 ##代码库 - 用到的代码库有:analogio用于环境光模拟信号采集、neopixel和rainbowio做WS2812B控制、asyncio用于多任务调度 ```python import asyncio import time import board import analogio import digitalio from rainbowio import colorwheel import neopixel ``` ##环境光采集 - 在环境光强度低于2000时,将调节彩虹灯闪烁的间隔时间 ```python async def lightbrighneess(controls): while True: print(analog_pin.value) if (analog_pin.value < 2000): controls.delay = 0.5 else: controls.delay = 0.05 await asyncio.sleep(1) ``` ##彩虹灯 ```python def rainbow(delay, state): for color_value in range(255): pixel[0] = colorwheel(color_value) if (state == True): time.sleep(delay) async def blink(controls): """Blink animation on .""" while True: rainbow(controls.delay, False) await asyncio.sleep(controls.delay) ``` ##按键扫描 - 通过轮询扫描按键的状态,进行LED的控制(幻彩LED的旁边的LED灯) ```python async def monitor_button(button, controls): while True: if not button.value: led.value = True else: led.value = False await asyncio.sleep(0) ``` #综合源代码 - 为方便多任务调度以及按键的轮询效果,采用了asyncio模块,进行了多任务的设计 - 整个工程设计了3个task任务:button_task、lightsensor_task、blink_task,分别控制按键、环境光传感器采集、WS2812B闪灯动作 ```python # SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries # SPDX-License-Identifier: MIT """CircuitPython analog pin value example""" import asyncio import time import board import analogio import digitalio from rainbowio import colorwheel import neopixel class AnimationControls: """The controls to allow you to vary the rainbow and blink animations.""" def __init__(self): self.reverse = False self.wait = 1 self.delay = 0.05 def rainbow(delay, state): for color_value in range(255): pixel[0] = colorwheel(color_value) if (state == True): time.sleep(delay) async def lightbrighneess(controls): while True: print(analog_pin.value) if (analog_pin.value < 2000): controls.delay = 0.5 else: controls.delay = 0.05 await asyncio.sleep(1) async def blink(controls): """Blink animation on .""" while True: rainbow(controls.delay, False) await asyncio.sleep(controls.delay) async def monitor_button(button, controls): while True: if not button.value: led.value = True else: led.value = False await asyncio.sleep(0) led = digitalio.DigitalInOut(board.LED) led.direction = digitalio.Direction.OUTPUT button = digitalio.DigitalInOut(board.BUTTON) button.switch_to_input(pull=digitalio.Pull.UP) analog_pin = analogio.AnalogIn(board.A0) pixel = neopixel.NeoPixel(board.NEOPIXEL, 1) pixel.brightness = 0.3 async def main(): animation_controls = AnimationControls() button_task = asyncio.create_task(monitor_button(button, animation_controls)) lightsensor_task = asyncio.create_task(lightbrighneess(animation_controls)) blink_task = asyncio.create_task(blink(animation_controls)) # This will run forever, because no tasks ever finish. await asyncio.gather(button_task, lightsensor_task, blink_task) asyncio.run(main()) ``` #调试
#演示
光感_按键_调光WS2812B
点赞
回复评论 (1)
沙发
lugl4313820
通过轮询扫描按键的状态,进行LED的控制(幻彩LED的旁边的LED灯)
学习了
点赞
2023-9-4 18:26
最新活动
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
Follow me第二季第3期来啦!与得捷一起解锁高性能开发板【EK-RA6M5】超能力!
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
随便看看
【求助】请教大家一个二次表的问题
放大器主要技术参数说明
关于DE2-70中USB只能传输8位数据的问题
晒WEBENCH设计的过程+2.8V-4.2V降压输出2.5V0.8A电路
想进TI的朋友看过来啦,德州仪器笔试真题分享!
2.6.27.10内核linux下matlab2008b使用心得
zigbee路有能力的讨论
电子信息工程好难学
北京 芯嵌工作室承接电子项目 ARM MCU等
PCB_LAYOUT(台湾资深硬件工程师15年Layout资料)
救助:vxworks 下zbuf socket 编程
关于EVC打开资源问题
关于金升阳DCDC模块WRA0515S-3WR2供电不工作的情况
急死我了,各位大虾看看到底怎么解决
SP认证、ICP备案、通信施工企业资质认证申请
在WIN2K或XP下安装byteblasty 2_MV驱动视频教程
TMS320F2812之ADC模块的说明及使用步骤
新唐N76E003
嵌入式:这三个C语言三要素要用好
180V大功率降压
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复