469|2

33

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第1期】任务提交-使用makecode开发(JavaScript) [复制链接]

  本帖最后由 knv 于 2024-7-27 12:55 编辑

【Follow me第二季第1期】作品提交

大家好,我是knv,很高兴参加这次follow me活动,这次的开发板很有意思,自带10个RGB灯,以及充足的传感器。这次活动我除了必做任务,选做了 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩。搭配器件: Adafruit Circuit Playground Express、舵机。

使用到的器件内容:

 

设计思路:

主控为Circuit Playground Express

其中选做任务使用了舵机。

主要使用Circuit Playground Express的传感器进行数据采集,然后通过灯光显示。

 

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

 

1:搭建开发环境,由于到手的版本是最新的express版本,所以我选择使用Code.org CSD来制作应用程序。

 

浏览网站发现还有版本区别,我们收到的应该都是express版本,资源充足,玩micropython都可以。

 

设备上电后的效果,默认就是七彩灯光,非常好看。

 

简单介绍一下刷入固件的方法:

 

首先PC通过USB线链接开发板,等待开机成功后,轻按RESET键并松开, 进入刷机模式,当所有RGB灯变绿后,电脑会弹出一个磁盘,

 

 

将固件拖入磁盘即可完成固件升级。

 

 

跑第一个工程,点亮所有RGB。只需要拖动一个show ring 手动选择灯光效果,就可以点亮灯光了。

编写代码点亮RGB灯

 

 

 

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

 

 

流程图:

 

 

let r = 0

input.onGesture(Gesture.Shake, () => {

    r = Math.randomRange(0, 4)

    if (r == 0) {

        light.showAnimation(light.runningLightsAnimation, 2000)

    } else if (r == 1) {

        light.showAnimation(light.rainbowAnimation, 2000)

    } else if (r == 2) {

        light.showAnimation(light.cometAnimation, 2000)

    } else {

        light.showAnimation(light.theaterChaseAnimation, 2000)

    }

})

代码内容:

摇一摇触发亮灯,每次随机生成一个数字,然后触发不同的灯效2秒。

       

 

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

 

任务预期,根据温度和光线亮度来生成舒适指数,使用光线传感器获取环境亮度,使用温度传感器获取温度。当温度舒适时 灯光 绿色,温度过高 灯光红色 温度过低 灯光蓝色,亮度过高 黄色灯光闪烁

 

代码如下:

let currentBrightness = 0

 

// 持续更新

forever(function () {

    // 获取光线和温度

    let lightLevel = input.lightLevel()

    let temperature = input.temperature(TemperatureUnit.Celsius)

 

    // 根据光线条件决定是否显示黄色

    let isYellow = lightLevel > 200

    let primaryColor = isYellow ? 0xffff00 : getColorBasedOnTemperature(temperature)

    let secondaryColor = isYellow ? getColorBasedOnTemperature(temperature) : 0xffff00

 

    // 执行呼吸灯效果

    if (isYellow) {

        showBreathingColor(primaryColor, secondaryColor)

    } else {

        showStaticColor(primaryColor)

    }

})

 

// 根据温度条件返回对应的颜色

function getColorBasedOnTemperature(temperature: number): number {

    if (temperature > 25) {

        return 0xff0000 // 红色

    } else if (temperature <= 25 && temperature > 16) {

        return 0x00ff00 // 绿色

    } else {

        return 0x0000ff // 蓝色

    }

}

 

// 使用呼吸灯效果显示交替的颜色

function showBreathingColor(primaryColor: number, secondaryColor: number) {

    let steps = 10

    let stepSize = 255 / steps

    let pauseTime = 20

 

    // 从 primaryColor 渐变到 secondaryColor

    for (let step = 0; step <= steps; step++) {

        let brightness = Math.round(step * stepSize)

        let color = interpolateColor(primaryColor, secondaryColor, step / steps)

        light.setAll(color)

        light.setBrightness(brightness)

        pause(pauseTime)

    }

    // 从 secondaryColor 渐变回 primaryColor

    for (let step = steps; step >= 0; step--) {

        let brightness = Math.round(step * stepSize)

        let color = interpolateColor(primaryColor, secondaryColor, step / steps)

        light.setAll(color)

        light.setBrightness(brightness)

        pause(pauseTime)

    }

}

 

