本帖最后由 bitter 于 2024-9-27 21:48 编辑
【Follow me第二季第1期】任务提交
很高兴能够参加本期由得捷电子和eeworld社区共同举办得本次【Follow me第二季第1期】活动,想想前前后后也参加过好几次follow me活动了,这次应该是第三次了,还是很感谢得捷电子和eeworld社区提供的机会,期待后续活动再能出现一些有意思的板子~
由于最近比较忙,收到板子后也是拖了比较长的时间直到最后几天才开始相关的活动,时间比较匆忙,完成的不是很好,希望各位审核大大能够手下留情、高抬贵手。
物料清单
我购买物料为活动必备物料开发板、推荐物料舵机、排针,还有一个传感器适配器, 还以为是传感器本身,到手一看才发生是一个适配器。
物料展示
项目视频演示
【Follow me第二季第1期】任务提交-【Follow me第二季第1期】任务提交-EEWORLD大学堂
入门任务:开发环境搭建,板载LED点亮
- 官网下载IDE,https://www.arduino.cc/en/software
- 安装完成后,打开IDE,点击Tools->Board->Boards Manager,安装Arduino SAMD
- 安装完成后输入示例代码,使用MicroUSB 线连接开发板,选择对应得端口,点击upload即可烧录程序,观察到如下输出即代表烧录成功。
- 烧录成功后,重启开发板可以看到开发板上得红灯开始闪烁。
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
演示图片:
软件流程图:
基础任务一:控制板载炫彩LED,跑马灯点亮和颜色变换
在本次任务中,我们使用到了Mini NeoPixel LED,需要借助 这个库。下载完成后,点击->Sketch->Include Library->Add .ZIP Library…,将对应得库文件导入即可。
#include <Adafruit_NeoPixel.h>
#define PIN 8
// 定义按钮引脚
#define BUTTON_COLOR 4 // 调节亮度
Adafruit_NeoPixel strip = Adafruit_NeoPixel(10, PIN, NEO_GRB + NEO_KHZ400);
int currentColor = 0;
int brightness = 50;
void setup() {
pinMode(BUTTON_COLOR, INPUT); // 设置按钮
strip.begin();
strip.setBrightness(brightness);
strip.show();
}
void loop() {
// 检查按钮状态
checkButtons();
// 执行当前效果
switch (currentColor) {
case 0:
colorWipe(strip.Color(255, 0, 0), 50);
break;
case 1:
colorWipe(strip.Color(0, 255, 0), 50);
break;
case 2:
colorWipe(strip.Color(0, 0, 255), 50);
break;
case 3:
colorWipe(strip.Color(0, 0, 0, 255), 50);
break;
}
}
bool checkButtons() {
bool buttonPressed = false;
static int lastButtonState = LOW;
int buttonState = digitalRead(BUTTON_COLOR);
if (buttonState == HIGH && lastButtonState == LOW) {
delay(50);
if (buttonState == HIGH && lastButtonState == LOW)
{
currentColor = (currentColor + 1)%4;
buttonPressed = true;
}
}
lastButtonState = buttonState;
return buttonPressed;
}
void colorWipe(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
if (checkButtons()) return; // 如果按钮被按下,则中断循环
}
}
该程序主要是实现了每按一次按钮后,彩色LED在红、绿、蓝和灭四种状态转换。
演示图片:
基础任务二:监测环境温度和光线,通过板载LED展示舒适程度
在本次任务中,我们除了需要使用上一个任务使用得Mini NeoPixel LED,还额外需要使用温度传感器和光传感器,需要借助 这个库。安装方式按上一个任务将对应得库文件添加即可。
#include <Adafruit_CircuitPlayground.h>
void setup() {
CircuitPlayground.begin();
Serial.begin(921600);
}
void loop() {
displayTemperature();
delay(250);
displayBrightness();
delay(250);
}
void displayTemperature() {
uint8_t ledCount;
float temperature = CircuitPlayground.temperature();
uint32_t color;
Serial.println("current temperature is");
Serial.println(temperature);
ledCount= (int)temperature/5;
color = CircuitPlayground.colorWheel((11-ledCount)*25);
for (int i = 0; i < 10; i++) {
if (i < ledCount) {
CircuitPlayground.setPixelColor(9 - i, color);
} else {
CircuitPlayground.setPixelColor(9 - i, 0); // 关闭LED
}
}
}
void displayBrightness() {
uint16_t brightness = CircuitPlayground.lightSensor();
uint8_t overallBrightness = map(brightness, 0, 500, 0, 100);
Serial.println("current brightness is");
Serial.println(brightness);
CircuitPlayground.setBrightness(overallBrightness); //调整所有灯珠亮度
}
该程序将通过串口实时输出当前的温度和环境亮度。根据当前温度将会实时点亮不同个数的LED并显示不同颜色;根据当前的环境亮度将会调整所有LED的亮度。
演示图片:
基础任务三:接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警
在本次任务中,使用了Mini NeoPixel LED、红外发射器和接收器,还有蜂鸣器。
#include <Adafruit_CircuitPlayground.h>
#define SAFE_DISTANCE 450
const int alertTone = 1000;
const int irTransmitterPin = 25;
const int irReceiverPin = A10;
void setup() {
CircuitPlayground.begin();
Serial.begin(921600);
pinMode(irReceiverPin, INPUT);
pinMode(irTransmitterPin, OUTPUT);
}
void loop() {
sendIRPulse();
int distance = analogRead(irReceiverPin);
displayDistance(distance);
checkForIntrusion(distance);
delay(300);
}
void displayDistance(int distance) {
int ledCount = map(distance, 290, SAFE_DISTANCE, 1, 10);
uint32_t color;
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(", LED Count: ");
Serial.println(ledCount);
color = CircuitPlayground.colorWheel((11-ledCount)*25);
for (int i = 0; i < 10; i++) {
if (i < ledCount) {
CircuitPlayground.setPixelColor(i, color);
} else {
CircuitPlayground.setPixelColor(i, 0);
}
}
}
void checkForIntrusion(int distance) {
if (distance > SAFE_DISTANCE) {
Serial.println("Intrusion detected!");
playAlertTone();
}
}
void sendIRPulse() {
for (int i = 0; i < 32; i++) {
digitalWrite(irTransmitterPin, HIGH);
delayMicroseconds(13);
digitalWrite(irTransmitterPin, LOW);
delayMicroseconds(13);
}
}
void playAlertTone() {
CircuitPlayground.playTone(alertTone, 1000);
}
在靠近的过程中将逐渐点亮不同个数的LED并显示不同颜色,超过安全范围时蜂鸣器将会发出警告。
演示图片:
软件流程图:
进阶任务:制作不倒翁——展示不倒翁运动过程中的不同灯光效果
由于条件有限,没办法制作相应的不倒翁,所以我实际上是用板载陀螺仪检测板子的姿态,然后给出对应的灯光效果:即往哪边倾斜就点亮哪一边的LED,水平则全部点亮。
创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩
由于时间和外部条件的限制,没有制作章鱼模型。本次任务是使用麦克风识别环境音量,根据环境音量的大小点亮不同个数的LED并显示不同颜色。除此之外,根据环境音量的变化逆时针或顺时针旋转舵机。
项目总结
总的来说,由于时间匆忙,没有很深入的了解这款开发板,但是即使是在有限的条件下也了解了这块板子的多样性和强大功能。第一次使用Arduino,也学会了很多。
最后,感谢得捷电子和eeworld社区提供的机会,期待后续活动!
|