【Follow me第二季第1期】作品提交汇总
[复制链接]
本帖最后由 Auca 于 2024-9-27 22:10 编辑
物料清单:
1.Adafruit_CircuitPlayground开发板
2.舵机
对本活动的心得体会(包括意见或建议):
这是我第一次参与follow me,也参考了很多论坛大佬的思路,玩开发板最大的问题就可能是找不到参考的资料了,任务的ddl也治好了我的拖延症希望eeworld越办越好,我对想学习嵌入式的学弟学妹推荐的第一个学习路线就是follow me,任务驱动的学习方式很好。
设计思路:需求-> 结合开发板资料定位调用模块/传感器-> 查找文档/示例代码 ->调试
入门任务(必做):开发环境搭建,板载LED点亮
选择的开发环境是Arduino IDE。最近忙秋招压线交任务,能省就省。点灯程序使用Adafruit库中封装好的,按下左按钮就能点亮。
#include <Adafruit_CircuitPlayground.h>
void setup() {
// Initialize the circuit playground
CircuitPlayground.begin();
}
void loop() {
if (CircuitPlayground.leftButton()) {
CircuitPlayground.redLED(HIGH); // LED on
} else {
CircuitPlayground.redLED(LOW); // LED off
}
}
基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换
程序流程:循环遍历10个LED,每次清空上回LED,点亮当前LED,延时。逆时针点亮红色,顺时针点亮蓝色,实现颜色变换。
#include <Adafruit_CircuitPlayground.h>
void setup() {
CircuitPlayground.begin();
}
void loop() {
for (int i = 0; i < 10; i++) { // 正向跑马灯
CircuitPlayground.clearPixels();
CircuitPlayground.setPixelColor(i, 255, 0, 0); // 红色
delay(100);
}
for (int i = 8; i > 0; i--) { // 反向跑马灯
CircuitPlayground.clearPixels();
CircuitPlayground.setPixelColor(i, 0, 0, 255); // 蓝色
delay(100);
}
}
基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度
程序流程:获取温度和光线传感器的数值,如果温度过低/光线过暗,led蓝灯,舒适绿灯,过高红灯。左半部展示温度,右半部展示光线。
#include <Adafruit_CircuitPlayground.h>
void setup() {
CircuitPlayground.begin();
CircuitPlayground.clearPixels();
}
void loop() {
// 获取温度和光线传感器数据
float temperature = CircuitPlayground.temperature(); // 温度传感器读数 (摄氏度)
int lightLevel = CircuitPlayground.lightSensor();
int temp_confort;
int light_confort;
// 判断温度舒适程度
if( temperature < 20 ){
temp_confort = 1;
}
else if (temperature >= 20 && temperature <= 27) {
temp_confort = 2;
}
else{
temp_confort = 3;
}
// 判断光线舒适程度
if( lightLevel < 200 ){
light_confort = 1;
}
else if (lightLevel >= 200 && lightLevel <= 800) {
light_confort = 2;
}
else{
light_confort = 3;
}
setAllPixelsColor(temp_confort, light_confort);
delay(100);
}
void setAllPixelsColor(int temp_confort, int light_confort) {
int red, green, blue;
for (int i = 0; i < 5; i++) {
if( temp_confort == 1) red = 0, green = 0, blue = 255;
else if( temp_confort == 2) red = 0, green = 255, blue = 0;
else red = 255, green = 0, blue = 0;
CircuitPlayground.setPixelColor(i, red, green, blue);
}
for (int i = 5; i < 10; i++) {
if( light_confort == 1) red = 0, green = 0, blue = 255;
else if( light_confort == 2) red = 0, green = 255, blue = 0;
else red = 255, green = 0, blue = 0;
CircuitPlayground.setPixelColor(i, red, green, blue);
}
}
基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
遗憾的是,似乎通过板载的红外是无法做到测距的,因为它是用于红外通讯的?只能实现靠近检测。我也有写过通过发射统计时间来计算红外测距的代码,效果非常灾难,物体反射红外光的程度不同,然后写了一版靠近检测,十分简单,只需要收到信号就报警,但是没有完成安全距离的要求,最后改成了这一版相对距离的。
逻辑:读取模拟传感器值,如果传感器值大于或等于阈值,则点亮LED并报警。
#include <Adafruit_CircuitPlayground.h>
const int analogInPin = A1;
void setup() {
CircuitPlayground.begin();
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(analogInPin);
Serial.print("sensorValue: ");
Serial.println(sensorValue);
if (sensorValue >= 500) {
for (int i = 0; i < 2; i++) {
CircuitPlayground.setPixelColor(0, 255, 0, 0);
CircuitPlayground.playTone(262, 300);
CircuitPlayground.clearPixels();
noTone(5);
delay(300);
}
}
delay(100); // 稳定延迟
}
这个不好拍图片,放在下面视频里。
进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果
比起上面那个,这个就容易很多了
#include <Adafruit_CircuitPlayground.h>
void setup() {
CircuitPlayground.begin();
}
void loop() {
float x = CircuitPlayground.motionX();
float y = CircuitPlayground.motionY();
float z = CircuitPlayground.motionZ();
uint32_t color;
// Determine color based on tilt direction
if (z > 9) {
color = CircuitPlayground.colorWheel(0);
} else if (x > 3) {
color = CircuitPlayground.colorWheel(85);
} else if (x < -3) {
color = CircuitPlayground.colorWheel(170);
} else if (y > 3) {
color = CircuitPlayground.colorWheel(42);
} else if (y < -3) {
color = CircuitPlayground.colorWheel(127);
} else {
color = CircuitPlayground.colorWheel(255);
}
for (int i = 0; i < 10; i++) {
CircuitPlayground.setPixelColor(i, color);
}
delay(100);
}
■ 创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
本来是想用五个舵机的,但是连线太麻烦只用了一个。选取也不太合适,应该选声音变化很大的。
#include <Adafruit_CircuitPlayground.h>
#include <Servo.h>
Servo tentacle1;
void setup() {
tentacle1.attach(A1);
}
void loop() {
int soundLevel = CircuitPlayground.mic.soundPressureLevel(50);
int Pos = map(soundLevel, 50, 120, 0, 180); // 映射角度
tentacle1.write(Pos);
delay(100);
}
|