eew_UqDS1M

  • 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 及任务讲解

最近访客

< 1/1 >

统计信息

已有1人来访过

  • 芯积分:59
  • 好友:--
  • 主题:7
  • 回复:0

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言