311|0

4

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第一期】任务汇总帖 [复制链接]

  本帖最后由 cyz6668 于 2024-9-29 13:04 编辑

        大家好,我是cyz6668,今天向大家分享一下我参与Follow me第一期的任务汇总。汇总视频见【【Follow me第二季第一期】任务汇总(by cyz6668)-【Follow me第二季第一期】任务汇总(by cyz6668)-EEWORLD大学堂】。


        项目简介:搭配必购板子Adafruit Circuit Playground Express完成下方任务。

        入门任务(必做):开发环境搭建,板载LED点亮  

        基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换

        基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度

        基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警

        进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果

        创意任务有创意的可穿戴装饰——可结合多种传感器和灯光效果展示

       

        物料图片:主要用了开发板Adafruit Circuit Playground Express。

        

 

        设计思路分开任务详细介绍。

        本期任务使用的是Adafruit这块开发板,我选择使用Circuit Python对它进行开发。


1. 入门任务:开发环境的搭建和板载LED的点亮

        见【【Follow me第二季第1期】 入门任务:板载LED点亮以及跑马灯效果 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)】。

        首先我们需要下载好烧录所需的.uf2文件和CircuitPython固件库。下载好以后我们将开发板通过USB连接到电脑,电脑识别出新的驱动器CPLAYBOOT,这标志着连接成功。

将之前下载好的.uf2文件复制到驱动器中,等待一段时间,板子呈现红灯全亮的状态,并且之前的驱动器弹出并且重新被识别为CIRCUITPY,即可烧录Python程序。

        之后我们下载本地的Mu Editor用于编写开发板的代码,选择使用Circuit Python,开发环境就搭建完成了。之后将下载好的固件库复制到板子中,这些都是Circuit Playground Library中的函数,提供了各种功能和参考例程。后续的任务都会基于此进行。

        我们试着点亮一下板载LED,代码如下:

from adafruit_circuitplayground import cp
	while True: 
	cp.red_led =True

        实现板载LED灯的点亮效果如下,可以看到D13位置的LED灯点亮。


2. 基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换

        ·见【【Follow me第二季第1期】 入门任务:板载LED点亮以及跑马灯效果 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)】。

        这部分任务需要使用到板子外围的一圈LED灯,并且依次去点亮并赋予不同的颜色。我们使用如下代码亮灯,其中i表示需要点亮的LED灯的编号,三元数组(R,G,B)用于设置灯的颜色。

为了方便实现跑马灯的颜色变换,我们预先设置了一个颜色的列表color,用于存储可能用到的颜色,然后只需要每一盏灯按顺序依次取一种颜色即可,超过取色的列表范围就从头开始取。同时在每一次循环中,LED灯的起始颜色会更新为颜色列表中的下一个颜色,这样,整个LED灯带就会呈现出流动的光效。

        具体的代码如下:

from adafruit_circuitplayground import cp

cp.pixels.brightness = 0.1
num_pixels = 10 
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255),
           (0, 255, 255), (255, 127, 0), (127, 255, 0), (127, 0, 255), (0, 127, 255)]

while True:
    for i in range(num_pixels):
        start_color = i
        for j in range(num_pixels):
            cp.pixels[j] = colors[(i+j)%10]

3. 基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度

        见【【Follow me第二季第1期】 普通任务:光照传感器和温度传感器 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)】。

        这个任务主要涉及温度和光照传感器的使用。

        首先是光照传感器,通过cp.light就可以读取光照传感器采集的数值。此外,教程进一步提供了一个量化光照强度并转换为LED亮灯数量的函数示例。此函数将传感器读数转换为0到9之间的整数,代表亮灯的数量。

        其次再看温度传感器,使用的方法和光照传感器是一样的,通过cp.temperature,可以获取以摄氏度为单位的温度读数。同样地,为了量化温度读数,教程推荐了另一种方法。这种方法不仅直观,而且具有更高的通用性和可复用性,便于迁移至其他传感器的应用。

        回到实际的任务,我们先通过以下的代码,打印一下当前的光照强度和温度,作为我们设置的舒适温度的标准。可以看到光照强度大约是160左右,温度是26℃左右。基于此,我们设定了光照的上限为200,下限为100;温度的上限为30℃,下限为24℃。

        我们对量化函数进行了合并,分别用左右两侧各5盏LED来分别量化表示光照和温度。同时考虑到实际的采集值可能会超过我们设置的阈值,防止两边亮灯互相干扰,此函数限制了亮灯数量的最大值为5,确保了LED显示的一致性和直观性。

        LED灯的状态更新通过编写专门的函数实现,该函数不仅考虑了LED灯的编号顺序,还通过颜色编码区分了不同的环境状态。光照部分都亮白灯;温度部分,适宜温度时亮绿灯,低于适宜温度时亮蓝灯,高于适宜温度时亮红灯,以示区别。

        最后在主循环中去调用这个更新LED状态的函数,将所有的灯按照更新好的状态点亮。我们可以看到左边的温度指示灯和右边的光照指示灯被点亮,视频中也演示了当用手指遮挡光线或者触碰温度传感器,改变光照强度和温度的时候,出现的指示灯数量变化。

        具体的代码如下:

