- 2024-11-01
-
发表了主题帖:
【2024 DigiKey创意大赛】环境智眼-可视化智能环境观测器
环境智眼-可视化智能环境观测器
作者:小神123
一、作品简介
环境智眼是一款革命性的智能环境观测器,它能够实时监测和分析各种环境参数,如温度、湿度、空气质量等。通过集成的高精度传感器阵列和强大的数据处理能力,环境智眼为用户提供了一个全面、实时的环境监测平台。核心特性:多参数监测: 能够同时监测多种环境参数,为用户提供全面的环境数据。智能数据分析: 利用先进的人工智能算法,对收集到的数据进行深入分析,识别模式和趋势。实时可视化: 通过直观的图形界面,用户可以实时查看环境数据的变化,包括动态图表、热图和趋势线。预警系统: 当环境参数超出预设的安全范围时,系统会自动发出预警,帮助用户及时采取措施。易于部署: 设计轻巧,安装简便,适用于室内外多种环境。应用场景:智能家居系统,提升居住舒适度和安全性。工业环境监测,确保生产环境符合安全标准。农业领域,优化作物生长条件,提高产量。城市环境管理,监测和改善城市空气质量和噪音污染。
本次采用的物料清单有ESP32-S3-LCD-EV-Board开发板以及气体传感器BME680,其中ESP32-S3-LCD-EV-Board搭配一块3.95英寸的屏幕,可以用来显示空气质量等。气体传感器BME680环境传感器是一款四合一MEMS环境传感器,可测量VOC(挥发性有机物)、温度、湿度、气压这四个参数,非常适用于监测空气质量。由于采用了MEMS技术,该传感器体积小、功耗低,因此也适用于低功耗场合,如可穿戴等。
二、系统框图
整体设计思路如下:通过气体传感器BME680采集空气中的数据,然后将数据通过I2C通讯或者SPI通讯传输到ESP32-s3控制板上,进过数据处理,实时将其显示在显示屏上,实现狂徒如下所示:
三、各部分功能说明
1、读取空气质量部分
通过SPI或者I2C形式,均可以读取到气体传感器的信息,接线示意图按照官方给出的文档示意如下:
通过Arduino IDE上编译代码,具体截图如下:
感觉读到的数据不太正确。
2、显示数据部分
显示部分的话,需要用到LVGL,这里的话,选择squareline_studio,其界面可以直接选择开发板ESP32-S3-LCD-EV-BOARD,显示如下:
进入编辑界面后,根据自己的喜欢设计布局,通过拖拽的形式,非常方便,大大缩减了开发界面的时间。以下是我搭建的界面。
四、作品源码
作品代码如下所示:
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme(&Wire); // I2C
//Adafruit_BME680 bme(&Wire1); // example of I2C on another bus
//Adafruit_BME680 bme(BME_CS); // hardware SPI
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println(F("BME680 test"));
if (!bme.begin()) {
Serial.println("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
if (! bme.performReading()) {
Serial.println("Failed to perform reading :(");
return;
}
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.println();
delay(2000);
}
#include <Arduino.h>
#include <ESP_Panel_Library.h>
#include <lvgl.h>
#include "lvgl_port_v8.h"
/**
/* To use the built-in examples and demos of LVGL uncomment the includes below respectively.
* You also need to copy `lvgl/examples` to `lvgl/src/examples`. Similarly for the demos `lvgl/demos` to `lvgl/src/demos`.
*/
// #include <demos/lv_demos.h>
// #include <examples/lv_examples.h>
void setup()
{
String title = "LVGL porting example";
Serial.begin(115200);
Serial.println(title + " start");
Serial.println("Initialize panel device");
ESP_Panel *panel = new ESP_Panel();
panel->init();
#if LVGL_PORT_AVOID_TEAR
// When avoid tearing function is enabled, configure the RGB bus according to the LVGL configuration
ESP_PanelBus_RGB *rgb_bus = static_cast<ESP_PanelBus_RGB *>(panel->getLcd()->getBus());
rgb_bus->configRgbFrameBufferNumber(LVGL_PORT_DISP_BUFFER_NUM);
rgb_bus->configRgbBounceBufferSize(LVGL_PORT_RGB_BOUNCE_BUFFER_SIZE);
#endif
panel->begin();
Serial.println("Initialize LVGL");
lvgl_port_init(panel->getLcd(), panel->getTouch());
Serial.println("Create UI");
/* Lock the mutex due to the LVGL APIs are not thread-safe */
lvgl_port_lock(-1);
/* Create a simple label */
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, title.c_str());
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
/**
* Try an example. Don't forget to uncomment header.
* See all the examples online: https://docs.lvgl.io/master/examples.html
* source codes: https://github.com/lvgl/lvgl/tree/e7f88efa5853128bf871dde335c0ca8da9eb7731/examples
*/
// lv_example_btn_1();
/**
* Or try out a demo.
* Don't forget to uncomment header and enable the demos in `lv_conf.h`. E.g. `LV_USE_DEMO_WIDGETS`
*/
// lv_demo_widgets();
// lv_demo_benchmark();
// lv_demo_music();
// lv_demo_stress();
/* Release the mutex */
lvgl_port_unlock();
Serial.println(title + " end");
}
void loop()
{
Serial.println("IDLE loop");
delay(1000);
}
五、作品功能演示视频
[localvideo]7e734e996152b061b55711e869fa3fd7[/localvideo]
六、项目总结
本次项目是一个很好的机会,再次感谢得捷电子以及EEworld提供的平台与支持。但是由于个人原因(工作时间较忙以及对ESP32产品熟悉较少,与预期计划偏差较大),未能成功将全部功能实现,希望在后续的时间里自己可以将这个想法实现,并多多学习ESP32-s3的操作。
七、其他
- 2024-09-01
-
加入了学习《【Follow me第二季第1期】任务提交》,观看 【Follow me第二季第1期】任务提交
-
发表了主题帖:
【Follow me第二季第1期】任务提交之紧赶慢赶版
一个月时间太快了,好吧,也可能是自己太菜了,不够优秀,理解太慢,不过好在能够赶上结尾去提交任务,感谢EEworld和得捷电子的大力支持,提供这么好的一个活动让我们去学习。接下来就是自己的任务汇总。
汇总的视频链接:https://training.eeworld.com.cn/video/40822
软件代码链接:https://download.eeworld.com.cn/detail/%E5%B0%8F%E7%A5%9E123/634247
先进行一下自我简介,我是小神,一名业余电子爱好者,利用工作之余看到【Follow me第二季第1期】有活动,便参加,没想到第一次参加竟然有幸获得机会。此次活动选用的是一款Adafruit Circuit Playground Express开发板,板载丰富的传感器,如光线传感器,红外传感器,麦克风,加速度传感器,以及按键,LED灯,扬声器等。板子尺寸小巧,方便做一些电子DIY,实物图如下:
本次任务中我采购了三个物品,其中包括Adafruit Circuit Playground Express开发板(必备),超声波传感器(选配,为了完成距离检测),舵机(选配,为了完成章鱼哥任务),以下是全家福。
接下来就是任务汇总:
【入门任务(必做):开发环境搭建,板载LED点亮】
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑
利用板载按键,实现点亮不同LED灯的操作。这里我的软件逻辑是当点击A按键时,LED0会亮红灯,并持续500ms后熄灭;当点击B按键时,LED1会亮绿灯,并持续500ms后熄灭;当A和B按键同时按下时,LED3会亮黄灯,并持续500ms后熄灭。
input.buttonA.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(0, 0xff0000)
pause(500)
light.clear()
})
input.buttonB.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(1, 0x00ff00)
pause(500)
light.clear()
})
input.buttonsAB.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(3, 0xffff00)
pause(500)
light.clear()
})
视频演示如下:
[localvideo]74cf0c2e8c31f91553cdffcac3dc0342[/localvideo]
【基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换】
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑
软件逻辑是当A按键或者B按键都不被按下时,所有的LED灯显示为绿色;当A按键按下时,所有LED灯变成红色,并持续1s,接着显示七彩跑马灯并持续1s,然后恢复绿色LED状态;当B按键被按下时,所有LED灯变成蓝色,并持续1s,接着会有多色跑马灯显示,并持续1s,然后恢复绿色LED状态。
forever(function () {
if (input.buttonA.isPressed()) {
light.setAll(0xff0000)
pause(1000)
light.showAnimation(light.rainbowAnimation, 1000)
} else {
light.setAll(0x00ff00)
}
if (input.buttonB.wasPressed()) {
light.setAll(0x0000ff)
pause(1000)
light.showAnimation(light.cometAnimation, 1000)
} else {
light.setAll(0x00ff00)
}
})
视频演示如下:
[localvideo]a4f985d99b109e1eebc9cf59879be612[/localvideo]
【基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度】
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,电池,
利用板载的温度传感器和光线传感器,去感知外界环境温度的变化以及环境光线的变化,以LED的颜色以及LED的点亮数量来展示不同的区别。这里我的软件逻辑是将温度分成三个区间,[-5~22][23~26][27~50],当温度为[-5~22]LED灯显示蓝色,并且随着温度降低,点亮LED灯数量越多;当温度为[23~26]时,LED灯显示绿色,并且随着温度升高,点亮LED数量越多;当温度为[27~50]时,LED灯显示红色,并且当温度升高时,点亮LED灯越多。较为适宜的温度是绿色的,并且数量越多越适宜。同时将光线判断为亮度越高,点亮的LED越多,较为适宜的是2~3个灯。展示图片如下:
在冰箱里,环境温度低,亮蓝灯,可能是开着门拍,未达到相应的环境温度,会有绿灯亮起现象。
let value = input.lightLevel()
let value2 = input.temperature(TemperatureUnit.Celsius)
let list = [0, 1, 2, 3, 4]
let list2 = [5, 6, 7, 8, 9]
forever(function () {
value = Math.min(input.lightLevel() / 51.2, 5)
for (let i = 0; i <= value; i++) {
light.setPixelColor(list[i], 0xffff00)
}
for (let k = value; k <= 10; k++) {
light.setPixelColor(list[k], 0x000000)
}
})
forever(function () {
if (input.temperature(TemperatureUnit.Celsius) < 22) {
value2 = Math.min(Math.abs(input.temperature(TemperatureUnit.Celsius) - 21) / 5.4, 5)
for (let j = 0; j <= value2; j++) {
light.setPixelColor(list2[j], 0x0000ff)
}
for (let l = value; l <= 10; l++) {
light.setPixelColor(list[l], 0x000000)
}
} else {
if (input.temperature(TemperatureUnit.Celsius) >= 22 && input.temperature(TemperatureUnit.Celsius) <= 26) {
value2 = Math.min((input.temperature(TemperatureUnit.Celsius) - 21) / 1, 5)
for (let m = 0; m <= value2; m++) {
light.setPixelColor(list2[m], 0x00ff00)
}
for (let n = value; n <= 10; n++) {
light.setPixelColor(list[n], 0x000000)
}
} else {
value2 = Math.min((input.temperature(TemperatureUnit.Celsius) - 26) / 4.8, 5)
for (let o = 0; o <= value2; o++) {
light.setPixelColor(list2[o], 0xff0000)
}
for (let p = value; p <= 5; p++) {
light.setPixelColor(list[p], 0x000000)
}
}
}
})
视频演示如下:
[localvideo]d10815ac275c8b88739314e89de778dc[/localvideo]
【基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警】
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,超声波模块
这个任务中需要用到当时选购的超声波传感器,来检测物体的距离,同时也需要的对采集的数据处理,根据距离的远近判断点亮相应数量的LED灯,距离越近,亮的越少,距离越远,亮的越多。同时设置报警阈值,当靠近5cm时会触发蜂鸣器响,用来警告。
let distance = 0
loops.forever(function () {
pins.A2.digitalWrite(false)
control.waitMicros(2)
pins.A2.digitalWrite(true)
control.waitMicros(10)
pins.A2.digitalWrite(false)
distance = pins.A1.pulseIn(PulseValue.High) / 58
light.graph(distance, 30)
if (distance < 5) {
music.siren.play()
} else {
music.stopAllSounds()
}
})
视频演示如下:
[localvideo]8afe14f37ad337e6bf2f6d30edbb9406[/localvideo]
【进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果】
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,猫咪不倒翁玩具
接下来,要介绍的任务就是必做任务,这个就是抢了猫咪的玩具,估计记仇了,要用拳头揍我了,附上照片。将猫咪不倒翁玩具拆开,将开发板固定在上面,改装成可以随着角度变化,点亮响应位置的LED灯,主要利用了加速度传感器,将一个圆分成四个象限,去判断x,y,z的值,去做相应LED灯的显示。
forever(function () {
if (input.acceleration(Dimension.X) == 0 && input.acceleration(Dimension.Y) == 0 && input.acceleration(Dimension.Z) == 1023) {
light.clear()
} else {
if (input.acceleration(Dimension.X) > 0) {
if (input.acceleration(Dimension.Y) > 0) {
if (input.acceleration(Dimension.X) > input.acceleration(Dimension.Y)) {
light.setPixelColor(7, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
if (input.acceleration(Dimension.X) < input.acceleration(Dimension.Y)) {
light.setPixelColor(5, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
light.setPixelColor(6, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
} else {
light.setPixelColor(9, 0xff0000)
light.setPixelColor(8, 0xff0000)
control.waitMicros(100000)
light.clear()
}
} else {
if (input.acceleration(Dimension.X) < 0) {
if (input.acceleration(Dimension.Y) < 0) {
if (input.acceleration(Dimension.X) > input.acceleration(Dimension.Y)) {
light.setPixelColor(0, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
if (input.acceleration(Dimension.X) < input.acceleration(Dimension.Y)) {
light.setPixelColor(1, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
light.setPixelColor(3, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
} else {
light.setPixelColor(2, 0xff0000)
control.waitMicros(100000)
light.clear()
}
} else {
light.setPixelColor(4, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
}
})
视频演示效果如下:
[localvideo]022056c548a07bcd609abb2576294793[/localvideo]
【 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩】
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,矿泉水瓶,舵机,丝线,胶水,胶带,剪刀,笔、纸等工具
先准备一个空矿泉水瓶,将其一分为二,一部分做章鱼的身体和腿,一部分做章鱼的头部;
用笔在浅蓝色纸上画出章鱼哥的样子,并用胶带粘贴在章鱼哥的头部,组装好的具体效果图如下:
程序逻辑是跟随外界音量的大小,LED灯点亮的数量会随着声音的大小而变化,同时,舵机的速度会随着音量的大小而变化,舵机的角度固定,在45度~135度间转动(因为之前试过,将音量映射到舵机旋转角度上,效果不太好,就更换思路,音量体现在转动速度上)
let VOL = 0
let speed = 0
let LEDcount = 0
let pos = 0
let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let numLED = 10
servos.A1.setRange(45, 135)
servos.A1.setAngle(45)
forever(function () {
speed = Math.map(VOL, 0, 255, 0, 100)
servos.A1.run(speed)
servos.A1.setAngle(45)
pause(40)
servos.A1.setAngle(90)
pause(40)
servos.A1.setAngle(135)
pause(40)
servos.A1.setAngle(90)
pause(40)
pause(100)
})
forever(function () {
let angle = 0
VOL = input.soundLevel()
LEDcount = Math.map(VOL, 60, 150, 0, 10)
for (let i = 0; i <= LEDcount; i++) {
light.setPixelColor(list[i], 0xff00ff)
control.waitMicros(10000)
}
for (let j = LEDcount; j <= 10; j++) {
light.setPixelColor(list[j], 0x000000)
}
console.logValue("x", input.soundLevel())
console.logValue("y", angle)
console.logValue("z", VOL)
})
演示效果如下:
[localvideo]0e842d40869d866dd074d91615a46c48[/localvideo]
【创意任务三:水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果】
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,水果,杜邦线等
本次任务需要用到开发板的模拟量输入功能,将每个引脚的模拟量输入利用起来,用导线将其连接到水果上,用手触碰不同引脚连接的水果,会发出相应的音调,组合起来可以弹出“优美的”音乐,谓之水果钢琴。亮出我的干巴小柠檬,来展示水果钢琴。
forever(function () {
if (input.touchA1.isPressed()) {
music.playTone(988, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA2.wasPressed()) {
music.playTone(880, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA3.wasPressed()) {
music.playTone(784, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA4.wasPressed()) {
music.playTone(698, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA5.wasPressed()) {
music.playTone(659, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA6.wasPressed()) {
music.playTone(587, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA7.wasPressed()) {
music.playTone(523, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
})
视频演示效果如下:
[localvideo]40ffcb814f5bc42f5d82a2c38d8f5f36[/localvideo]
由于时间关系,并未做创意一,希望活动后再继续学习。
【学习心得】其实本次任务应该都不难,只是我自己太菜了,再加上工作之余来做的话,时间上比较紧凑。通过本次任务,学习到了点亮LED灯,流水灯,超声波测距,温度,光线,加速度传感器,喇叭,按键等应用。基本涵盖了常见的电子DIY领域,希望以后可以再次有机会参加,继续在电子世界里探索。
活动很好,下次继续!
最后,再次感谢EEworld和得捷电子,以及帮助过我的每一位小伙伴。
附件源代码:
-
上传了资料:
【Follow me第二季第1期】源代码
-
发表了主题帖:
【Follow me第二季第1期】不倒翁+“绿色”章鱼哥
没想到一个月时间很快就过去了,利用工作之余将【Follow me第二季第一期】的进阶任务和创意任务完成,再次感谢得捷电子以及EEworld的大力支持,让自己将工作的闲暇时光利用起来,学习编程方面的相关知识,并动手操作。
看到标题后,可能有的小伙伴就有疑问了,“我记得《海绵宝宝》中的章鱼哥是浅蓝色的呀,怎么是绿色的呢?”,因为我制作章鱼哥的时候是选择的矿泉水瓶,也算是一种响应国家号召,不随意丢垃圾,变废为宝的一种方式,这样就将原本一无是处的空矿泉水瓶变成一个有意思的创意作品,也是体现了矿泉水瓶的价值呢,所以我这里选择了“绿色”的章鱼哥的标题,也是希望看到帖子的小伙伴能从身边做起,让我们为世界更绿色,付出自己的一点努力。话不多说,直接进入正题。
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,矿泉水瓶,舵机,鸡毛不倒翁猫玩具,丝线,胶水,胶带,剪刀,笔、纸等工具
【编程软件】windows自带的Microsoft MakeCode,图形化编程工具,让更多玩家更易上手
【 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩】
先准备一个空矿泉水瓶,将其一分为二,一部分做章鱼的身体和腿,一部分做章鱼的头部;
按照章鱼的样子,剪下八条腿,并利用胶水将其固定在身体上;
利用丝线将章鱼哥的八条腿拉紧,并固定在舵机旋转盘上,
用笔在浅蓝色纸上画出章鱼哥的样子,并用胶带粘贴在章鱼哥的头部,组装好的具体效果图如下:
程序逻辑是跟随外界音量的大小,LED灯点亮的数量会随着声音的大小而变化,同时,舵机的速度会随着音量的大小而变化,舵机的角度固定,在45度~135度间转动(因为之前试过,将音量映射到舵机旋转角度上,效果不太好,就更换思路,音量体现在转动速度上),具体的图形化编程界面如下:
代码如下:
let VOL = 0
let speed = 0
let LEDcount = 0
let pos = 0
let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let numLED = 10
servos.A1.setRange(45, 135)
servos.A1.setAngle(45)
forever(function () {
speed = Math.map(VOL, 0, 255, 0, 100)
servos.A1.run(speed)
servos.A1.setAngle(45)
pause(40)
servos.A1.setAngle(90)
pause(40)
servos.A1.setAngle(135)
pause(40)
servos.A1.setAngle(90)
pause(40)
pause(100)
})
forever(function () {
let angle = 0
VOL = input.soundLevel()
LEDcount = Math.map(VOL, 60, 150, 0, 10)
for (let i = 0; i <= LEDcount; i++) {
light.setPixelColor(list[i], 0xff00ff)
control.waitMicros(10000)
}
for (let j = LEDcount; j <= 10; j++) {
light.setPixelColor(list[j], 0x000000)
}
console.logValue("x", input.soundLevel())
console.logValue("y", angle)
console.logValue("z", VOL)
})
演示视频如下:
[localvideo]6bbd2dc72caabe63d9a8ce80949340fd[/localvideo]
章鱼哥的腿扭动的可能不太明显,线接的有点长了。。。,尴尬!不过,也算是可以扭动的“绿色”章鱼哥。
【进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果】
接下来,要介绍的任务就是必做任务,这个就是抢了猫咪的玩具,估计记仇了,要用拳头揍我了,附上照片。将猫咪不倒翁玩具拆开,将开发板固定在上面,改装成可以随着角度变化,点亮响应位置的LED灯,主要利用了加速度传感器,将一个圆分成四个象限,去判断x,y,z的值,去做相应LED灯的显示。
具体图形化编程界面如下图所示:
实现代码如下:
forever(function () {
if (input.acceleration(Dimension.X) == 0 && input.acceleration(Dimension.Y) == 0 && input.acceleration(Dimension.Z) == 1023) {
light.clear()
} else {
if (input.acceleration(Dimension.X) > 0) {
if (input.acceleration(Dimension.Y) > 0) {
if (input.acceleration(Dimension.X) > input.acceleration(Dimension.Y)) {
light.setPixelColor(7, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
if (input.acceleration(Dimension.X) < input.acceleration(Dimension.Y)) {
light.setPixelColor(5, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
light.setPixelColor(6, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
} else {
light.setPixelColor(9, 0xff0000)
light.setPixelColor(8, 0xff0000)
control.waitMicros(100000)
light.clear()
}
} else {
if (input.acceleration(Dimension.X) < 0) {
if (input.acceleration(Dimension.Y) < 0) {
if (input.acceleration(Dimension.X) > input.acceleration(Dimension.Y)) {
light.setPixelColor(0, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
if (input.acceleration(Dimension.X) < input.acceleration(Dimension.Y)) {
light.setPixelColor(1, 0xff0000)
control.waitMicros(100000)
light.clear()
} else {
light.setPixelColor(3, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
} else {
light.setPixelColor(2, 0xff0000)
control.waitMicros(100000)
light.clear()
}
} else {
light.setPixelColor(4, 0xff0000)
control.waitMicros(100000)
light.clear()
}
}
}
})
这里还要提醒各位小伙伴,这个makecode的界面上,开发板放置相当于就是面对着我们,并不是与地面水平的关系,因为我用界面的仿真工具调了半天,才发现下载进板子后,程序效果不对,太坑了,希望以后小伙伴在使用时候,避坑。。。。,本来都调好了,还能看到,x,y,z的值。但是,方向不对。。。。。
视频演示如下:
[localvideo]b360872bb5964fb15207ab76c4297d0c[/localvideo]
由于时间关系,并未做创意一,希望活动后再继续学习。
- 2024-08-31
-
加入了学习《【Follow me第二季第1期】全部任务演示短视频》,观看 【Follow me第二季第1期】任务演示视频
-
加入了学习《Follow me第二季第1期》,观看 创意任务二:章鱼哥
-
发表了主题帖:
【Follow me第二季第1期】基础任务二、三+创意任务三
经过了前面入门任务和基础任务,让我们对adafruit circuit playgrand express这款开发板有了进一步的了解,同时结合基础任务二、基础任务三,以及创意任务三让我们继续深入探究开发板的有趣玩法。
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑,水果若干,超声波传感器
【编程软件】windows自带的Microsoft MakeCode,图形化编程工具,让更多玩家更易上手
下面我将分开展示每一个任务:
【基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度】利用板载的温度传感器和光线传感器,去感知外界环境温度的变化以及环境光线的变化,以LED的颜色以及LED的点亮数量来展示不同的区别。这里我的软件逻辑是将温度分成三个区间,[-5~22][23~26][27~50],当温度为[-5~22]LED灯显示蓝色,并且随着温度降低,点亮LED灯数量越多;当温度为[23~26]时,LED灯显示绿色,并且随着温度升高,点亮LED数量越多;当温度为[27~50]时,LED灯显示红色,并且当温度升高时,点亮LED灯越多。较为适宜的温度是绿色的,并且数量越多越适宜。同时将光线判断为亮度越高,点亮的LED越多,较为适宜的是2~3个灯。展示图片如下:
在冰箱里,环境温度低,亮蓝灯,可能是开着门拍,未达到相应的环境温度,会有绿灯亮起现象。
环境温度合适的绿色。
代码的截图如下:
具体代码如下:
let value = input.lightLevel()
let value2 = input.temperature(TemperatureUnit.Celsius)
let list = [0, 1, 2, 3, 4]
let list2 = [5, 6, 7, 8, 9]
forever(function () {
value = Math.min(input.lightLevel() / 51.2, 5)
for (let i = 0; i <= value; i++) {
light.setPixelColor(list[i], 0xffff00)
}
for (let k = value; k <= 10; k++) {
light.setPixelColor(list[k], 0x000000)
}
})
forever(function () {
if (input.temperature(TemperatureUnit.Celsius) < 22) {
value2 = Math.min(Math.abs(input.temperature(TemperatureUnit.Celsius) - 21) / 5.4, 5)
for (let j = 0; j <= value2; j++) {
light.setPixelColor(list2[j], 0x0000ff)
}
for (let l = value; l <= 10; l++) {
light.setPixelColor(list[l], 0x000000)
}
} else {
if (input.temperature(TemperatureUnit.Celsius) >= 22 && input.temperature(TemperatureUnit.Celsius) <= 26) {
value2 = Math.min((input.temperature(TemperatureUnit.Celsius) - 21) / 1, 5)
for (let m = 0; m <= value2; m++) {
light.setPixelColor(list2[m], 0x00ff00)
}
for (let n = value; n <= 10; n++) {
light.setPixelColor(list[n], 0x000000)
}
} else {
value2 = Math.min((input.temperature(TemperatureUnit.Celsius) - 26) / 4.8, 5)
for (let o = 0; o <= value2; o++) {
light.setPixelColor(list2[o], 0xff0000)
}
for (let p = value; p <= 5; p++) {
light.setPixelColor(list[p], 0x000000)
}
}
}
})
视频如下:
[localvideo]97526fddcd3c2b388c11a0587a3b914e[/localvideo]
【基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警】这个任务中需要用到当时选购的超声波传感器,来检测物体的距离,同时也需要的对采集的数据处理,根据距离的远近判断点亮相应数量的LED灯,距离越近,亮的越少,距离越远,亮的越多。同时设置报警阈值,当靠近5cm时会触发蜂鸣器响,用来警告。
以下为图形化编程界面:
具体实现代码如下:
let distance = 0
loops.forever(function () {
pins.A2.digitalWrite(false)
control.waitMicros(2)
pins.A2.digitalWrite(true)
control.waitMicros(10)
pins.A2.digitalWrite(false)
distance = pins.A1.pulseIn(PulseValue.High) / 58
light.graph(distance, 30)
if (distance < 5) {
music.siren.play()
} else {
music.stopAllSounds()
}
})
视频如下:
[localvideo]1a3c24eb87ced23fa5af1afd6db1fa9f[/localvideo]
【创意任务三:水果钢琴——通过触摸水果弹奏音乐,并配合灯光效果】本次任务需要用到开发板的模拟量输入功能,将每个引脚的模拟量输入利用起来,用导线将其连接到水果上,用手触碰不同引脚连接的水果,会发出相应的音调,组合起来可以弹出“优美的”音乐,谓之水果钢琴。亮出我的干巴小柠檬,来展示水果钢琴。
以下是实现的图形化编程界面:
具体实现代码:
forever(function () {
if (input.touchA1.isPressed()) {
music.playTone(988, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA2.wasPressed()) {
music.playTone(880, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA3.wasPressed()) {
music.playTone(784, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA4.wasPressed()) {
music.playTone(698, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA5.wasPressed()) {
music.playTone(659, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA6.wasPressed()) {
music.playTone(587, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
if (input.touchA7.wasPressed()) {
music.playTone(523, music.beat(BeatFraction.Double))
pause(1)
music.stopAllSounds()
}
})
视频展示如下:
[localvideo]cd99a384d1a1917041807936ee97ae55[/localvideo]
- 2024-08-25
-
发表了主题帖:
【Follow me第二季第1期】入门任务+基础任务一
大家好,我是小神123,很荣幸能够入选【Follow me第二季第1期】活动,作为活动参与者,跟着官方一起学习adafruit circuit playgrand express这款开发板。第一次参加【follow me】活动,自己是一名电子爱好者,接着这次机会,可以让自己对编程有个更加深入的动手实践,大大提升自己的动手能力以及思维逻辑能力,同时再次感谢得捷电子给予此次机会。这款开发板
Adafruit Circuit Playground Express是一体化设计板,具有处理器、传感器、LED、USB等,非常适合用于电子产品和编程,能够让创意充分发挥。
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑
【编程软件】windows自带的Microsoft MakeCode,图形化编程工具,让更多玩家更易上手
【入门任务(必做):开发环境搭建,板载LED点亮】利用板载按键,实现点亮不同LED灯的操作。这里我的软件逻辑是当点击A按键时,LED0会亮红灯,并持续500ms后熄灭;当点击B按键时,LED1会亮绿灯,并持续500ms后熄灭;当A和B按键同时按下时,LED3会亮黄灯,并持续500ms后熄灭。因为是图形化编程,这里直接放一下截图:
具体代码如下:
input.buttonA.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(0, 0xff0000)
pause(500)
light.clear()
})
input.buttonB.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(1, 0x00ff00)
pause(500)
light.clear()
})
input.buttonsAB.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(3, 0xffff00)
pause(500)
light.clear()
})
【基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换】这个任务已经在我们熟悉了入门点亮LED灯之后,我们依旧利用按键与LED的搭配来完成这一任务。这里软件逻辑是当A按键或者B按键都不被按下时,所有的LED灯显示为绿色;当A按键按下时,所有LED灯变成红色,并持续1s,接着显示七彩跑马灯并持续1s,然后恢复绿色LED状态;当B按键被按下时,所有LED灯变成蓝色,并持续1s,接着会有多色跑马灯显示,并持续1s,然后恢复绿色LED状态。图形化编程界面如下图所示:
具体代码如下:
forever(function () {
if (input.buttonA.isPressed()) {
light.setAll(0xff0000)
pause(1000)
light.showAnimation(light.rainbowAnimation, 1000)
} else {
light.setAll(0x00ff00)
}
if (input.buttonB.wasPressed()) {
light.setAll(0x0000ff)
pause(1000)
light.showAnimation(light.cometAnimation, 1000)
} else {
light.setAll(0x00ff00)
}
})
附上视频:
[localvideo]3d077d822b06cad1c04db219f7ed48f4[/localvideo]
[localvideo]1259d6fa23fc0afe1862adb3322c2dd8[/localvideo]
-
加入了学习《【Follow me第二季第1期】任务汇总展示》,观看 【Follow me第二季第1期】任务汇总展示
-
发表了主题帖:
【Follow me第二季第1期】入门任务+基础任务一
本帖最后由 小神123 于 2024-8-25 22:42 编辑
大家好,我是小神123,很荣幸能够入选【Follow me第二季第1期】活动,作为活动参与者,跟着官方一起学习adafruit circuit playgrand express这款开发板。第一次参加【follow me】活动,自己是一名电子爱好者,接着这次机会,可以让自己对编程有个更加深入的动手实践,大大提升自己的动手能力以及思维逻辑能力,同时再次感谢得捷电子给予此次机会。这款开发板
Adafruit Circuit Playground Express是一体化设计板,具有处理器、传感器、LED、USB等,非常适合用于电子产品和编程,能够让创意充分发挥。
【所需物料】Adafruit Circuit Playground Express开发板,MicroUSB线,电脑
【编程软件】windows自带的Microsoft MakeCode,图形化编程工具,让更多玩家更易上手
【入门任务(必做):开发环境搭建,板载LED点亮】利用板载按键,实现点亮不同LED灯的操作。这里我的软件逻辑是当点击A按键时,LED0会亮红灯,并持续500ms后熄灭;当点击B按键时,LED1会亮绿灯,并持续500ms后熄灭;当A和B按键同时按下时,LED3会亮黄灯,并持续500ms后熄灭。因为是图形化编程,这里直接放一下截图:
具体代码如下:
input.buttonA.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(0, 0xff0000)
pause(500)
light.clear()
})
input.buttonB.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(1, 0x00ff00)
pause(500)
light.clear()
})
input.buttonsAB.onEvent(ButtonEvent.Click, function () {
light.setPixelColor(3, 0xffff00)
pause(500)
light.clear()
})
【基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换】这个任务已经在我们熟悉了入门点亮LED灯之后,我们依旧利用按键与LED的搭配来完成这一任务。这里软件逻辑是当A按键或者B按键都不被按下时,所有的LED灯显示为绿色;当A按键按下时,所有LED灯变成红色,并持续1s,接着显示七彩跑马灯并持续1s,然后恢复绿色LED状态;当B按键被按下时,所有LED灯变成蓝色,并持续1s,接着会有多色跑马灯显示,并持续1s,然后恢复绿色LED状态。图形化编程界面如下图所示:
具体代码如下:
forever(function () {
if (input.buttonA.isPressed()) {
light.setAll(0xff0000)
pause(1000)
light.showAnimation(light.rainbowAnimation, 1000)
} else {
light.setAll(0x00ff00)
}
if (input.buttonB.wasPressed()) {
light.setAll(0x0000ff)
pause(1000)
light.showAnimation(light.cometAnimation, 1000)
} else {
light.setAll(0x00ff00)
}
})
附上视频:
[localvideo]21db80d10ed56a367a4179c268951440[/localvideo]
[localvideo]ce2222079b61093b99d328b0edaaec62[/localvideo]
-
加入了学习《【Follow me第二季第1期】在arduino环境下多app调度全部任务》,观看 【Follow me第二季第1期】在arduino环境下多app调度全部任务
-
加入了学习《FollowMe 第二季: 1 Adafruit Circuit Playground Express及任务讲解》,观看 Adafruit Circuit Playground Express 及任务讲解
- 2024-08-11
-
回复了主题帖:
【2024 DigiKey 创意大赛】开箱贴ESP32-S3-LCD与BME680
秦天qintian0303 发表于 2024-8-9 10:04
这两个开发板或者传感器可以说是这次活动选择最多的了吧
是吗?,看来要拿奖就有点悬了,看各位大佬们表演
- 2024-08-08
-
发表了主题帖:
【2024 DigiKey 创意大赛】开箱贴ESP32-S3-LCD与BME680
首先,很荣幸能够入选【2024 DigiKey 创意大赛】,本次主题是DigiKey “感知万物,乐享生活”创意大赛。怀着激动的心情,用颤抖的双手打开参与活动的物料,本次我选择的是一块ESP32-S3-LCD-EV-Board和BME680传感器。
先来一波包装图,
接下来引入眼帘的是ESP32-S3-LCD-EV-Board,ESP32-S3-LCD-EV-Board 是一款基于 ESP32-S3 芯片的屏幕交互开发板,通过搭配不同类型的 LCD 子板,可以驱动 IIC、SPI、8080 以及 RGB 接口的 LCD 显示屏。同时它还搭载双麦克风阵列,支持语音识别和近/远场语音唤醒,具有触摸屏交互和语音交互功能,满足用户对多种不同分辨率以及接口的触摸屏应用产品的开发需求。满满的高级感,好大一块屏幕,
屏幕和主板之间通过排针连接,主板预留了GPIO口,方便我们做更多的扩展。
给主板供电后,有显示厂家的出厂默认界面UI,感受这款产品在智能家居类产品上的应用。界面风格不错,支持触摸和语音,
另外就是BME680环境传感器是一款四合一MEMS环境传感器,可测量VOC(挥发性有机物)、温度、湿度、气压这四个参数,非常适用于监测空气质量。由于采用了MEMS技术,该传感器体积小、功耗低,因此也适用于低功耗场合,如可穿戴等。
板载电源稳压芯片和I2C电平转换电路并引出了SPI接口。非常便于系统集成和场景应用。
希望自己可以利用这么优秀的参赛物料,完美完成自己的创意与作品,一起学习,冲吧,小神。