[作品提交] 【Follow me第二季第1期】Adafruit Circuit Playground Express任务整体汇总

miu_miu   2024-9-1 21:57 楼主

非常高兴能参加这次Follow me,这是我第二次参加。这次参加的主要目的是给孩子学习用,因为Adafruit Circuit Playground Express具有各种传感器和LED,而且可以使用MakeCode进行开发,很适合小朋友学习。

 

项目演示视频



 

 

任务/项目介绍


项目简介

本次项目为Adafruit Circuit Playground Express(简称CPE)的体验,需要完成1个入门任务、3个基础任务、至少1个创意任务(3选1),涵盖CPE的炫彩LED、光线传感器、运动传感器、温度传感器、扬声器等的使用。

全部物料清单

本次只购买了必要器件

image.png  

image.png   image.png  

设计思路

  • 入门任务比较简单,可以用于熟悉MakeCode的使用。用按键A按下输出板载LED灯的高电平,放开输出低电平,控制LED灯的点亮。
  • 基础任务一思路:使用10颗Mini NeoPixel LED实现,跑马灯点亮和颜色变换。
  • 基础任务二思路:使用1个温度传感器和1个光传感器,根据温度和亮度数值转分别换成5颗LED灯动态效果。
  • 基础任务三思路:使用光传感器和1个带D类放大器的迷你扬声器,根据物体靠近时光线的变化作为安全距离,发起声音报警。(由于MakeCode暂不知道如何使用红外进行距离探测,只会收发信号)
  • 进阶任务思路:使用1个运动传感器和LED灯,根据板卡的运动方向控制不同的LED灯点亮。
  • 创意任务一思路:使用声音传感器、扬声器和LED灯,实现手持定时器。

 

各任务说明


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

任务说明:给板载LED输出高电平,点亮即可

软件流程图:

image.png  

MakeCode实现代码:

input.buttonA.onEvent(ButtonEvent.Down, function () {
    pins.LED.digitalWrite(true)
})
input.buttonA.onEvent(ButtonEvent.Up, function () {
    pins.LED.digitalWrite(false)
})

代码说明:

为按钮A设置事件监听。

当按钮A按下时(Down),LED灯亮起(即设置LED为高电平)。

当按钮A释放时(Up),LED灯熄灭(即设置LED为低电平)。

效果截图:

image.png  

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

任务说明:通过炫彩LED实现跑马灯效果和颜色变换

软件流程图:

image.png  

MakeCode实现代码:

input.buttonA.onEvent(ButtonEvent.Click, function () {
    for (let i = 0; i < 2; i++) {
        light.showAnimation(light.colorWipeAnimation, 1000)
    }
    for (let i = 0; i < 10; i++) {
        light.showAnimation(light.rainbowAnimation, 500)
    }
    light.setAll(0x000000)
})
input.buttonB.onEvent(ButtonEvent.Click, function () {
    for (let i = 0; i < 2; i++) {
        light.showAnimation(light.cometAnimation, 1000)
    }
    for (let i = 0; i < 10; i++) {
        light.showAnimation(light.rainbowAnimation, 500)
    }
    light.setAll(0x000000)
})

代码说明:

该代码定义了两个按钮点击事件处理函数:

按下按钮A时,显示两次颜色渐变动画(每次持续1秒),接着显示十次彩虹动画(每次持续0.5秒),最后关闭所有灯光。

按下按钮B时,显示两次彗星动画(每次持续1秒),接着同样显示十次彩虹动画(每次持续0.5秒),最后关闭所有灯光。

效果截图:

image.png  

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

任务说明:根据温度传感器和光线传感器的数值,转化为LED灯的可视化效果。把左面5颗LED灯作为光照程度的显示,右面5颗LED作为温度程度的显示。

软件流程图:

image.png     image.png

MakeCode实现代码:

let pixel_list = 0
let temp_list = 0

forever(function () {
    pixel_list = Math.map(input.lightLevel(), 0, 255, 0, 5)
    console.log(pixel_list)
    for (let m = 0; m <= pixel_list; m++) {
        light.setPixelColor(m, 0xffffff)
    }
    for (let n = pixel_list; n <= 4; n++) {
        light.setPixelColor(n+1, 0x000000)
    }
})
forever(function () {
    if (input.temperature(TemperatureUnit.Celsius) < 20) {
        temp_list = Math.map(input.temperature(TemperatureUnit.Celsius), 0, 20, 6, 10)
        for (let i = 5; i <= temp_list; i++) {
            light.setPixelColor(i, 0x007fff)
        }
    } else if (input.temperature(TemperatureUnit.Celsius) >= 20 && input.temperature(TemperatureUnit.Celsius) <= 26) {
        temp_list = Math.map(input.temperature(TemperatureUnit.Celsius), 20, 26, 6, 10)
        for (let o = 5; o <= temp_list; o++) {
            light.setPixelColor(o, 0x00ff00)
        }
    } else if (input.temperature(TemperatureUnit.Celsius) >= 27 && input.temperature(TemperatureUnit.Celsius) <= 32) {
        temp_list = Math.map(input.temperature(TemperatureUnit.Celsius), 27, 32, 6, 10)
        for (let p = 5; p <= temp_list; p++) {
            light.setPixelColor(p, 0xff8000)
        }
    } else {
        temp_list = Math.map(input.temperature(TemperatureUnit.Celsius), 33, 40, 6, 10)
        for (let q = 5; q <= temp_list; q++) {
            light.setPixelColor(q, 0xff0000)
        }
    }
    for (let r = temp_list; r <= 9; r++) {
        light.setPixelColor(r+1, 0x000000)
    }
})

