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