- 2024-09-02
-
发表了主题帖:
【Follow me第二季第1期】任务整合贴
本帖最后由 eew_UqDS1M 于 2024-11-5 23:20 编辑
# 【Follow me第二季第1期】任务整合贴
[localvideo]ff5e2a95e4a4e2755e2ad8a73d1919bb[/localvideo]
## 物料介绍
1. Adafruit Circuit Playground Express
采用的是本次Follow me的主控板Adafruit Circuit Playground Express,这款主控板的特点是集成了红外、声、光电容等多种传感器
2. FS90R
## 入门任务(必做):开发环境搭建,板载LED点亮
[https://bbs.eeworld.com.cn/thread-1292225-1-1.html](https://bbs.eeworld.com.cn/thread-1292225-1-1.html)
### 环境配置
1. 安装platformio 首先需要确保在vscode环境下安装platformio插件
2. 创建项目 这里的话打开platformio,点击创建项目,选择Adafruit Circuit Playground Express
3. 修改ini 打开 platformio.ini 文件,修改内容如下:
```c++
[env:adafruit_circuitplayground_m0]
platform = atmelsam
board = adafruit_circuitplayground_m0
framework = arduino
lib_deps =
adafruit/Adafruit NeoPixel@^1.12.3
adafruit/Adafruit Circuit Playground@^1.12.0
monitor_speed = 115200
```
这样的话就创建好了platformio的开发环境了。
## 入门任务(必做):开发环境搭建,板载LED点亮
流程图如下:
代码如下:
```c++
#include
float minTemp = 20.0; // 最低温度(摄氏度)
float maxTemp = 30.0; // 最高温度(摄氏度)
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
void loop() {
float temperature = CircuitPlayground.temperature();
int light = CircuitPlayground.lightSensor();
// 将光线传感器的读数映射到0-10范围(对应10个LED)
int mappedLight = map(light, 0, 100, 0, 10);
// 将温度映射到0-255范围(用于颜色)
int tempColor = map(temperature * 10, 0, 1023, 0, 255);
tempColor = constrain(tempColor, 0, 255);
Serial.print("光线: ");
Serial.print(light);
Serial.print(", 温度: ");
Serial.print(temperature);
Serial.print("°C, 光线: ");
Serial.print(mappedLight);
Serial.println("/10");
// 设置LED颜色和数量
for (int i = 0; i < 10; i++) {
if (i < mappedLight) {
// 根据温度设置颜色:蓝色(冷)到红色(热)
CircuitPlayground.setPixelColor(i, tempColor, 0, 255 - tempColor);
} else {
// 关闭未使用的LED
CircuitPlayground.setPixelColor(i, 0, 0, 0);
}
}
delay(1000); // 每秒更新一次
}
```
## 基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
[https://bbs.eeworld.com.cn/thread-1292226-1-1.html](https://bbs.eeworld.com.cn/thread-1292226-1-1.html)
### 步骤1:确定基本结构
我们需要一个主循环来持续运行我们的程序,并在其中检测按钮状态和切换灯光效果。因此,我们可以使用loop()函数作为主体,并在其中实现模式切换逻辑。
### 步骤2:设计灯光效果函数
为了使代码更加模块化和易于理解,我们可以为每种灯光效果创建单独的函数:
runningLight(): 实现走马灯效果
breathingLight(): 实现炫彩呼吸灯效果
### 步骤3:实现走马灯效果
对于走马灯效果,我们需要考虑:
如何依次点亮每个LED?
如何生成不同的颜色?
如何控制灯光的移动速度?
我们可以使用一个循环来遍历所有LED,利用CircuitPlayground.colorWheel()函数生成彩虹色,并使用delay()函数控制速度。
### 步骤4:实现炫彩呼吸灯效果
对于呼吸灯效果,我们需要思考:
如何实现亮度的渐变?
如何使所有LED同时变化?
我们可以使用两个嵌套循环:外层循环控制亮度变化,内层循环设置所有LED的颜色。
### 步骤5:设计模式切换机制
为了实现模式切换,我们需要:
定义一个变量来记录当前模式
检测按钮是否被按下
在按钮被按下时切换模式
我们可以使用一个布尔变量来防止按钮被持续按住时重复触发。
流程图如下所示:
代码如下所示:
```c++
#include
// 定义常量
const int NUM_PIXELS = 10;
const int LEFT_BUTTON = 4;
const int DELAY_TIME = 50;
// 定义全局变量
int mode = 0; // 0: 跑马灯, 1: 呼吸灯
bool buttonPressed = false;
void runningLight();
void breathingLight();
void setup() {
CircuitPlayground.begin();
}
void loop() {
// 检查左按钮是否被按下
if (CircuitPlayground.leftButton() && !buttonPressed) {
mode = (mode + 1) % 2; // 切换模式
buttonPressed = true;
} else if (!CircuitPlayground.leftButton()) {
buttonPressed = false;
}
// 根据当前模式执行相应的灯光效果
if (mode == 0) {
runningLight();
} else {
breathingLight();
}
}
// 跑马灯效果
void runningLight() {
for (int i = 0; i < NUM_PIXELS; i++) {
CircuitPlayground.setPixelColor(i, CircuitPlayground.colorWheel(25 * i));
delay(DELAY_TIME);
CircuitPlayground.setPixelColor(i, 0);
}
}
// 呼吸灯效果
void breathingLight() {
for (int brightness = 0; brightness < 255; brightness++) {
for (int i = 0; i < NUM_PIXELS; i++) {
CircuitPlayground.setPixelColor(i, brightness, brightness, brightness);
}
delay(5);
}
for (int brightness = 255; brightness >= 0; brightness--) {
for (int i = 0; i < NUM_PIXELS; i++) {
CircuitPlayground.setPixelColor(i, brightness, brightness, brightness);
}
delay(5);
}
}
```
效果如下所示:
## 基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
[https://bbs.eeworld.com.cn/thread-1292227-1-1.html](https://bbs.eeworld.com.cn/thread-1292227-1-1.html)
### 目标
监测环境温度
检测环境光线强度
使用板载LED显示环境舒适度
### 实现思路
1. 温度检测
我们使用Circuit Playground Express内置的温度传感器来获取环境温度。温度值将被映射到颜色范围,从蓝色(冷)到红色(热)。
2. 光线检测
利用板载的光线传感器,我们可以检测环境光线强度。光线强度将决定点亮LED的数量。
3. LED显示
我们将使用10个板载LED来展示环境状态:
LED的颜色表示温度:蓝色代表低温,红色代表高温。
点亮的LED数量表示光线强度:越亮环境点亮的LED越多。
流程图如下所示
代码如下所示:
```c++
#include
float minTemp = 20.0; // 最低温度(摄氏度)
float maxTemp = 30.0; // 最高温度(摄氏度)
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
void loop() {
float temperature = CircuitPlayground.temperature();
int light = CircuitPlayground.lightSensor();
// 将光线传感器的读数映射到0-10范围(对应10个LED)
int mappedLight = map(light, 0, 100, 0, 10);
// 将温度映射到0-255范围(用于颜色)
int tempColor = map(temperature * 10, 0, 1023, 0, 255);
tempColor = constrain(tempColor, 0, 255);
Serial.print("光线: ");
Serial.print(light);
Serial.print(", 温度: ");
Serial.print(temperature);
Serial.print("°C, 光线: ");
Serial.print(mappedLight);
Serial.println("/10");
// 设置LED颜色和数量
for (int i = 0; i < 10; i++) {
if (i < mappedLight) {
// 根据温度设置颜色:蓝色(冷)到红色(热)
CircuitPlayground.setPixelColor(i, tempColor, 0, 255 - tempColor);
} else {
// 关闭未使用的LED
CircuitPlayground.setPixelColor(i, 0, 0, 0);
}
}
delay(1000); // 每秒更新一次
}
```
效果图如下:
## 基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
[https://bbs.eeworld.com.cn/thread-1292219-1-1.html](https://bbs.eeworld.com.cn/thread-1292219-1-1.html)
这个任务我是采用光线传感器来检测环境光的变化,从而判断是否有物体接近。当检测到入侵时,设备将发起声音报警。我将详细介绍软件流程图、各任务对应的主要代码片段以及功能展示。讲道理应该是采用红外的方式来实现,但是实际测试下来发现红外的效果并没有想象中那么好。
程序流程图如下:
代码如下:
```c++
#include
const int LIGHT_THRESHOLD = 300; // 光线变化阈值,需要根据实际测试调整
const unsigned long CHECK_INTERVAL = 100; // 检查间隔,单位毫秒
unsigned long lastCheckTime = 0;
int lastLightLevel = 0;
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastCheckTime >= CHECK_INTERVAL) {
// 读取光线传感器的数据
int currentLightLevel = CircuitPlayground.lightSensor();
Serial.print("当前光线强度: ");
Serial.println(currentLightLevel);
// 判断光线变化是否超过阈值
if (abs(currentLightLevel - lastLightLevel) > LIGHT_THRESHOLD) {
Serial.println("警告: 检测到入侵!");
// 发起声音报警
CircuitPlayground.playTone(440, 500); // 播放440Hz的音调500毫秒
} else {
Serial.println("光线变化在安全范围内");
}
// 更新上次的光线强度
lastLightLevel = currentLightLevel;
lastCheckTime = currentTime;
}
}
```
1. 这里首先使用CircuitPlayground.lightSensor()读取光线传感器的数据。
2. 比较当前光线强度与上次的光线强度,判断变化是否超过阈值。
3. 如果光线变化超过阈值,发起声音报警(播放440Hz的音调500毫秒)。
4. 更新上次的光线强度,以便在下次循环中进行比较
效果图如下:
## 进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
[https://bbs.eeworld.com.cn/thread-1292222-1-1.html](https://bbs.eeworld.com.cn/thread-1292222-1-1.html)
这里我将通过检测板子的倾斜方向来控制LED 灯的颜色和亮灯位置,从而展示不同的灯光效果。
程序流程图如下:
代码如下所示:
```c++
#include
#include
void setup() {
CircuitPlayground.begin();
}
void loop() {
float x = CircuitPlayground.motionX();
float y = CircuitPlayground.motionY();
uint32_t color;
static uint8_t colorIndex = 0; // 用于颜色渐变的索引
int ledPosition1 = 0; // 第一个亮灯的位置
int ledPosition2 = 1; // 第二个亮灯的位置
bool allLedsOn = false; // 标记是否所有灯都亮
// 根据倾斜方向确定颜色索引的变化和亮灯的位置
if (x > 3) {
colorIndex = 85; // 绿色
ledPosition1 = 7; // 右侧
ledPosition2 = 7;
} else if (x < -3) {
colorIndex = 170; // 蓝色
ledPosition1 = 2; // 左侧
ledPosition2 = 2;
} else if (y > 3) {
colorIndex = 42; // 黄色
ledPosition1 = 0; // 前侧
ledPosition2 = 9;
} else if (y < -3) {
colorIndex = 127; // 紫色
ledPosition1 = 4; // 后侧
ledPosition2 = 5;
} else {
colorIndex = 255; // 红色
allLedsOn = true; // 中间情况下所有灯都亮
}
// 颜色渐变
color = CircuitPlayground.colorWheel(colorIndex);
colorIndex = (colorIndex + 1) % 256; // 循环颜色索引
// 设置所有像素的颜色
for (int i = 0; i < 10; i++) {
if (allLedsOn) {
CircuitPlayground.setPixelColor(i, color); // 所有灯都亮
} else if (i == ledPosition1 || i == ledPosition2) {
CircuitPlayground.setPixelColor(i, color);
} else {
CircuitPlayground.setPixelColor(i, 0); // 其他灯熄灭
}
}
delay(100);
}
```
效果如下:
## 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
这个任务就是要用开发板识别环境中的声音大小,然后控制舵机作出相应的动作。由于我手头没有鳄鱼夹,这里就用演示图的方式来展示了。
流程图如下:
代码如下:
```c++
#include
#include
// 滤波系数
const float alpha = 0.3;
float filteredSoundLevel = 0;
// 舵机定义
const int servoPin = A3; // 舵机连接的引脚
Servo myServo;
const int neutralSpeed = 90; // 中立位置速度
const int leftSpeed = 84; // 左转速度
const int rightSpeed = 94; // 右转速度
const int turnDuration = 1900; // 转动持续时间(统一左转和右转)
const int delayAfterTurn = 5000; // 等待时间
void setup() {
CircuitPlayground.begin();
Serial.begin(115200); // 用于调试
myServo.attach(servoPin); // 附加舵机到指定引脚
myServo.write(neutralSpeed); // 设置舵机初始速度为停止
}
void loop() {
checkButtons();
float soundLevel = CircuitPlayground.mic.soundPressureLevel(10);
// 滤波
filteredSoundLevel = alpha * soundLevel + (1 - alpha) * filteredSoundLevel;
Serial.print("Raw Sound Level: ");
Serial.print(soundLevel);
Serial.print(", Filtered Sound Level: ");
Serial.println(filteredSoundLevel);
handleSoundLevel(filteredSoundLevel);
delay(200);
}
void handleSoundLevel(float soundLevel) {
// 计算亮灯的数量
int ledCountToLight = map(soundLevel, 55, 70, 0, 10);
ledCountToLight = constrain(ledCountToLight, 0, 10);
Serial.print("LED Count: ");
Serial.println(ledCountToLight);
// 更新LED显示
for (int i = 0; i < 10; i++) {
if (i < ledCountToLight) {
CircuitPlayground.setPixelColor(i, 0, 150, 0); // 绿色
} else {
CircuitPlayground.setPixelColor(i, 0, 0, 0); // 关闭LED
}
}
if (ledCountToLight >= 9) {
turnLeft180();
delay(delayAfterTurn);
turnRight180();
}
}
void turnLeft180() {
myServo.write(leftSpeed); // 设置舵机左转速度
delay(turnDuration); // 转动持续时间
myServo.write(neutralSpeed); // 停止舵机
}
void turnRight180() {
myServo.write(rightSpeed); // 设置舵机右转速度
delay(turnDuration); // 转动持续时间
myServo.write(neutralSpeed); // 停止舵机
}
void checkButtons() {
if (CircuitPlayground.leftButton()) {
turnLeft180();
delay(500);
}
if (CircuitPlayground.rightButton()) {
turnRight180();
delay(500);
}
}
```
效果如下:
## 活动心得
这次eeworld的Follow me活动让我有机会深入了解了一块功能非常强大的开发板。通过这个项目,我学会了使用多种外设,包括电容、灯光、声效、红外和加速度传感器。这不仅提升了我的个人能力,还激发了我的创造力。此外,这块板子支持Arduino、CircuitPython、MakeCode等多种编程工具,能够满足不同阶段开发者的需求。我计划学习其他模块扩展,再进一步的学习。非常感谢能够参与这个活动,与大家一起学习并分享经验。
## 源码
[https://download.eeworld.com.cn/detail/eew_UqDS1M/634252](https://download.eeworld.com.cn/detail/eew_UqDS1M/634252)
-
上传了资料:
Follow me 第二季第1期 代码
-
发表了主题帖:
【Follow me第二季第1期】监测环境温度和光线,通过板载LED展示舒适程度
# 【Follow me第二季第1期】监测环境温度和光线,通过板载LED展示舒适程度
## 目标
1. 监测环境温度
2. 检测环境光线强度
3. 使用板载LED显示环境舒适度
## 实现思路
### 1. 温度检测
我们使用Circuit Playground Express内置的温度传感器来获取环境温度。温度值将被映射到颜色范围,从蓝色(冷)到红色(热)。
### 2. 光线检测
利用板载的光线传感器,我们可以检测环境光线强度。光线强度将决定点亮LED的数量。
### 3. LED显示
我们将使用10个板载LED来展示环境状态:
- LED的颜色表示温度:蓝色代表低温,红色代表高温。
- 点亮的LED数量表示光线强度:越亮环境点亮的LED越多。
## 代码实现
以下是实现这个项目的Arduino代码:
```c++
#include
float minTemp = 20.0; // 最低温度(摄氏度)
float maxTemp = 30.0; // 最高温度(摄氏度)
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
void loop() {
float temperature = CircuitPlayground.temperature();
int light = CircuitPlayground.lightSensor();
// 将光线传感器的读数映射到0-10范围(对应10个LED)
int mappedLight = map(light, 0, 100, 0, 10);
// 将温度映射到0-255范围(用于颜色)
int tempColor = map(temperature * 10, 0, 1023, 0, 255);
tempColor = constrain(tempColor, 0, 255);
Serial.print("光线: ");
Serial.print(light);
Serial.print(", 温度: ");
Serial.print(temperature);
Serial.print("°C, 光线: ");
Serial.print(mappedLight);
Serial.println("/10");
// 设置LED颜色和数量
for (int i = 0; i < 10; i++) {
if (i < mappedLight) {
// 根据温度设置颜色:蓝色(冷)到红色(热)
CircuitPlayground.setPixelColor(i, tempColor, 0, 255 - tempColor);
} else {
// 关闭未使用的LED
CircuitPlayground.setPixelColor(i, 0, 0, 0);
}
}
delay(1000); // 每秒更新一次
}
```
## 代码解析
1. 我们首先包含了Adafruit Circuit Playground库,并定义了温度范围的常量。
2. 在`setup()`函数中,我们初始化了Circuit Playground和串口通信。
3. `loop()`函数是主循环,它执行以下操作:
- 读取温度和光线传感器的值
- 将光线值映射到0-10范围,对应10个LED
- 将温度映射到0-255范围,用于设置LED颜色
- 通过串口输出传感器读数
- 根据温度和光线值设置LED的颜色和数量
4. 我们使用`map()`函数将传感器读数映射到所需范围,`constrain()`函数确保值在有效范围内。
5. LED的颜色通过RGB值设置,其中红色分量由温度决定,蓝色分量是其补数,绿色分量保持为0。
6. 程序每秒更新一次LED显示和串口输出。
## 演示
演示视频如下:
[localvideo]78a1ee1cea714b39f1a5c9da1dbfbde8[/localvideo]
-
发表了主题帖:
【Follow me第二季第1期】控制板载炫彩LED,跑马灯点亮和颜色变换
# 【Follow me第二季第1期】控制板载炫彩LED,跑马灯点亮和颜色变换
### 步骤1:确定基本结构
我们需要一个主循环来持续运行我们的程序,并在其中检测按钮状态和切换灯光效果。因此,我们可以使用`loop()`函数作为主体,并在其中实现模式切换逻辑。
### 步骤2:设计灯光效果函数
为了使代码更加模块化和易于理解,我们可以为每种灯光效果创建单独的函数:
- `runningLight()`: 实现走马灯效果
- `breathingLight()`: 实现炫彩呼吸灯效果
### 步骤3:实现走马灯效果
对于走马灯效果,我们需要考虑:
1. 如何依次点亮每个LED?
2. 如何生成不同的颜色?
3. 如何控制灯光的移动速度?
我们可以使用一个循环来遍历所有LED,利用`CircuitPlayground.colorWheel()`函数生成彩虹色,并使用`delay()`函数控制速度。
### 步骤4:实现炫彩呼吸灯效果
对于呼吸灯效果,我们需要思考:
1. 如何实现亮度的渐变?
2. 如何使所有LED同时变化?
我们可以使用两个嵌套循环:外层循环控制亮度变化,内层循环设置所有LED的颜色。
### 步骤5:设计模式切换机制
为了实现模式切换,我们需要:
1. 定义一个变量来记录当前模式
2. 检测按钮是否被按下
3. 在按钮被按下时切换模式
我们可以使用一个布尔变量来防止按钮被持续按住时重复触发。
## 代码实现
根据上述思考过程,我们可以编写如下代码:
```c++
#include
// 定义常量
const int NUM_PIXELS = 10;
const int LEFT_BUTTON = 4;
const int DELAY_TIME = 50;
// 定义全局变量
int mode = 0; // 0: 跑马灯, 1: 呼吸灯
bool buttonPressed = false;
void runningLight();
void breathingLight();
void setup() {
CircuitPlayground.begin();
}
void loop() {
// 检查左按钮是否被按下
if (CircuitPlayground.leftButton() && !buttonPressed) {
mode = (mode + 1) % 2; // 切换模式
buttonPressed = true;
} else if (!CircuitPlayground.leftButton()) {
buttonPressed = false;
}
// 根据当前模式执行相应的灯光效果
if (mode == 0) {
runningLight();
} else {
breathingLight();
}
}
// 跑马灯效果
void runningLight() {
for (int i = 0; i < NUM_PIXELS; i++) {
CircuitPlayground.setPixelColor(i, CircuitPlayground.colorWheel(25 * i));
delay(DELAY_TIME);
CircuitPlayground.setPixelColor(i, 0);
}
}
// 呼吸灯效果
void breathingLight() {
for (int brightness = 0; brightness < 255; brightness++) {
for (int i = 0; i < NUM_PIXELS; i++) {
CircuitPlayground.setPixelColor(i, brightness, brightness, brightness);
}
delay(5);
}
for (int brightness = 255; brightness >= 0; brightness--) {
for (int i = 0; i < NUM_PIXELS; i++) {
CircuitPlayground.setPixelColor(i, brightness, brightness, brightness);
}
delay(5);
}
}
```
## 演示:
演示视频如下:
[localvideo]f9663b3f641df46f7a1aab822aae4f51[/localvideo]
- 2024-09-01
-
发表了主题帖:
【Follow me第二季第1期】环境配置+点灯
# 【Follow me第二季第1期】环境配置+基础任务
## 环境配置
1. 安装platformio
首先需要确保在vscode环境下安装platformio插件
2. 创建项目
这里的话打开platformio,点击创建项目,选择Adafruit Circuit Playground Express
3. 修改ini
打开 platformio.ini 文件,修改内容如下:
```
[env:adafruit_circuitplayground_m0]
platform = atmelsam
board = adafruit_circuitplayground_m0
framework = arduino
lib_deps =
adafruit/Adafruit NeoPixel@^1.12.3
adafruit/Adafruit Circuit Playground@^1.12.0
monitor_speed = 115200
```
这样的话就创建好了platformio的开发环境了。
## 入门任务(必做):开发环境搭建,板载LED点亮
在arduino中点亮或者熄灭LED只需两步,初始化引脚和拉高或拉低对应引脚。查询资料或者看板载标示可以看到LED是D13引脚,因此代码如下:
```cpp
#include
// 定义 LED 引脚
u_int8_t LED_BOARD = 13;
void setup()
{
// 初始化 LED 引脚为输出模式
pinMode(LED_BOARD, OUTPUT);
// 初始化串口通信,波特率为 115200
Serial.begin(115200);
}
void loop()
{
// 打开 LED(高电平)
digitalWrite(LED_BOARD, HIGH);
Serial.println("LED ON");
// 等待一秒
delay(1000);
// 关闭 LED(低电平)
digitalWrite(LED_BOARD, LOW);
Serial.println("LED OFF");
// 再等待一秒
delay(1000);
}
```
## 演示
演示视频如下:
[localvideo]0de2009412e2abedc5987e7283f2c98c[/localvideo]
-
加入了学习《【Follow me第二季第1期】作品提交汇总视频》,观看 【Follow me第二季第1期】作品提交汇总
-
加入了学习《Follow me第二季第1期》,观看 创意任务二:章鱼哥
-
发表了主题帖:
【Follow me第二季第1期】不倒翁
# 【Follow me第二季第1期】不倒翁
## 简洁
这里我将通过检测板子的倾斜方向来控制LED 灯的颜色和亮灯位置,从而展示不同的灯光效果。
## 软件流程图
```
+-------------------------+
| 初始化开发板 |
+-------------------------+
|
v
+-------------------------+
| 读取加速度数据 |
+-------------------------+
|
v
+-------------------------+
| 确定倾斜方向和颜色 |
+-------------------------+
|
v
+-------------------------+
| 设置 LED 灯的颜色 |
+-------------------------+
|
v
+-------------------------+
| 延迟 100 毫秒 |
+-------------------------+
|
v
+-------------------------+
| 循环上述步骤 |
+-------------------------+
```
## 主要代码
以下是实现不倒翁效果的主要代码:
```
#include
void setup() {
CircuitPlayground.begin();
}
void loop() {
float x = CircuitPlayground.motionX();
float y = CircuitPlayground.motionY();
uint32_t color;
static uint8_t colorIndex = 0; // 用于颜色渐变的索引
int ledPosition1 = 0; // 第一个亮灯的位置
int ledPosition2 = 1; // 第二个亮灯的位置
bool allLedsOn = false; // 标记是否所有灯都亮
// 根据倾斜方向确定颜色索引的变化和亮灯的位置
if (x > 3) {
colorIndex = 85; // 绿色
ledPosition1 = 9; // 右侧
ledPosition2 = 0;
} else if (x < -3) {
colorIndex = 170; // 蓝色
ledPosition1 = 1; // 左侧
ledPosition2 = 2;
} else if (y > 3) {
colorIndex = 42; // 黄色
ledPosition1 = 5; // 前侧
ledPosition2 = 6;
} else if (y < -3) {
colorIndex = 127; // 紫色
ledPosition1 = 3; // 后侧
ledPosition2 = 4;
} else {
colorIndex = 255; // 白色
allLedsOn = true; // 中间情况下所有灯都亮
}
// 颜色渐变
color = CircuitPlayground.colorWheel(colorIndex);
colorIndex = (colorIndex + 1) % 256; // 循环颜色索引
// 设置所有像素的颜色
for (int i = 0; i < 10; i++) {
if (allLedsOn) {
CircuitPlayground.setPixelColor(i, color); // 所有灯都亮
} else if (i == ledPosition1 || i == ledPosition2) {
CircuitPlayground.setPixelColor(i, color);
} else {
CircuitPlayground.setPixelColor(i, 0); // 其他灯熄灭
}
}
delay(100);
}
```
## 主要代码片段
### 读取加速度数据
在 `loop` 函数中,我们需要读取开发板的加速度数据:
```
float x = CircuitPlayground.motionX();
float y = CircuitPlayground.motionY();
```
### 确定倾斜方向和颜色
根据加速度数据,我们可以确定开发板的倾斜方向,并设置相应的颜色:
```
void loop() {
// ... 读取加速度数据 ...
uint32_t color;
static uint8_t colorIndex = 0; // 用于颜色渐变的索引
int ledPosition1 = 0; // 第一个亮灯的位置
int ledPosition2 = 1; // 第二个亮灯的位置
bool allLedsOn = false; // 标记是否所有灯都亮
// 根据倾斜方向确定颜色索引的变化和亮灯的位置
if (x > 3) {
colorIndex = 85; // 绿色
ledPosition1 = 9; // 右侧
ledPosition2 = 0;
} else if (x < -3) {
colorIndex = 170; // 蓝色
ledPosition1 = 1; // 左侧
ledPosition2 = 2;
} else if (y > 3) {
colorIndex = 42; // 黄色
ledPosition1 = 5; // 前侧
ledPosition2 = 6;
} else if (y < -3) {
colorIndex = 127; // 紫色
ledPosition1 = 3; // 后侧
ledPosition2 = 4;
} else {
colorIndex = 255; // 白色
allLedsOn = true; // 中间情况下所有灯都亮
}
// 颜色渐变
color = CircuitPlayground.colorWheel(colorIndex);
colorIndex = (colorIndex + 1) % 256; // 循环颜色索引
}
```
### 设置 LED 灯的颜色
根据倾斜方向和颜色索引,我们可以设置相应的 LED 灯的颜色:
```
void loop() {
// ... 确定倾斜方向和颜色 ...
// 设置所有像素的颜色
for (int i = 0; i < 10; i++) {
if (allLedsOn) {
CircuitPlayground.setPixelColor(i, color); // 所有灯都亮
} else if (i == ledPosition1 || i == ledPosition2) {
CircuitPlayground.setPixelColor(i, color);
} else {
CircuitPlayground.setPixelColor(i, 0); // 其他灯熄灭
}
}
delay(100);
}
```
## 演示
演示视频如下:
[localvideo]a3193a4a2241620745d083f369c15acb[/localvideo]
-
加入了学习《Follow me第二季第1期》,观看 进阶任务(必做):制作不倒翁——摇摇马
-
发表了主题帖:
【Follow me第二季第1期】接近检测
# 【Follow me第二季第1期】接近监测
## 简介
我是采用光线传感器来检测环境光的变化,从而判断是否有物体接近。当检测到入侵时,设备将发起声音报警。我将详细介绍软件流程图、各任务对应的主要代码片段以及功能展示。
## 软件流程图
以下是软件流程图,展示了整个程序的逻辑流程:
```c++
+---------------------+
| 开始 (setup) |
+---------------------+
|
v
+---------------------+
| 初始化CircuitPlayground |
+---------------------+
|
v
+---------------------+
| 读取光线传感器数据 |
+---------------------+
|
v
+---------------------+
| 比较当前光线强度与 |
| 上次光线强度的变化 |
+---------------------+
|
v
+---------------------+
| 变化是否超过阈值? |
+---------------------+
| |
是 否
| |
v v
+---------------------+ +---------------------+
| 发起声音报警 | | 光线变化在安全范围内 |
+---------------------+ +---------------------+
|
v
+---------------------+
| 更新上次光线强度 |
+---------------------+
|
v
+---------------------+
| 延迟一段时间 |
+---------------------+
|
v
+---------------------+
| 循环 (loop) |
+---------------------+
```
## 主要代码
以下是主要的代码片段,展示了如何实现光线变化检测和报警功能:
```c++
#include
const int LIGHT_THRESHOLD = 300; // 光线变化阈值,需要根据实际测试调整
const unsigned long CHECK_INTERVAL = 100; // 检查间隔,单位毫秒
unsigned long lastCheckTime = 0;
int lastLightLevel = 0;
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastCheckTime >= CHECK_INTERVAL) {
// 读取光线传感器的数据
int currentLightLevel = CircuitPlayground.lightSensor();
Serial.print("当前光线强度: ");
Serial.println(currentLightLevel);
// 判断光线变化是否超过阈值
if (abs(currentLightLevel - lastLightLevel) > LIGHT_THRESHOLD) {
Serial.println("警告: 检测到入侵!");
// 发起声音报警
CircuitPlayground.playTone(440, 500); // 播放440Hz的音调500毫秒
} else {
Serial.println("光线变化在安全范围内");
}
// 更新上次的光线强度
lastLightLevel = currentLightLevel;
lastCheckTime = currentTime;
}
}
```
1. 这里首先使用CircuitPlayground.lightSensor()读取光线传感器的数据。
2. 比较当前光线强度与上次的光线强度,判断变化是否超过阈值。
3. 如果光线变化超过阈值,发起声音报警(播放440Hz的音调500毫秒)。
4. 更新上次的光线强度,以便在下次循环中进行比较。
## 主要代码片段
### 初始化
在`setup()`函数中,我初始化Circuit Playground Express并设置串口通信:
```c++
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
```
### 读取光线传感器数据
在`loop()`函数中,我读取光线传感器的数据并进行处理:
```c++
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastCheckTime >= CHECK_INTERVAL) {
int currentLightLevel = CircuitPlayground.lightSensor();
Serial.print("当前光线强度: ");
Serial.println(currentLightLevel);
```
### 判断光线变化是否超过阈值
我使用`abs(currentLightLevel - lastLightLevel) > LIGHT_THRESHOLD`来判断光线变化是否超过阈值:
```c++
if (abs(currentLightLevel - lastLightLevel) > LIGHT_THRESHOLD) {
Serial.println("警告: 检测到入侵!");
CircuitPlayground.playTone(440, 3000); // 播放440Hz的音调500毫秒
}
```
## 测试
演示视频如下:
[localvideo]d79259f4a7ca8ac61cc91de0c866a109[/localvideo]
- 2024-08-20
-
加入了学习《FollowMe 第二季: 1 Adafruit Circuit Playground Express及任务讲解》,观看 Adafruit Circuit Playground Express 及任务讲解