import time
from adafruit_circuitplayground import cp

cp.pixels.auto_write = False
cp.pixels.brightness = 0.1
minimum_light = 0
maximum_light = 200
minimum_temp = 25
maximum_temp = 32
pixels = [0] * 10

def scale_range(value, minimum_value, maximum_value):
	return min(int((value - minimum_value) / (maximum_value - minimum_value) * 5), 5)

def update_leds(peak_light, peak_temp):
	for i in range(10):
		pixels[i] = (0, 0, 0)
	for i in range(peak_light):
		pixels[i] = (255, 255, 255)

	if peak_temp < 3:
		temp_color = (0, 0, 255)
	elif peak_temp == 3:
		temp_color = (0, 255, 0)
	else:
		temp_color = (255, 0, 0)
	for i in range(10 - peak_temp, 10):
		pixels[i] = temp_color
	return pixels

while True:
	print((cp.light,cp.temperature))
	peak_light = scale_range(cp.light, minimum_light, maximum_light)
	peak_temp = scale_range(cp.temperature, minimum_temp, maximum_temp)
	pixels = update_leds(peak_light, peak_temp)
	for i in range(10):
		cp.pixels[i] = pixels[i]
	cp.pixels.show()
	time.sleep(0.05)

4. 基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警

        见【【Follow me第二季第1期】 普通任务:光照传感器和温度传感器 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)】。

        我们的设计思路是通过固定光源照射开发板,并点亮板上所有LED灯来模拟环境光照。当物体接近时,会遮挡外部光源,导致光照传感器只能接收到来自板载LED的光,从而读数下降。相反,当物体非常接近时,其表面的反射作用会增强传感器的读数。基于这一原理,我们设定了当传感器读数异常升高时,触发蜂鸣器发出警报。

        我们编写了以下代码来记录和绘制光照强度的变化曲线。在无遮挡和正常遮挡的情况下,光照传感器的采样值相对比较稳定,分别是120左右和5左右。但是当物体非常接近时,尽管光照传感器采样值出现增大,最大值可以超过250。我们将250设置为安全距离,但是因为物体移动或者不平整等原因,导致比较大的波动,可能会出现一些误判断的情况。

        完整的代码如下:

import time
from adafruit_circuitplayground import cp

while True:
	if cp.light < 140:
		for i in range(10):
			cp.pixels[i] = (0, 0, 255)
		cp.pixels.show()
	elif cp.light > 250:
		for i in range(10):
			cp.pixels[i] = (255, 0, 0)
		cp.pixels.show()
		cp.play_file("dip.wav")
	else:
		for i in range(10):
			cp.pixels[i] = (0, 255, 0)
		cp.pixels.show()
	time.sleep(0.01)

        在无遮挡时,LED显示绿色;当物体遮挡但距离较远时,LED显示蓝色;而当物体非常接近时,LED显示红色,并触发蜂鸣器报警。最终的结果如视频所示。

        我们采用硬纸板是可以反光的,从而使得非常接近板子的时候反而能加强光照传感器的读数。此外,由于物体遮挡和接近板子之间必然经过正常光照的中间状态,可能会导致在某些适中距离下出现误判。未来,我们计划进一步研究如何有效利用红外模块,以提高接近检测的准确性和可靠性。


5. 进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果

        见【【Follow me第二季第1期】 进阶任务:不倒翁和创意可穿戴装饰 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)】。

        我们将使用六轴加速度传感器,以实现一个动态的灯光效果,随着不倒翁的摇摆而变化。

        该任务主要需要使用的传感器可以参考教程中的Acceleration部分。通过传感器可以获取x,y,z三轴的读数,这些读数会随着开发板的空间位置和倾斜情况而变化。利用这些参数,我们可以对LED灯的(R,G,B)三元组进行动态调整,以实现不倒翁在晃动过程中呈现出独特的灯光效果。

        具体的实现代码已经在教程中提供,我们可以直接采用并进行适当的修改。

from adafruit_circuitplayground import cp

while True:
	R = 0
	G = 0
	B = 0
	x, y, z = cp.acceleration
	print((x, y, z))
	cp.pixels.fill(((R + abs(int(x))), 
				(G + abs(int(y))), 
				(B + abs(int(z)))))

        根据不同的倾斜情况的传感器示数,可以调整RGB三色的配比,我们可以根据不同的倾斜情况实现不同的颜色变化。例如,当开发板平放时,灯光可以呈现蓝色;当板子垂直放置时,灯光可以呈现绿色;而当板子垂直后旋转,灯光则可以转变为红色。在视频演示中,我们可以观察到随着开发板的晃动,灯光效果随之不断变化。


