440|1

24

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第1期】学习总结 [复制链接]

  本帖最后由 白菜虫虫 于 2024-10-10 18:06 编辑
 【Follow me第二季第1期】

很开心可以参加这一期的Follow me活动,感谢EEworld和得捷联合举办的这次活动给了我一次很好的学习提高的机会,通过这次的学习,我基本掌握了CircuitPython和SAMD21的使用,受益颇丰。下面是我这次学习情况汇报:

这次活动的开发板是Adafruit Circuit Playground Express(名字太长了,后面就叫小圆板吧)。
开发方式我选择的是官方的CircuitPython(后面简称CPY),选择CPY的愿意有以下几个:一是这是官方固件,稳定性有保障;二是CPY的库很全面,不需要再到网上去找库;三是以前没有接触过,以这次活动为契机学习提高下自己。

0.0 FOLLOWME第二季第1期~1

 

物料展示:

首先展示一下本次使用的所有器件:

从左到右依次是USB数据线,Adafruit Circuit Playground Express小圆板本体,小圆板外壳,还有小圆板专用电池盒。

 

 

 

入门任务(必做):开发环境搭建,板载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正负情况再进行修正的那版程序行数少了一多半。

4、倾斜检测

 

 
 
创意任务(创意任务我选择的是创意任务三)

■  创意任务三:水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果

搭配器件: Adafruit Circuit Playground Express、水果自备
 
创意任务三--1 触摸钢琴

查看指南第20页,有触摸IO功能介绍

打开指南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)

接好鳄鱼夹测试,可以正常演奏。

但是手头上没有水果,只好从水杯里扒拉出几片陈皮擦干顶一下,没想到竟然也能演奏。

于是乎,陈皮钢琴闪亮诞生。

创意任务三:陈皮钢琴

 

followme第二季第1期2024-白菜虫虫-代码汇总.zip (4.89 KB, 下载次数: 1)

 

 
心得体会

总体来说这是一次很快乐的活动,难度不是很高,以我这种老菜鸟的水平也没有遇到什么困难。小圆板硬件设计的很出色,集成了很多功能还保持了合适的体积。circuitPython使用起来也非常的方便,用一个大佬兄弟的话来说就是已经把饭喂到了你的嘴里。这次的软硬件非常适合新手入门和小朋友学编程使用。

通过这次活动我进一步的熟悉了WS2812彩色LED、音乐播放的操作,学习了光线传感器、三轴运动传感器、触摸按键等功能的使用。通过这次的活动,我加深了对各种硬件的了解,增长了自己的编程技巧,同时也积累的调试的经验,可以说是收获满满。

以上就是我惨这这次follow me活动的学习总结,如有错漏欢迎各位大佬斧正,最后再次感谢主办方EEworld和得捷提供的这次学习提高的机会,谢谢各位的能看到这里。

点赞 关注
 
 

回复
举报

24

帖子

3

TA的资源

一粒金砂(中级)

沙发
 

关于水果钢琴的最新进展,如果出现了水果钢琴无论如何都不响,或者就只能偶尔响一下的情况,可以多接一根鳄鱼夹到GND,然后另外一头夹个水果攥在手里,然后用这只手去触摸其他水果,就可以正常使用。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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