// 使用静态颜色显示LED

function showStaticColor(color: number) {

    light.setAll(color)

    light.setBrightness(255) // 设置最大亮度

}

 

// 插值函数:计算两种颜色之间的渐变颜色

function interpolateColor(color1: number, color2: number, ratio: number): number {

    let r1 = (color1 >> 16) & 0xff

    let g1 = (color1 >> 8) & 0xff

    let b1 = color1 & 0xff

    let r2 = (color2 >> 16) & 0xff

    let g2 = (color2 >> 8) & 0xff

    let b2 = color2 & 0xff

 

    let r = Math.round(r1 + (r2 - r1) * ratio)

    let g = Math.round(g1 + (g2 - g1) * ratio)

    let b = Math.round(b1 + (b2 - b1) * ratio)

 

    return (r << 16) | (g << 8) | b

}

效果图:

当光线大于200时:

 

当温度大于16,并小于25时(在冰箱测试的,感觉温度传感器并不是很灵敏)

 

 

 

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

任务目标,当光线检测传感器检测到较黑(亮度传感器<50)后,触发入侵报警。

流程图:

 

代码如下:

 

// 持续更新

forever(function () {

    // 获取光线值

    let lightLevel = input.lightLevel()

 

    if (lightLevel < 50) {

        // 当光线小于50时,闪烁红灯并发出声音报警

        flashRedLight()

        soundAlarm()

    } else {

        // 光线大于或等于50时,关闭所有LED灯

        light.clear()

    }

})

 

// 使用闪烁的红色灯光显示LED

function flashRedLight() {

    let flashCount = 5 // 闪烁次数

    let flashDuration = 200 // 每次闪烁的时间,单位:毫秒

 

    for (let i = 0; i < flashCount; i++) {

        light.setAll(0xff0000) // 红色

        pause(flashDuration)

        light.clear()

        pause(flashDuration)

    }

}

 

// 发起声音报警

function soundAlarm() {

    // 通过扬声器发出声音

    music.baDing.play()

    pause(200) // 每200毫秒发出一次声音

}

 

遮挡时:

 

无遮挡时:

 

 

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

 

任务目标,将设备贴到不倒翁上,当X Y加速度增加,则计算灯光速度,加速度越快,灯光速度越快。

 

// 持续更新

forever(function () {

    // 获取 X 和 Y 轴的加速度值

    let accelX = input.acceleration(Dimension.X)

    let accelY = input.acceleration(Dimension.Y)

 

    // 计算平面上的综合加速度

    let strength2D = Math.sqrt(Math.pow(accelX, 2) + Math.pow(accelY, 2))

 

    // 计算跑马灯的速度

    let normalizedStrength = Math.min(strength2D / 1023, 1) // 标准化到 [0, 1] 范围

    let speed = 100 - (90 * normalizedStrength) // 速度范围从 10 毫秒到 100 毫秒

 

    // 执行七彩跑马灯效果

    runColorMarquee(speed)

})

 

// 运行七彩跑马灯效果

function runColorMarquee(speed: number) {

    const colors = [0xff0000, 0xffa500, 0xffff00, 0x008000, 0x0000ff, 0x4b0082, 0xee82ee] // 红、橙、黄、绿、蓝、靛、紫

    const numLEDs = 10

 

    // 清除所有 LED

    light.clear()

 

    // 循环显示 LED

    for (let i = 0; i < numLEDs; i++) {

        // 先关闭所有 LED

        light.clear()

 

        // 点亮当前 LED 和下一个 LED

        light.setPixelColor(i, colors[i % colors.length])

        light.setPixelColor((i + 1) % numLEDs, colors[(i + 1) % colors.length])

      

        pause(speed) // 等待时间,根据速度调整

    }

}

