本帖最后由 白菜虫虫 于 2024-10-10 18:06 编辑
【Follow me第二季第1期】
很开心可以参加这一期的Follow me活动,感谢EEworld和得捷联合举办的这次活动给了我一次很好的学习提高的机会,通过这次的学习,我基本掌握了CircuitPython和SAMD21的使用,受益颇丰。下面是我这次学习情况汇报:
开发方式我选择的是官方的CircuitPython(后面简称CPY),选择CPY的愿意有以下几个:一是这是官方固件,稳定性有保障;二是CPY的库很全面,不需要再到网上去找库;三是以前没有接触过,以这次活动为契机学习提高下自己。
物料展示:
入门任务(必做):开发环境搭建,板载LED点亮
1.下载最新的CircuitPython固件。
1.1下载固件:打开CircuitPython官网,点击DOWNLOAD,选择Adafruit Circuit Playground Express,就可以下载小圆板的专用固件,固件有英文、拼音等等各个语言的版本,我先尝试了一下拼音的版本,感觉挺别扭的,得一个一个字读出音来再连起来品意思,所以还是换回英文吧,英文有美国英语和英国英语,也不知道啥区别就随便下个吧。
CircuitPython固件下载地址:
1.2烧录CircuitPython固件:
Adafruit Circuit Playground Express小圆板烧录固件还是很简单的,简单到都不需要额外的软件。使用USB数据线连接小圆板,等待驱动安装完毕。这时候自带的出厂固件就会开始跑马灯,按D4键会发出音乐,按D5件会改变亮度(貌似),拨动D7则会改变跑马灯的方向。
按住D4再按reset键,会弹出U盘,把下载好的固件拖进U盘里面,等待重启(到这里跟树莓派PICO差不多),会弹出一个名为CIRCUITPY的U盘,则说明固件烧录成功(这里则跟树莓派PICO不一样)。
固件烧录前:
固件烧录后:
2.编辑软件准备。
2.1安装Thonny:
本来听说Mu和CircuitPython更配,但折腾了一下,发现还是Thonny更好用。
下载安装Thonny就不细说了,常玩MPY的大佬们朋友们都有,没有的兄弟们浏览器搜索一下很好找。
2.1配置Thonny:
在使用Thonny开始我们的编程前,我们还需要做一些配置。
①打开Thonny,点击右下角开发板串口标志,点击配置编辑器。
或者点击菜单栏运行,在点击配置编辑器。
②在Thonny应该使用那种解释器来运行您的代码选项中点击下拉菜单,选择CircuitPython(通用),然后点击好的。
③用USB数据线连接板子到电脑,再次点击右下角开发板串口标志,选择自己的开发板串口号就可以了。
连接成功的话Thonny就会出现类似下图的显示,开发板同时会亮起白光。如果连接失败可以尝试按下开发板RESET,点击Thonny的STOP按钮,或者组合使用。
3.点亮一个LED。
CircuitPython其实和MicroPython很多地方是类似的,都要先引用开发板定义和相关库。为了点亮板载的WS2812,我们需要引用board和neopixel,前者是开发板定义,后者是WS2812的驱动库。
然后我们输入如下程序:
import neopixel
from board import *
pixels = neopixel.NeoPixel(NEOPIXEL, 10)
pixels[0] = 0x100010
点击运行当前脚本(绿圈白三角的按钮),开发板上的第一个LED就成功的被点亮了。
基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
打开指南16页,可以看到WS2812彩灯的介绍。
下面细说一下程序:
①首先还是引用需要的库文件
import neopixel
from board import *
import time
②定义颜色代码:
COLOR = [
[255, 0, 0], # 红色
[255, 60, 0], # 橙色
[255, 255, 0], # 黄色
[0, 255, 0], # 绿色
[0, 255, 255], # 青色
[0, 0, 255], # 蓝色
[180, 0, 255], # 紫色
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]
③初始化NeoPixel
pixels = neopixel.NeoPixel(NEOPIXEL, 10, brightness=0.1,auto_write=False)
④编写NeoPixel流水灯代码:
def one_cycle(color):
pixels.fill(0)
pixels.show()
time.sleep(DELAY)
for i in range(10):
pixels.fill(0)
pixels[i] = color
pixels.show()
time.sleep(DELAY)
下面是完整的任务一代码:
#【Follow me第二季第1期】白菜虫虫
# 基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
import neopixel
from board import *
import time
DELAY = 0.1
COLOR = [
[255, 0, 0], # 红色
[255, 60, 0], # 橙色
[255, 255, 0], # 黄色
[0, 255, 0], # 绿色
[0, 255, 255], # 青色
[0, 0, 255], # 蓝色
[180, 0, 255], # 紫色
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]
pixels = neopixel.NeoPixel(NEOPIXEL, 10, brightness=0.1,auto_write=False)
def one_cycle(color):
pixels.fill(0)
pixels.show()
time.sleep(DELAY)
for i in range(10):
pixels.fill(0)
pixels[i] = color
pixels.show()
time.sleep(DELAY)
def rainbow_cycle(n):
pixels.fill(0)
for i in range(n+10,n,-1):
pixels[(i)%10] = COLOR[10+n-i]
pixels.show()
time.sleep(DELAY)
def main():
for i in range(7):
one_cycle(COLOR)
for i in range(70):
rainbow_cycle(i)
main()
运行效果如图:
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
小圆板搭载了A8:光线传感器和A9:温度传感器。
其中A8:光线传感器采用的是ALS-PT19光敏三极管,虽然是三极管但没引出基极,第一眼看到还以为是个光敏二极管。
A9:温度传感器采用的是NCP15XH103F03RC热敏电阻。
二者均采用了直接读取模拟量的方式获取数值。
手册18页两个传感器的介绍:
小圆板搭载了A8:光线传感器和A9:温度传感器。
其中A8:光线传感器采用的是ALS-PT19光敏三极管,虽然是三极管但没引出基极,第一眼看到还以为是个光敏二极管。
手册214页可以看到A8光线传感器的例程
import time
import board
import neopixel
import analogio
import simpleio
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=.05, auto_write=False)
pixels.fill((0, 0, 0))
pixels.show()
light = analogio.AnalogIn(board.LIGHT)
while True:
# light value remapped to pixel position
peak = simpleio.map_range(light.value, 2000, 62000, 0, 9)
print(light.value)
print(int(peak))
for i in range(0, 9, 1):
if i <= peak:
pixels[i] = (0, 255, 0)
else:
pixels[i] = (0, 0, 0)
pixels.show()
time.sleep(0.01)
手册216页顶部则有A9温度传感器的例程
import time
import adafruit_thermistor
import board
thermistor = adafruit_thermistor.Thermistor(
board.TEMPERATURE, 10000, 10000, 25, 3950)
while True:
temp_c = thermistor.temperature
temp_f = thermistor.temperature * 9 / 5 + 32
print("Temperature is: %f C and %f F" % (temp_c, temp_f))
time.sleep(0.25)
结合二者制作出我们任务二的程序:
①由于光线传感器是使用 analogio库进行的读取,数值范围是0-65535,所以把读取到的数值除以0x1000并取整进行转换,方便后续使用。
light=int(light_pin.value/0x1000)
print(f"Light:{light}")
if light>=9:
pixels[4]=COLOR[8]
else:
pixels[4]=COLOR[light]
采用转换后的light值的高低并以相应颜色来进行表示,因为比较懒就制作了一个9色数组,所以9以上数值都显示红色,经测试也基本符合对光线强弱的直观感受。
②温度传感器由于采用的是adafruit_thermistor库,读取温度是摄氏温度数值,所以选取了13℃-40℃的范围,每3℃一档的方式进行不同温度表示,高于40℃显示红色,低于13℃显示冰蓝色。
celsius = thermistor.temperature
print(f"Temperature:{celsius}")
temp=int((celsius-13)/3)
print
if temp>=9:
pixels[5]=COLOR[8]
else:
if temp<=0:
pixels[5]=COLOR[0]
else:
pixels[5]=COLOR[temp]
完整程序如下:
import analogio
from board import *
import time
import neopixel
import adafruit_thermistor
COLOR = [
[0, 0, 255], #0 蓝色
[0, 255, 255], #1 青色
[0, 127, 127], #2 浅绿
[0, 255, 0], #3 绿色
[127, 127, 0], #4 浅黄色
[255, 127, 0], #5黄色
[255, 255, 0], #6黄色
[255, 60, 0], #7 橙色
[255, 0, 0], #8红色
]
pixels = neopixel.NeoPixel(NEOPIXEL,10, brightness=0.1)
pixels.fill(0)
light_pin = analogio.AnalogIn(A8)
resistor = 10000
resistance = 10000
nominal_temp = 25
b_coefficient = 3950
thermistor = adafruit_thermistor.Thermistor(
TEMPERATURE, resistor, resistance, nominal_temp, b_coefficient
)
while True:
light=int(light_pin.value/0x1000)
print(f"Light:{light}")
if light>=9:
pixels[4]=COLOR[8]
else:
pixels[4]=COLOR[light]
celsius = thermistor.temperature
print(f"Temperature:{celsius}")
temp=int((celsius-13)/3)
print
if temp>=9:
pixels[5]=COLOR[8]
else:
if temp<=0:
pixels[5]=COLOR[0]
else:
pixels[5]=COLOR[temp]
time.sleep(1)
温度检测演示:
温度-热风枪
亮度检测演示:
亮度
基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
接近检测这个任务,一开始我是懵逼的,因为在板子上没有找到接近传感器,难道我要外接一个超声波测距模块?那多不优雅。
不是有光线传感器吗,那拿你试试行不行吧。
结果是,行,但不完全行,因为得靠的很近才能出现明显的数值变化,离远了变化都没传感器跳动的误差大。继续想办法吧。
继续翻指南,在22页有了收获:
这段话翻译过一下:
这不就有了吗。
基本思路是使用红外LED照一下,然后关闭红外LED,再读取A10的数值。一定不要一直开着红外LED,一会就烫手,吓得我还以为烧了呢。
A10的数值会在一个范围内波动,将这个范围平均分成10份(稍微多一点也成),然后对应10颗灯珠,测试一下选个合适的距离触发报警,我这里选择的是大于等于6时报警。
下面是完整程序:
#【Follow me第二季第1期】白菜虫虫
#基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
from board import *
import time
import neopixel
pixels = neopixel.NeoPixel(NEOPIXEL,10, brightness=0.1)
pixels.fill(0)
from digitalio import *
from analogio import *
ir_tx = DigitalInOut(IR_TX)
ir_tx.direction = Direction.OUTPUT
proximity = AnalogIn(IR_PROXIMITY)
button5 = DigitalInOut(D5)
button4 = DigitalInOut(D4)
import array
import math
try:
from audiocore import RawSample
except ImportError:
from audioio import RawSample
try:
from audioio import AudioOut
except ImportError:
try:
from audiopwmio import PWMAudioOut as AudioOut
except ImportError:
pass # not always supported by every board!
FREQUENCY = 440 # 440 Hz middle 'A'
SAMPLERATE = 8000 # 8000 samples/second, recommended!
# Generate one period of sine wav.
length = SAMPLERATE // FREQUENCY
sine_wave = array.array("H", [0] * length)
for i in range(length):
sine_wave[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15) + 2 ** 15)
# Enable the speaker
speaker_enable = DigitalInOut(SPEAKER_ENABLE)
speaker_enable.direction = Direction.OUTPUT
speaker_enable.value = True
audio = AudioOut(SPEAKER)
sine_wave_sample = RawSample(sine_wave)
max_value = 42000
min_value = 37000
interval_value = 500
while True:
time.sleep(0.4)
pixels.fill(0)
print("max_value: %d" % max_value)
print("min_value: %d" % min_value)
print("interval_value: %d" % interval_value)
if button4.value == True:
max_value = 22300
min_value = 41200
interval_value = 100
if button5.value == True:
ir_tx.value = True
time.sleep(0.001)
ir_tx.value = False
proximity_value = proximity.value
print("proximity Level: %d" % proximity_value)
if max_value < proximity_value:
max_value = proximity_value
print("max_value: %d" % max_value)
if min_value > proximity_value:
min_value = proximity_value
print("min_value: %d" % min_value)
interval_value = (max_value - min_value) / 10
print("interval_value: %d" % interval_value)
elif interval_value > 1:
ir_tx.value = True
time.sleep(0.001)
ir_tx.value = False
proximity_value = proximity.value
print("proximity Level: %d" % proximity_value)
proximity_index = int((proximity_value - min_value) / interval_value)
print(proximity_index)
for p in range(10):
if p <= proximity_index:
pixels[p] = 0x000f0f
else:
pixels[p] = 0
if proximity_index >= 6:
audio.play(sine_wave_sample, loop=True)
time.sleep(0.4)
audio.stop()
本来是想用两个按键实现自适应范围的功能来着,但是发现会有一些数据毛刺形象范围的自动调整,时间太紧也没再优化,有机会再搞。
3、接近报警
进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
制作不倒翁,就需要使用三轴传感器LIS3DH,查看手册19页有三轴传感器介绍
和一个好的库CP,前者有详细的CPY和小圆板的资料,后者则是为小圆板量身定制的几乎包含小圆板所有的库。
通过一下简单的测试程序,我们就可以查看X,Y,Z三个方向的偏转情况:
from adafruit_circuitplayground import cp
while True:
x, y, z = cp.acceleration
print(x, y, z)
摇动小圆板,可以观察X,Y,Z轴向数据的变化规律,其数值都是在-10到10之间变化,静止不动时接近于0,但有少量跳动的误差。
我们需要知道小圆板向哪个方向倾斜,其实倾斜方向与X,Y轴正好构成了一个直角三角形,运用我们中学学过的三角函数知识,X/Y就是角度的正切值,而atan(X/Y)便是角度值
t=(math.atan2(y,x)*180/math.pi+180)
t便是小圆板倾斜的角度值,修改程序并打印t值发现,其与与WS2812彩灯的编号方向存在90度的偏转;同时 10颗彩灯和USB口和电源接口正好接近于12等分排列,每个占据12分之一也就是30度,于是角度值计算可以更新为:
t=int((math.atan2(y,x)*180/math.pi+ 270+15)%360/30)
将10颗WS2812彩灯和USB接口、电池接口按照位置重新编组,编写三轴传感器控制WS2812在对应角度下点亮的部分,得到完整不倒翁程序如下:
#【Follow me第二季第1期】白菜虫虫
# 进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
from adafruit_circuitplayground import cp
print(1)
# WS2812=('',cp.pixels[0],cp.pixels[1],cp.pixels[2],cp.pixels[3],cp.pixels[4],'',cp.pixels[5],cp.pixels[6],cp.pixels[7],cp.pixels[8],cp.pixels[9])
print(2)
import time
import math
while True:
x, y, z = cp.acceleration
if (int(y)==0)and(int(x)==0):
t=0 #消除开发板平放静止时传感器误差产生的错误角度值
else:
t=int((math.atan2(y,x)*180/math.pi+ 270+15)%360/30)
print(t)
if t==None or t==0 or t==6:
cp.pixels.fill(0)
else:
t=t-1
if t>5:
t=t-1
cp.pixels.fill(0)
cp.pixels[t]=0x0f000f
time.sleep(0.1)
PS:使用CP库和atan2()函数编写的程序真是简洁,比我开始不用CP库加上使用atan()函数然后根据XY正负情况再进行修正的那版程序行数少了一多半。
创意任务(创意任务我选择的是创意任务三)
■ 创意任务三:水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果
创意任务三--1 触摸钢琴
打开指南160页,有touchio的例程,可以复制例程运行测试。
import time
import board
import touchio
touch_A1 = touchio.TouchIn(board.A1)
touch_A2 = touchio.TouchIn(board.A2)
touch_A3 = touchio.TouchIn(board.A3)
touch_A4 = touchio.TouchIn(board.A4)
touch_A5 = touchio.TouchIn(board.A5)
touch_A6 = touchio.TouchIn(board.A6)
touch_TX = touchio.TouchIn(board.TX)
while True:
if touch_A1.value:
print("A1 touched!")
if touch_A2.value:
print("A2 touched!")
if touch_A3.value:
print("A3 touched!")
if touch_A4.value:
print("A4 touched!")
if touch_A5.value:
print("A5 touched!")
if touch_A6.value:
print("A6 touched!")
if touch_TX.value:
print("TX touched!")
time.sleep(0.01)
通过观察例程,我们可以了解touchio库的使用方式。
使用CP库可以更好更精炼的使用touchio,同时CP库也包含了PIXELS和TONE,真是一库在手,小圆板不发愁。
①首先还是引用所需的库:
import time
from adafruit_circuitplayground import cp
使用了CP库之后真心简洁,就CP和TIME两个齐活。
②然后是从网上扒来的音调频率对照数组
tones=(0,392,440,494,523,587,659,698,784)
不要问我tones[0]为啥是0,问就是因为开始的时候不仔细看手册,以为A0也可以触摸,结果写完程序验证发现不行,然后就也懒得该回去了,直接赋0算了。
③下面以A1触摸来进行介绍每个触摸按键的程序。
1、判断A1是否被触摸
if cp.touch_A1:
2、当A1被触摸时蜂鸣器播放dao的音,同时与A1临近的两个WS2812亮起,因为触摸IO和WS2812的位置对应不好,所以亮起的都是临近的彩灯。
cp.start_tone(tones[1])
cp.pixels[6]=0x0f000f
cp.pixels[7]=0x0f000f
print("A1 touched!")
3、同理处理其他触摸IO被触摸时的逻辑。
elif cp.touch_A2:
cp.start_tone(tones[2])
cp.pixels[7]=0x0f000f
cp.pixels[8]=0x0f000f
print("A2 touched!")
elif cp.touch_A3:
cp.start_tone(tones[3])
cp.pixels[8]=0x0f000f
cp.pixels[9]=0x0f000f
print("A3 touched!")
elif cp.touch_A4:
cp.start_tone(tones[4])
cp.pixels[0]=0x0f000f
cp.pixels[1]=0x0f000f
print("A4 touched!")
elif cp.touch_A5:
cp.start_tone(tones[5])
cp.pixels[1]=0x0f000f
cp.pixels[2]=0x0f000f
print("A5 touched!")
elif cp.touch_A6:
cp.start_tone(tones[6])
cp.pixels[2]=0x0f000f
cp.pixels[3]=0x0f000f
print("A6 touched!")
elif cp.touch_TX:
cp.start_tone(tones[7])
cp.pixels[3]=0x0f000f
cp.pixels[4]=0x0f000f
print("A7 touched!")
4、当所有IO都没有被触摸时,关闭蜂鸣器,所有彩灯熄灭,延时0.1秒开始下一次检测。
else:
cp.stop_tone()
cp.pixels.fill(0)
time.sleep(0.1)
完整程序如下:
#【Follow me第二季第1期】白菜虫虫
# 创意任务三:水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果
import time
from adafruit_circuitplayground import cp
tones=(0,392,440,494,523,587,659,698,784)
cp.pixels.fill(0)
while True:
if cp.touch_A1:
cp.start_tone(tones[1])
cp.pixels[6]=0x0f000f
cp.pixels[7]=0x0f000f
print("A1 touched!")
elif cp.touch_A2:
cp.start_tone(tones[2])
cp.pixels[7]=0x0f000f
cp.pixels[8]=0x0f000f
print("A2 touched!")
elif cp.touch_A3:
cp.start_tone(tones[3])
cp.pixels[8]=0x0f000f
cp.pixels[9]=0x0f000f
print("A3 touched!")
elif cp.touch_A4:
cp.start_tone(tones[4])
cp.pixels[0]=0x0f000f
cp.pixels[1]=0x0f000f
print("A4 touched!")
elif cp.touch_A5:
cp.start_tone(tones[5])
cp.pixels[1]=0x0f000f
cp.pixels[2]=0x0f000f
print("A5 touched!")
elif cp.touch_A6:
cp.start_tone(tones[6])
cp.pixels[2]=0x0f000f
cp.pixels[3]=0x0f000f
print("A6 touched!")
elif cp.touch_TX:
cp.start_tone(tones[7])
cp.pixels[3]=0x0f000f
cp.pixels[4]=0x0f000f
print("A7 touched!")
else:
cp.stop_tone()
cp.pixels.fill(0)
time.sleep(0.1)
64bf8f32a752ad2e46b0797554c6da1d
创意任务三--2 陈皮水果钢琴
其实吧本来做完触摸钢琴就想着结束来着,但是家里有小朋友吧,就想着真让他们试试水果钢琴。
在我的小仓库里面翻出来鳄鱼夹接上,运行程序傻眼了,直接不用触摸就开始响了,取下鳄鱼夹就不响,试了试用镊子搭上触摸IO也是一样响。
尝试了CP库的touch和手册例程的touchio库都是这样(猜测这俩是一样的),没办法就只能从最基础的地方下手了。触摸这东西猜一下原理应该是通过模拟值来实现的,先用analogio 库读取A1的值并循环显示。
触摸时数值如下:
而不触摸时数值如下:
观察可知,不触摸的时候,数值是类似随机数的波动(物理随机数,真随机)。而触摸时,数值会在0和65535两个数之间来回波动,于是我们就可以自己写一个触摸逻辑:
A_1 = analogio.AnalogIn(A1)
while True:
if A_1.value==0 or A_1.value==65535:
cp.start_tone(tones[1])
cp.pixels[6]=0x0f000f
cp.pixels[7]=0x0f000f
print("A1 touched!")
同样的逻辑完成整个程序的修改,完成程序如下:
import analogio
from board import *
import time
from adafruit_circuitplayground import cp
tones=(0,392,440,494,523,587,659,698,784)
A_1 = analogio.AnalogIn(A1)
A_2 = analogio.AnalogIn(A2)
A_3 = analogio.AnalogIn(A3)
A_4 = analogio.AnalogIn(A4)
A_5 = analogio.AnalogIn(A5)
A_6 = analogio.AnalogIn(A6)
A_7 = analogio.AnalogIn(TX)
while True:
if A_1.value==0 or A_1.value==65535:
cp.start_tone(tones[1])
cp.pixels[6]=0x0f000f
cp.pixels[7]=0x0f000f
print("A1 touched!")
elif A_2.value==0 or A_2.value==65535:
cp.start_tone(tones[2])
cp.pixels[7]=0x0f000f
cp.pixels[8]=0x0f000f
print("A2 touched!")
elif A_3.value==0 or A_3.value==65535:
cp.start_tone(tones[3])
cp.pixels[8]=0x0f000f
cp.pixels[9]=0x0f000f
print("A3 touched!")
elif A_4.value==0 or A_4.value==65535:
cp.start_tone(tones[4])
cp.pixels[0]=0x0f000f
cp.pixels[1]=0x0f000f
print("A4 touched!")
elif A_5.value==0 or A_5.value==65535:
cp.start_tone(tones[5])
cp.pixels[1]=0x0f000f
cp.pixels[2]=0x0f000f
print("A5 touched!")
elif A_6.value==0 or A_6.value==65535:
cp.start_tone(tones[6])
cp.pixels[2]=0x0f000f
cp.pixels[3]=0x0f000f
print("A6 touched!")
elif A_7.value==0 or A_7.value==65535:
cp.start_tone(tones[7])
cp.pixels[3]=0x0f000f
cp.pixels[4]=0x0f000f
print("A7 touched!")
else:
cp.stop_tone()
cp.pixels.fill(0)
print("null")
time.sleep(0.2)
接好鳄鱼夹测试,可以正常演奏。
但是手头上没有水果,只好从水杯里扒拉出几片陈皮擦干顶一下,没想到竟然也能演奏。
于是乎,陈皮钢琴闪亮诞生。
创意任务三:陈皮钢琴
心得体会
总体来说这是一次很快乐的活动,难度不是很高,以我这种老菜鸟的水平也没有遇到什么困难。小圆板硬件设计的很出色,集成了很多功能还保持了合适的体积。circuitPython使用起来也非常的方便,用一个大佬兄弟的话来说就是已经把饭喂到了你的嘴里。这次的软硬件非常适合新手入门和小朋友学编程使用。
通过这次活动我进一步的熟悉了WS2812彩色LED、音乐播放的操作,学习了光线传感器、三轴运动传感器、触摸按键等功能的使用。通过这次的活动,我加深了对各种硬件的了解,增长了自己的编程技巧,同时也积累的调试的经验,可以说是收获满满。
以上就是我惨这这次follow me活动的学习总结,如有错漏欢迎各位大佬斧正,最后再次感谢主办方EEworld和得捷提供的这次学习提高的机会,谢谢各位的能看到这里。
|