711|1

32

帖子

0

资源

一粒金砂(中级)

ESP32学习笔记2---WS2812 16*16 点阵 [复制链接]

距离上一次发帖也有好长时间了,因为工作比较忙所以就把学习进度缓了缓。之后呢 我会努力的更细自己的学习状况和经验分享。

之前买过一条WS2812的灯带,觉得很好玩,就想自己焊一个点阵来玩。就在淘宝上搜了一下这个灯珠,然后无意间看到了这个16*16的点阵。如果是自己做的话这个PCB钱就很贵,然后焊接起来点阵有256个,估计眼睛都能焊花,淘宝上价格也不贵一块板子才55块,所以直接买来玩了。

0495a37b0d6992c4342ed188cb037ed.jpg

 

然后尝试着点亮一些灯源代码如下

from machine import Pin 
from neopixel import NeoPixel 
import time 
p5 = Pin(5,Pin.OUT) ###定义引脚
np = NeoPixel(p5,256)###定义灯的个数
r = g = b = 0
yanse = []   ###缓存区
for i in range (256): ###缓存区赋值
	if i < 80 :
		r = r + 1
	if i >= 80 and i < 160 :
		r = 0 
		g = g + 1
	if i >= 160 :
		g = 0 
		b = b + 1
	yanse.append ((r,g,b))	
for i in range (256):
	np = yanse
np.write()  ###写入

简单的定义了一些颜色

4d4a3c71572c1670e500897c727b9e4.jpg 就开始想着能不能让点阵动起来呢,形成一个跑马灯

from machine import Pin 
from neopixel import NeoPixel 
import time 
p5 = Pin(5,Pin.OUT)
np = NeoPixel(p5,256)
r = g = b = 0
yanse = []
for i in range (256):
	if i < 80 :
		r = r + 1
	if i >= 80 and i < 160 :
		r = 0 
		g = g + 1
	if i >= 160 :
		g = 0 
		b = b + 1
	yanse.append ((r,g,b))	
while 1 :
	for i in range (256):
		np= yanse
	np.write()	
	a = yanse[0]            #保存第一个颜色
	for i in range (256):   #把每一种颜色在列表里面向前挪一位
		if i <255:
			yanse  = yanse [i+1]
		else :
			yanse = a    #把第一个颜色放在255位上 形成一个循环
	

跑马灯.gif

现在呢完成了跑马灯测试,但是灯的颜色还是很少,这个灯说是有256*256*256种颜色,那么我就多写几种颜色吧

from machine import Pin 
from neopixel import NeoPixel 
import time 
p5 = Pin(5,Pin.OUT)
np = NeoPixel(p5,256)
r = g = b = 0
yanse = []
for i in range (256) :#添加多一点颜色
    if i < 32 :
        r = r + 1
    if i >= 32 and i < 64 :
        g = g + 1 
    if i >= 64 and i < 96 :
        r = r - 1
    if i >= 96 and i < 128 :
        b = b + 1 
    if i >= 128 and i < 160 :
        g = g - 1 
    if i >= 160 and i < 192 :
        r = r + 1 
    if i >= 192 and i < 224 :
        g = g + 1
    if i >= 224 :
        r = r - 1
        g = g - 1
        b = b - 1
    yanse.append((r,g,b))
 
while 1 :
	for i in range (256):
		np= yanse
	np.write()	
	a = yanse[0]
	for i in range (256):
		if i <255:
			yanse  = yanse [i+1]
		else :
			yanse = a

快速跑马灯.gif

我这个没有加延时,可以看出来如果是刷新起来的话256个灯还是有点慢的,最起码肉眼可以看得到的

 

那么继续往下走,能不能一排一排的变换呢

因为这个灯的排列方式是蛇形排列的,所以呢要一排一排的变化要有在代码上做点改变

红色的错误.gif

 

如图这么做有一个bug,就是最后所有颜色都会变成第一排的红色,我仔细看了一下我的源代码,发现我保存列表     zhongjian  的时候使用的是全局变量,所以会导致最后都变红。修改后的代码如下:

from machine import Pin 
from neopixel import NeoPixel 
import time 
p5 = Pin(5,Pin.OUT)
np = NeoPixel(p5,256)
r = g = b = 0
yanse = []

def shuzu(): 
    global r,g,b
    for i in range (256) :
        if i < 32 :
            r = r + 1
        if i >= 32 and i < 64 :
            g = g + 1 
        if i >= 64 and i < 96 :
            r = r - 1
        if i >= 96 and i < 128 :
            b = b + 1 
        if i >= 128 and i < 160 :
            g = g - 1 
        if i >= 160 and i < 192 :
            r = r + 1 
        if i >= 192 and i < 224 :
            g = g + 1
        if i >= 224 :
            r = r - 1
            g = g - 1
            b = b - 1
        yanse.append((r,g,b))

def bianhuan():
    zhongjian = []  #改成了局部变量
    for i in range (16) :
        zhongjian.append((yanse))
    j = 16
    for i in range(15) :
        for k in range (1,33,2) :
            yanse[j-k] =yanse[j]
            j = j + 1
    for i in range (16) :
        yanse[255-i] = zhongjian
    for i in range(256) :
        np = yanse

shuzu()
while 1 :
    bianhuan()
    np.write()

动态排变换.gif

这一期我就先做到这里了,下一期我会做汉字的显示和一些动态的小游戏

末尾彩蛋   圣诞之夜 

中间绿色的是一颗圣诞树,然后飘着雪花,雪花可是能堆满消减的。

圣诞之夜.gif

 

如果大家喜欢的话,就点个赞发个品论吧


回复

32

帖子

0

资源

一粒金砂(中级)

那个灯全部变红的我一不小心忘记贴代码了,现在代码如下

from machine import Pin 
from neopixel import NeoPixel 
import time 
p5 = Pin(5,Pin.OUT)
np = NeoPixel(p5,256)
r = g = b = 0
yanse = []
zhongjian = []   #保存颜色的缓存中间列表
def shuzu():    #数组,保存和改变颜色的缓存区
    global r,g,b
    for i in range (256) :
        if i < 32 :
            r = r + 1
        if i >= 32 and i < 64 :
            g = g + 1 
        if i >= 64 and i < 96 :
            r = r - 1
        if i >= 96 and i < 128 :
            b = b + 1 
        if i >= 128 and i < 160 :
            g = g - 1 
        if i >= 160 and i < 192 :
            r = r + 1 
        if i >= 192 and i < 224 :
            g = g + 1
        if i >= 224 :
            r = r - 1
            g = g - 1
            b = b - 1
        yanse.append((r,g,b))

def bianhuan(): #变换队列的函数
    for i in range (16) : #先把前面16位颜色数据保存起来
        zhongjian.append((yanse[i])) 
    j = 16  #第一排已经保存下来了 ,第二排要向前一排,所以从第16位开始
    for i in range(15) : #一共要进行15排的变化
        for k in range (1,33,2) : #第16->15,17->14,18->13以此类推
            yanse[j-k] =yanse[j]
            j = j + 1
    for i in range (16) :  #把最后排颜色更改
        yanse[255-i] = zhongjian[i]
    for i in range(256) :
        np[i] = yanse[i]

shuzu()
while 1 :
    bianhuan()
    np.write()

 


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

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表