当晃动时,跑马灯速度更快:

 

 

 

■  (选做)创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩

 

搭配器件: Adafruit Circuit Playground Express、舵机

 

舵机链接:

橙色  链接-->   A1

棕色  链接-->  GND

红色   链接-->   VOUT

 

 

任务目标,使用设备的麦克风,获取音量,音量越大,舵机转动越快。同时启动线程,读取音量,使开发板上的RGB灯光以跑马灯形式点亮。代码开发完成后,用A4纸剪出章鱼触角的样子,贴到舵机上,完成收缩或者舒展功能。

流程图:

 

代码如下:

let servo = servos.A1;

let lastLevel = 0;

 

// 设置音量的阈值

let threshold = 120; // 小于此音量时,停止伺服电机

 

// 伺服电机控制

forever(function () {

    let level = input.soundLevel();

    if (lastLevel != level) {

        if (level < threshold) {

            servo.run(0);

        } else {

            // 将音量映射到伺服电机速度

            let speed = Math.map(level, threshold, 255, 0, 100);

            // 确保映射后的值在有效范围内

            speed = Math.max(0, Math.min(speed, 100));

 

            // 随机决定正转或反转

            let direction = Math.randomRange(0, 1) === 0 ? 1 : -1;

            let finalSpeed = speed * direction;

 

            console.log(finalSpeed);

            servo.run(finalSpeed);

            pause(100)

        }

        lastLevel = level;

    }

});

 

// 跑马灯效果

forever(function () {

    let level = input.soundLevel();

    if (level >= threshold) {

        // 计算跑马灯的速度

        let lightSpeed = Math.map(level, threshold, 255, 500, 50); // 数字越大速度越慢

        runLights(lightSpeed);

    } else {

        clearLights();

    }

});

 

function runLights(delay: number) {

    const colors = [

        0xff0000, // Red

        0xffa500, // Orange

        0xffff00, // Yellow

        0x008000, // Green

        0x0000ff, // Blue

        0x4b0082, // Indigo

        0xee82ee  // Violet

    ];

    for (let i = 0; i < 10; i++) {

        let level = input.soundLevel();

        if (level < threshold) {

            clearLights();

            return;

        }

 

        for (let j = 0; j < 10; j++) {

            light.setPixelColor((i + j) % 10, colors[j % colors.length]); // 设置当前灯光为多彩颜色

        }

        pause(delay); // 根据音量调整速度

    }

}

 

function clearLights() {

    light.clear(); // 清除所有灯光

}

运行图片:

 

 

 

任务汇总视频:

链接:【Follow me第二季第1期】任务提交-使用makecode开发(JavaScript)-【Follow me第二季第1期】任务提交-使用makecode开发(JavaScript)-EEWORLD大学堂

 


源码下载:

download.eeworld.com.cn/detail/knv/633848

f21.zip (4.22 KB, 下载次数: 1)

 

心得体会:

本次Follow me 第二季第1期任务活动的目标是利用 Adafruit Circuit Playground Express 开发一些灯光效果的功能,该项目不仅增强了我对传感器数据的处理能力,还培养了我们在硬件编程中的综合应用能力。学习了如何使用 Circuit Playground Express 的 LED 环实现多彩的视觉效果,并结合传感器数据动态控制这些效果。感谢得捷电子,电子工程世界提供的活动。

最新回复

这也太快了,恭喜楼主第一个完成     详情 回复 发表于 2024-7-28 08:11
点赞(1) 关注
 
 

回复
举报

281

帖子

7

TA的资源

一粒金砂(高级)

沙发
 

大佬NB啊,第一个完成的

 
 
 

回复

6471

帖子

10

TA的资源

版主

板凳
 

这也太快了,恭喜楼主第一个完成  

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表