6. 创意任务一:有创意的可穿戴装饰——可结合多种传感器和灯光效果展示

        见【【Follow me第二季第1期】 进阶任务:不倒翁和创意可穿戴装饰 - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)】。

        我们设计了一款独特的可穿戴装饰,它不仅拥有绚丽的灯光效果,还具备音乐播放功能,让你在黑夜中也能享受快乐时光。这款装饰巧妙地结合了开发板的LED灯、蜂鸣器以及开关,为用户提供了丰富的互动体验。

        在这款装饰中,我们使用了板载的LED灯和蜂鸣器,以及一个拨动开关和两个按键开关B。拨动开关用于在两种模式之间切换,而按键开关B则用于改变蜂鸣器的音调,使其能够演奏旋律。

        当拨动开关置右时,LED灯进入自动变色模式。当拨动开关置左时,LED灯进入手动变色模式。此时,用户可以通过按下按键B来改变LED灯的颜色,同时蜂鸣器会播放预设的音调。通过连续长按按键B,可以实现蜂鸣器播放旋律,并且LED灯随着旋律顺滑地变换颜色。

        以下是具体的代码实现,首先介绍如何实现LED灯的顺滑切换。

        我们预设了一个RGB颜色的允许取值范围,以确保选取的颜色都是相对正色。然后,我们编写了一个颜色更新函数,每次只从R,G,B三个通道中随机选择一个进行参数在允许的取值内随机改变,这样就保证了连续两个颜色之间不会产生特别大的差异。同时,在每一次颜色改变后,我们都会检查RGB三者是否同时取到了0,如果是,则会将这一次改变的通道在除了0以外的值内重新随机选择。

        其次我们介绍如何实现蜂鸣器的旋律播放。我们根据乐谱C调中低音do到高音do的频率,将一首乐曲Funky Town(鸡块旋转小曲)的旋律转换成频率的列表。每次检测到按键B被按下,蜂鸣器自动播放下一个音调。当按键B被长按时,就实现了旋律的连续播放。

        最终把两者结合起来,具体代码如下:

import time
import random
from adafruit_circuitplayground import cp

color_values = [0, 63, 127, 191, 255]
current_color = [255, 255, 255]
cp.pixels.brightness = 0.1
tone_list = [454,454,422,454,-1,358,-1,358,454,550,518,454,
             358,358,326,358,-1,262,-1,262,358,454,422,358]

def change_color(current_color):
	channels = ['R', 'G', 'B']
	channel = random.choice(channels)
	new_value = random.choice(color_values)

	if channel == 'R':
		current_color[0] = new_value
	elif channel == 'G':
		current_color[1] = new_value
	else:
		current_color[2] = new_value

	if current_color == [0, 0, 0]:
		new_value = random.choice(color_values[1:])
	if channel == 'R':
		current_color[0] = new_value
	elif channel == 'G':
		current_color[1] = new_value
	else:
		current_color[2] = new_value

	return current_color

flag = 0    
while True:
	for i in range(10):
		cp.pixels[i] = current_color

	if cp.switch:
    		current_color  = current_color
    		if cp.button_b:
			cp.play_tone(tone_list[flag], 0.1)
			current_color = change_color(current_color)
			flag = (flag + 1)%24
	else:
    		flag = 0
    		current_color = change_color(current_color)

	cp.pixels.show()
	time.sleep(0.1)

        在视频演示中,我们可以看到,当拨动开关置右时,LED灯自动切换颜色;当拨动开关置左且按键B被按下时,LED灯手动切换颜色,同时蜂鸣器播放旋律。这一互动体验不仅增加了装饰的趣味性,也提升了用户的参与感。


对本次活动的心得体会与建议:

参加这次电子开发板试玩活动,我收获颇丰。

我的技术水平通过这次学习得到提升,我通过实际操作,我对这款开发板的特性和使用方法有了全面的了解,提升了我的硬件编程和调试技能。
对我的创新思维也有启发作用。看到其他同学的创意项目,激发了我的创新思维,启发我在未来的项目中尝试更多新的想法。
团队合作:通过与小组成员的合作,我学会了如何在团队中有效沟通和协作,这对于任何项目都是非常重要的。
社区交流:活动中认识了很多志同道合的朋友,建立了宝贵的联系。这些交流不仅有助于技术上的成长,也为未来可能的合作打下了基础。
总之,这次活动不仅让我学到了新的知识和技术,更重要的是激发了我对电子开发的热情。我相信这些经验和心得将对我的未来发展大有裨益。

我希望后面可以推出更多相关的活动,更高难度的工作,并且可以有相关更详尽的课程学习。


        以上就是这次任务的汇报,代码暂时还没有通过审核,附在帖子后面了,欢迎大家批评指正!

         Follow me第二季第一期Code by cyz6668.zip (2.57 KB, 下载次数: 2)
点赞 关注
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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