代码说明:

  1. 根据环境光强度(0-255)映射到0-5范围,点亮相应数量的LED(白色),剩余LED关闭。

  2. 根据温度变化在蓝色(小于20度)、绿色(20至26度)、橙色(27至32度)和红色(33度至40度)之间变换LED颜色(位置6-10),点亮相应数量的LED。

效果截图(视频效果会更好):

image.png   本来是橙色,手指放在温度传感器上变红色

image.png  

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

任务说明:由于MakeCode暂不知道如何使用红外进行距离探测,改为根据物体靠近时光线的变化作为安全距离,发起声音报警。通过把光线强度映射为10颗LED灯,当强度小于5时进行报警音播放。

软件流程图:

image.png

MakeCode实现代码:

let pixel_list = 0

forever(function () {
    pixel_list = Math.map(input.lightLevel(), 0, 32, 0, 10)
    console.log(pixel_list)
    for (let m = 0; m <= pixel_list; m++) {
        light.graph(m, 10)
    }
    for (let n = pixel_list; n <= 9; n++) {
        light.setPixelColor(n + 1, 0x000000)
    }
if (pixel_list < 5) {
        music.magicWand.play()
    }
})

代码说明:

  • 将光照值映射到 0 到 10 的范围,用10颗LED灯显示光照强度。

  • 若强度小于5时,播放警报声。

效果截图:

白天光照强度大,10颗全亮。

image.png  

手接近后发出报警声

image.png  

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

任务说明:模拟不倒翁运动过程,在板卡倾斜在前后左右4个方向时亮起对应的LED灯,板卡旋转时显示彩虹灯光。

软件流程图:

image.png

MakeCode实现代码:

input.onGesture(Gesture.Shake, function () {
    for (let i = 0; i < 10; i++) {
        light.showAnimation(light.rainbowAnimation, 100)
    }
})
input.onGesture(Gesture.TiltUp, function () {
    light.showRing(
    `white white black black black black black black white white`
    )
})
input.onGesture(Gesture.TiltDown, function () {
    light.showRing(
    `black black black white white white white black black black`
    )
})
input.onGesture(Gesture.TiltLeft, function () {
    light.showRing(
    `black white white white black black black black black black`
    )
})
input.onGesture(Gesture.TiltRight, function () {
    light.showRing(
    `black black black black black black white white white black`
    )
})
input.onGesture(Gesture.FreeFall, function () {
    light.showRing(
    `red red red red red red red red red red`
    )
})

代码说明:

  • 当检测到摇晃手势时,显示10次彩虹动画。

  • 倾斜方向不同则显示不同的灯光图案:向上倾斜显示两端白色;向下倾斜显示中间白色;向左倾斜显示左侧白色;向右倾斜显示右侧白色。

  • 检测到自由落体手势时,显示全红色灯光。

效果截图:

image.png  

创意任务一:有创意的可穿戴装饰

任务说明:制作手持定时器,使用按键A设定定时位置,通过声音触发开始倒数,同时播放声效。按键B重置。

软件流程图:

image.png

MakeCode实现代码:

input.onLoudSound(function () {
    light.photonFlip()
    light.setPhotonMode(PhotonMode.Eraser)
    for (let i = 0; i < time; i++) {
        music.playTone(262, 300)
        pause(700)
        light.photonForward(1)
    }
    for (let i = 0; i < 3; i++) {
        music.playTone(523, 100)
        pause(100)
        music.playTone(523, 100)
        light.showAnimation(light.sparkleAnimation, 700)
    }
})
input.buttonA.onEvent(ButtonEvent.Click, function () {
    if (time < 10) {
        light.photonForward(1)
        time += 1
    }
})
input.buttonB.onEvent(ButtonEvent.Click, function () {
    time = 0
    light.setPhotonMode(PhotonMode.Off)
    light.setAll(0x000000)
})
let time = 0
time = 1
light.photonForward(0)

代码说明:

  • 按键A设定定时time变量,最大10个单位。
  • 检测麦克风声音,循环time设定的次数,并每次播放音效。完成后播放3次闪烁灯效果作为提示。

效果截图:

设定定时时间,通过声音触发倒计时(请看视频效果)
image.png  

 

本活动的心得体会


本次活动任务制作过程有小朋友参与,通过MakeCode图形化的拖拉操作和内置的多种动作,小朋友更容易理解控制流程和思路。同时CPE丰富的传感器也非常适合不同想法的实现。非常感谢EEworld和Digikey举办的活动,希望以后还能继续参与。

 

代码链接


https://download.eeworld.com.cn/detail/eew_4HfTi8/634245

本帖最后由 miu_miu 于 2024-9-1 21:57 编辑

回复评论 (1)

几个测试通过MakeCode图形化的拖拉操作和内置的多种动作,确实很便捷

点赞  2024-9-2 07:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复