255|0

83

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第1期】任务提交 [复制链接]

  本帖最后由 bitter 于 2024-9-27 21:48 编辑
【Follow me第二季第1期】任务提交
很高兴能够参加本期由得捷电子和eeworld社区共同举办得本次【Follow me第二季第1期】活动,想想前前后后也参加过好几次follow me活动了,这次应该是第三次了,还是很感谢得捷电子和eeworld社区提供的机会,期待后续活动再能出现一些有意思的板子~
由于最近比较忙,收到板子后也是拖了比较长的时间直到最后几天才开始相关的活动,时间比较匆忙,完成的不是很好,希望各位审核大大能够手下留情、高抬贵手。
物料清单
我购买物料为活动必备物料开发板、推荐物料舵机、排针,还有一个传感器适配器,还以为是传感器本身,到手一看才发生是一个适配器。
 
物料展示
    

项目视频演示

【Follow me第二季第1期】任务提交-【Follow me第二季第1期】任务提交-EEWORLD大学堂

入门任务:开发环境搭建,板载LED点亮

按照Arduino | Adafruit Circuit Playground Express | Adafruit Learning System里的教程一步一步搭建arduino开发环境,并点亮板载LED。
  1. 官网下载IDE,https://www.arduino.cc/en/software
  2. 安装完成后,打开IDE,点击Tools->Board->Boards Manager,安装Arduino SAMD

  3. 安装完成后输入示例代码,使用MicroUSB 线连接开发板,选择对应得端口,点击upload即可烧录程序,观察到如下输出即代表烧录成功。

  4. 烧录成功后,重启开发板可以看到开发板上得红灯开始闪烁。
    // 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,水平则全部点亮。
#include <Adafruit_CircuitPlayground.h>
#include <math.h>

void setup() {
  CircuitPlayground.begin();
  Serial.begin(921600); 
}

void loop() {
  float x = CircuitPlayground.motionX();
  float y = CircuitPlayground.motionY();
  float z = CircuitPlayground.motionZ();
 
  int ledToLight = -1;

  Serial.print("X: ");
  Serial.print(x);
  Serial.print(" - Y: ");
  Serial.print(y);
  Serial.print(" - Z: ");
  Serial.print(z);

  z -= 9.8;

  if(abs(x)<2 && abs(y)<2 && abs(z)<2)
    ledToLight = -1;
  else if(y<-2 && abs(x)<2)
    ledToLight = 0;
  else if(y<-2 && x>2)
    ledToLight = 1;
  else if(x>2 && abs(y)<2)
    ledToLight = 2;
  else if(x>2 && y>2)
    ledToLight = 3;    
  else if(y>2 && abs(x)<2)
    ledToLight = 4;
  else if(y>2 && x<-2)
    ledToLight = 6;
  else if(x<-2 && abs(y)<2)
    ledToLight = 7;
  else if(x<-2 && y<-2)
    ledToLight = 8;    

  uint8_t color= map( ledToLight, 0, 9, 0, 255);
 
  if (ledToLight == -1) {
    for (int i = 0; i < 10; i++) {
      CircuitPlayground.setPixelColor(i, CircuitPlayground.colorWheel(85)); //水平时都点亮
    }
  } else {
    for (int i = 0; i < 10; i++) {
      if (i == ledToLight || (ledToLight == 4 && i == 5) || (ledToLight == 0 && i == 9)) {
        CircuitPlayground.setPixelColor(i, CircuitPlayground.colorWheel(color));//点亮对应位置的
      } else {
        CircuitPlayground.setPixelColor(i, 0); 
      }
    }
  }

  Serial.print(" - LED To Light: ");
  Serial.println(ledToLight);
  delay(100); 
}

演示图片:

           
     
软件流程图:
 

创意任务二:章鱼哥——章鱼哥的触角根据环境声音的大小,章鱼哥的触角可舒展或者收缩

由于时间和外部条件的限制,没有制作章鱼模型。本次任务是使用麦克风识别环境音量,根据环境音量的大小点亮不同个数的LED并显示不同颜色。除此之外,根据环境音量的变化逆时针或顺时针旋转舵机。
#include <Adafruit_CircuitPlayground.h>
#include <Servo.h>

float SoundLevel,lastsoundLevel;

// 舵机定义
const int servoPin = A3; // 舵机连接的引脚
Servo myServo; 
int Speed=90; 

void setup() {
  CircuitPlayground.begin();
  Serial.begin(921600);
  myServo.attach(servoPin);
  myServo.write(Speed);
}

void loop() {
  uint32_t color;
  int ledCount;

  float soundLevel = CircuitPlayground.mic.soundPressureLevel(10);

  ledCount = map(soundLevel, 50, 100, 0, 10);
  color = CircuitPlayground.colorWheel((11-ledCount)*25);

  Serial.print("Raw Sound Level: ");
  Serial.println(soundLevel);

  for (int i = 0; i < 10; i++) {
    if (i < ledCount) {
      CircuitPlayground.setPixelColor(i, color); 
    } else {
      CircuitPlayground.setPixelColor(i, 0); 
    }
  }

  if(fabs((lastsoundLevel-soundLevel))>1)
  {
    static uint8_t i=0;
    if(i++ % 2)
      Speed -= (int)(lastsoundLevel-soundLevel);
    else
      Speed += (int)(lastsoundLevel-soundLevel);
  }
  else
    Speed = 90;
  
  lastsoundLevel = soundLevel;
  myServo.write(Speed);  
  Serial.print("Speed:");
  Serial.println(Speed);
  delay(200); 
}

演示图片:

     
软件流程图:
 

项目总结

总的来说,由于时间匆忙,没有很深入的了解这款开发板,但是即使是在有限的条件下也了解了这块板子的多样性和强大功能。第一次使用Arduino,也学会了很多。
最后,感谢得捷电子和eeworld社区提供的机会,期待后续活动!
 
test3.ino (1.31 KB, 下载次数: 1)

test2.ino (1001 Bytes, 下载次数: 1)

tesk5.ino (1.1 KB, 下载次数: 1)

tesk4.ino (1.46 KB, 下载次数: 1)

tesk1.ino (1.37 KB, 下载次数: 1)

tesk0.ino (475 Bytes, 下载次数: 1)

 
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表