聪聪哥哥

  • 2024-10-28
  • 加入了学习《Follow me第二季第1期》,观看 完整版

  • 加入了学习《Follow me第二季第1期》,观看 基础任务三(必做):接近检测

  • 加入了学习《Follow me第二季第1期》,观看 基础任务二(必做):监测环境温度和光线

  • 加入了学习《Follow me第二季第1期》,观看 入门任务(必做):开发环境搭建,板载LED点亮 基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换

  • 加入了学习《Follow me第二季第1期》,观看 器材介绍

  • 2024-10-20
  • 加入了学习《【Follow me第二季第1期】全部任务演示》,观看 全部任务演示2.0

  • 2024-09-08
  • 发表了主题帖: 【Follow me第二季第1期】汇总提交帖:全部任务视频及其代码下载

    首先很荣幸参加follow me 第二季第一期的活动,在学习、工作之余有精力和时间去接触Adafruit Circuit Playground Express 这款开发板,下面我和大家分享一下开发过程。   全部视频演示视频: 完整版 物料展示: 本次活动中,我购买了Circuit Playground Express主板和陀机两种物料   购买实物图片展示:   任务成果展示 入门任务:01 Ardunio ide环境搭建+ 物料展示 +板载LED点亮 相对应的帖子地址:https://bbs.eeworld.com.cn/thread-1293111-1-1.html 软件环境搭建: 这次我所使用的编译软件为arduino 来实现功能。 官方下载网址:https://www.arduino.cc/en/software 软件属于一键安装的过程: 安装完成后,打开IDE,在左侧栏的Boards Manager,安装Arduino SAMD.连接开发板,就能看见上面正确显示了板子的型号 任务:点亮板载的LED灯 简单利用arduino实现闪烁板载的LED灯功能,查看官方的原理图我们可以看到D13连接到引脚是13, 软件流程图:   软件操作代码如下: void setup() { // put your setup code here, to run once: pinMode(13, OUTPUT); } void loop() { // put your main code here, to run repeatedly: digitalWrite(13, 1); delay(1000); digitalWrite(13, 0); delay(1000); } 编译之后软件效果图:   测试实物图片:   可以通过修改延时函数中的时间,改变LED的闪烁间隔 基础任务一(必做):控制板载炫彩LED,跑马灯点亮和颜色变换 对应帖子的连接:https://bbs.eeworld.com.cn/thread-1293113-1-1.html 该任务比较简单,使用这个用Adafruit_NeoPixel.h这个库就能实现,设置了七种不同的颜色进行循环切换,   #include <Arduino.h> #include <Adafruit_NeoPixel.h> #define PIN 8 #define NNUMPIN 10 Adafruit_NeoPixel pixels(NNUMPIN, PIN, NEO_GRB + NEO_KHZ800); void setup() { // write your initialization code here pixels.begin(); } void loop() { // write your code here static uint8_t led_num = 0; //static uint32_t colors[8] = {0x040304, 0x000505, 0x050005, 0x050500, 0x050005, 0x000A00, 0x0A0000,0x0A000A}; static uint32_t colors[7] = {0x0A0000, 0x000A00, 0x00000A, 0x050500, 0x050005, 0x000505, 0x040304}; //static uint32_t colors[8] = {0x011011, 0x22022, 0x033033, 0x44044, 0x055055, 0x66066, 0x77777,0x088088}; static uint8_t color_num = 0; static Adafruit_NeoPixel pixels(NNUMPIN, PIN, NEO_GRB + NEO_KHZ800); pixels.clear(); pixels.setPixelColor(led_num, colors[color_num]); pixels.show(); led_num++; if (led_num == NNUMPIN) { led_num = 0; color_num++; if (color_num == 8) color_num = 0; } delay(200); }   基础任务二(必做):监测环境温度和光线,通过板载LED展示舒适程度 对应帖子的连接:https://bbs.eeworld.com.cn/thread-1293113-1-1.html 参考官方发布的原理图和CircuitPython库的代码可以得出引脚电压(A8)与温度、光照(A9)之间的关系。 软件的流程图如下:   #include <Arduino.h> #include <Adafruit_NeoPixel.h> #include "SensorAB.h" #define PIN 8 #define NUMPIXELS 10 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { // write your initialization code here Serial.begin(115200); pixels.begin(); } void loop() { // write your code here const double temperature = get_temperature(A9); const double photocell = get_photocell(A8); pixels.clear(); if (temperature < 14) { pixels.setPixelColor(5, 0, 0, 10); } else if (temperature < 18 && temperature >= 14) { pixels.setPixelColor(6, 0, 5, 5); } else if (temperature >= 18 && temperature <= 20) { pixels.setPixelColor(7, 0, 10, 0); } else if (temperature > 20 && temperature <= 25) { pixels.setPixelColor(8, 5, 5, 0); } else if (temperature > 25) { pixels.setPixelColor(9, 10, 0, 0); } if (photocell > 1000) { pixels.setPixelColor(0, 10, 0, 0); } else if (photocell > 500 && photocell <= 1000) { pixels.setPixelColor(1, 5, 5, 0); } else if (photocell >= 200 && photocell <= 500) { pixels.setPixelColor(2, 0, 10, 0); } else if (photocell >= 50 && photocell < 200) { pixels.setPixelColor(3, 0, 5, 5); } else if (photocell < 50) { pixels.setPixelColor(4, 0, 0, 10); } pixels.show(); Serial.print("temperature:" + String(temperature) + " sheshidu " + "photocell:" + String(photocell) + " lux\n"); delay(1000); } 软件仿真之后效果图:   实物图片如下:   基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警 对应帖子的连接:https://bbs.eeworld.com.cn/thread-1293113-1-1.html 使用红外传感器,,通过IR LED发射一定频率的脉冲,通过读取接收器测得的模拟值,当模拟值增大即有物体靠近。 试验现象:没有物体接近时灯珠全灭或显示一个,随着物体接近灯珠会亮的越来越多。 软件代码如下: #include <Adafruit_CircuitPlayground.h> #define SAFE_DISTANCE 500 // 定义安全距离 const int alertTone = 500; // 警报音调 const int irTransmitterPin = 25; //引脚定义 const int irReceiverPin = A10; void setup() { CircuitPlayground.begin(); Serial.begin(9600); // pinMode(irReceiverPin, INPUT); // 红外传感器输入 pinMode(irTransmitterPin, OUTPUT);// 红外led输出 delay(100); } 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); // 将距离值映射到0-10的LED数量 Serial.print("Distance: "); Serial.print(distance); Serial.print(", LED Count: "); Serial.println(ledCount); for (int i = 0; i < 10; i++) { if (i < ledCount) { CircuitPlayground.setPixelColor(i, 0, 255, 0); } 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, 500); // 播放警报音500ms }     进阶任务(必做):制作不倒翁——展示不倒翁运动过程中的不同灯光效果 对应帖子链接:https://bbs.eeworld.com.cn/thread-1293114-1-1.html 这个任务本质上就是用板载陀螺仪检测板子的姿态,然后给出对应的灯光效果。我实现的是根据板子的倾斜方向亮起对应的灯, 软件流程图:   代码如下: #include <Arduino.h> #include <Adafruit_NeoPixel.h> #include "Acc.h" #define PIN 8 #define NUMPIXELS 10 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { // write your initialization code here Serial.begin(115200); pixels.begin(); if (!init_acceleration()) { Serial.println("ERROR"); } } void loop() { // write your code here std::array<double, 2> data = get_acceleration(); double length = sqrt(pow(data[0], 2) + pow(data[1], 2)); int degree = atan(-1 * data[0] / data[1]) / M_PI * 180; degree += data[0] * data[1] >= 0 ? 180 : 0; pixels.clear(); if (degree >= 15 && degree <= 165) { pixels.setPixelColor((degree-15)/30+(data[0]<0?5:0), length*10, abs(10-length*10), 0); } pixels.show(); Serial.println("X:" + String(data[0])); Serial.println("Y:" + String(data[1])); Serial.println("degree" + String(degree)); Serial.println(); delay(100); } 项目总结: 自己对这次活动做一个简单的总结,在本次活动中,我使用Arduino IDE的编译软件对Adafruit Circuit Playground 板载上面的资源做了简单的了解。经过对活动任务的学习,通过实现不同功能模块的了解,查询资料,深入对该开发板进行多种多种的学习,自己动手写代码,知道开发板的强大, 对于硬件方面来说,自己动手去制作一些DIY产品,依靠现有的资源对电路板进行开发,在工作之余、学习的同时,给自己的生活带来一些乐趣。 最后感谢EEworld与得捷电子举办的活动,希望自己以后有机会参与更多的学习。 代码如下:      

  • 发表了主题帖: 【Follow me第二季第1期】03 进阶任务制作不倒翁

    本帖最后由 聪聪哥哥 于 2024-9-8 23:23 编辑 这个任务本质上就是用板载陀螺仪检测板子的姿态,然后给出对应的灯光效果。我实现的是根据板子的倾斜方向亮起对应的灯,     系统框图:   #include <Arduino.h> #include <Adafruit_NeoPixel.h>   #include "Acc.h"   #define PIN 8 #define NUMPIXELS 10   Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);   void setup() {   // write your initialization code here   Serial.begin(115200);   pixels.begin();   if (!init_acceleration()) {   Serial.println("ERROR");   } }   void loop() {   // write your code here   std::array<double, 2> data = get_acceleration();   double length = sqrt(pow(data[0], 2) + pow(data[1], 2));   int degree = atan(-1 * data[0] / data[1]) / M_PI * 180;   degree += data[0] * data[1] >= 0 ? 180 : 0;   pixels.clear();   if (degree >= 15 && degree <= 165) {   pixels.setPixelColor((degree-15)/30+(data[0]<0?5:0), length*10, abs(10-length*10), 0);   }   pixels.show();   Serial.println("X:" + String(data[0]));   Serial.println("Y:" + String(data[1]));   Serial.println("degree" + String(degree));   Serial.println();   delay(100); }   #include "Acc.h"   #define LISADDR 0x19   bool init_acceleration() {   Wire1.begin();   delay(1000);   Wire1.beginTransmission(LISADDR);   Wire1.write(0x0f);   Wire1.endTransmission();   Wire1.requestFrom(LISADDR, 1);   if (0x33 != Wire1.read()) {   return false;   }   Wire1.beginTransmission(LISADDR);   Wire1.write(0x24);   Wire1.write(0x80);   Wire1.endTransmission();   delay(1000);   Wire1.beginTransmission(LISADDR);   Wire1.write(0x20);   Wire1.write(0x23);   Wire1.endTransmission();   Wire1.beginTransmission(LISADDR);   Wire1.write(0x23);   Wire1.write(0x88);   Wire1.endTransmission();   return true; }   std::array<double, 2> get_acceleration() {   std::array<double, 2> data;   Wire1.beginTransmission(LISADDR);   Wire1.write(0x28 | 0x80);   Wire1.endTransmission();   Wire1.requestFrom(LISADDR, 4);   for (int tmp = 0; tmp < 3; tmp++) {   data[tmp] = static_cast<int16_t>(Wire1.read() | Wire1.read() << 8) / 16;   data[tmp] /= 1000.0;   }   return data; }     #ifndef ACCELERATION_H #define ACCELERATION_H #include <Arduino.h> #include <array> #include <Wire.h>   bool init_acceleration(); std::array<double,2> get_acceleration();   #endif  [localvideo]7eb7ea388d2728ab912bb5b86bd88322[/localvideo]    

  • 发表了主题帖: 【Follow me第二季第1期】02 控制板载炫彩LED,跑马灯点亮和颜色变换

    本帖最后由 聪聪哥哥 于 2024-9-8 23:27 编辑 基础任务1:控制板载炫彩LED,跑马灯点亮和颜色变换 该任务比较简单,使用这个用Adafruit_NeoPixel.h这个库就能实现,设置了七种不同的颜色进行循环切换, 程序流程图   代码如下: #include <Arduino.h> #include <Adafruit_NeoPixel.h>   #define PIN 8 #define NNUMPIN 10   Adafruit_NeoPixel pixels(NNUMPIN, PIN, NEO_GRB + NEO_KHZ800);   void setup() {   // write your initialization code here   pixels.begin(); }   void loop() {   // write your code here   static uint8_t led_num = 0;   //static uint32_t colors[8] = {0x040304, 0x000505, 0x050005, 0x050500, 0x050005, 0x000A00, 0x0A0000,0x0A000A};  static uint32_t colors[7] = {0x0A0000, 0x000A00, 0x00000A, 0x050500, 0x050005, 0x000505, 0x040304}; //static uint32_t colors[8] = {0x011011, 0x22022, 0x033033, 0x44044, 0x055055, 0x66066, 0x77777,0x088088};   static uint8_t color_num = 0;   static Adafruit_NeoPixel pixels(NNUMPIN, PIN, NEO_GRB + NEO_KHZ800);   pixels.clear();   pixels.setPixelColor(led_num, colors[color_num]);   pixels.show();   led_num++;   if (led_num == NNUMPIN) {   led_num = 0;   color_num++;   if (color_num == 8)     color_num = 0;   }   delay(200); }   [localvideo]65156387bafbd9e6b29cbf6a3e48d07c[/localvideo] [localvideo]bed5dccd8ad56cc0cc0550c5e002d435[/localvideo]     基础任务2:监测环境温度和光线,通过板载LED展示舒适程度 参考官方发布的原理图和CircuitPython库的代码可以得出引脚电压(A8)与温度、光照(A9)之间的关系。     #include <Arduino.h> #include <Adafruit_NeoPixel.h> #include "SensorAB.h"   #define PIN 8 #define NUMPIXELS 10   Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);   void setup() {   // write your initialization code here   Serial.begin(115200);   pixels.begin(); }   void loop() {   // write your code here   const double temperature = get_temperature(A9);   const double photocell = get_photocell(A8);   pixels.clear();   if (temperature < 14) {   pixels.setPixelColor(5, 0, 0, 10);   } else if (temperature < 18 && temperature >= 14) {   pixels.setPixelColor(6, 0, 5, 5);   } else if (temperature >= 18 && temperature <= 20) {   pixels.setPixelColor(7, 0, 10, 0);   } else if (temperature > 20 && temperature <= 25) {   pixels.setPixelColor(8, 5, 5, 0);   } else if (temperature > 25) {   pixels.setPixelColor(9, 10, 0, 0);   }   if (photocell > 1000) {   pixels.setPixelColor(0, 10, 0, 0);   } else if (photocell > 500 && photocell <= 1000) {   pixels.setPixelColor(1, 5, 5, 0);   } else if (photocell >= 200 && photocell <= 500) {   pixels.setPixelColor(2, 0, 10, 0);   } else if (photocell >= 50 && photocell < 200) {   pixels.setPixelColor(3, 0, 5, 5);   } else if (photocell < 50) {   pixels.setPixelColor(4, 0, 0, 10);   }   pixels.show();   Serial.print("temperature:" + String(temperature) + "  sheshidu  " + "photocell:" + String(photocell) + " lux\n");   delay(1000); }     #include "SensorAB.h"   double get_temperature(const uint32_t pin) {   return 1.0/(log(1023.0/analogRead(pin)-1)/3950.0+1.0/(273.15+25))-273.15; }   double get_photocell(const uint32_t pin) {   return analogRead(pin)*3.3/1023.0/2.9*3446; }   #ifndef SENSOR_H #define SENSOR_H   #include <Arduino.h>   #define R_T2 10000 #define B 3380000 #define T2 25   double get_temperature(uint32_t pin); double get_photocell(uint32_t pin);   #endif //SENSOR_H       [localvideo]ac764251aabab3423e84d293595ba0a9[/localvideo] [localvideo]2b8440a76885e8677f64e2fa54efaf63[/localvideo]   基础任务三(必做):接近检测——设定安全距离并通过板载LED展示,检测到入侵时,发起声音报警 使用红外传感器,,通过IR LED发射一定频率的脉冲,通过读取接收器测得的模拟值,当模拟值增大即有物体靠近。 试验现象:没有物体接近时灯珠全灭或显示一个,随着物体接近灯珠会亮的越来越多。     #include <Adafruit_CircuitPlayground.h>   #define SAFE_DISTANCE 500 // 定义安全距离 const int alertTone = 500; // 警报音调   const int irTransmitterPin = 25; //引脚定义 const int irReceiverPin = A10;   void setup()  {   CircuitPlayground.begin();   Serial.begin(9600); //   pinMode(irReceiverPin, INPUT); // 红外传感器输入    pinMode(irTransmitterPin, OUTPUT);// 红外led输出     delay(100);   } 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); // 将距离值映射到0-10的LED数量   Serial.print("Distance: ");   Serial.print(distance);   Serial.print(", LED Count: ");   Serial.println(ledCount);     for (int i = 0; i < 10; i++) {     if (i < ledCount) {       CircuitPlayground.setPixelColor(i, 0, 255, 0);     } 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, 500); // 播放警报音500ms } [localvideo]2accfeb41009f36efd04efb84d2c64b3[/localvideo]  

  • 发表了主题帖: 【Follow me第二季第1期】01 Ardunio ide环境搭建+ 物料展示 +板载LED点亮

    本帖最后由 聪聪哥哥 于 2024-9-8 23:24 编辑 【Follow me第二季第1期】01 Ardunio ide环境搭建+ 物料展示 +板载LED点亮 首先很荣幸参加follow me 第二季第一期的活动,在学习、工作之余有精力和时间去接触Adafruit Circuit Playground Express 这款开发板,下面我和大家分享一下开发过程。 首先看一下官方给出的开发板介绍图:   Circuit Playground Express基于ATSAMD21微控制器,采用32位ARM® Cortex®-M0+内核。ATSAMD21采用先进的电源管理技术,电流消耗极低。它可以由USB、“AAA”电池组或Lipoly电池供电。传感器封装圆形Circuit Playground Express板的边缘具有鳄鱼夹焊盘,便于连接到项目而无需焊接。可通过内置USB快速连接进行编程,无需专用电缆或适配器。 可以看到该款开发板的功能时很强大的,板载了诸多的传感器和外设,圆形的设计也很友好,放在手掌上正好。 本次活动中,我购买了Circuit Playground Express主板和陀机两种物料   实物展示:     软件环境搭建: 我所使用的开发软件时arduino 来实现功能。 官方下载网址:https://www.arduino.cc/en/software 软件属于一键安装的过程,这里就不再过多的介绍   简单利用arduino实现闪烁板载的LED灯功能,查看官方的原理图我们可以看到D13连接到引脚是13, 软件流程图如下:   程序代码如下: void setup() {   // put your setup code here, to run once:   pinMode(13, OUTPUT); }   void loop() {   // put your main code here, to run repeatedly:   digitalWrite(13, 1);     delay(100);                 digitalWrite(13, 0);     delay(100);   }   编译之后:       实物图片如下:   我们可以修改delay函数中的延时时间,来观察闪烁的效果。 [localvideo]c9ceaf4e8855296c1a396fa06a40632c[/localvideo]    

  • 加入了学习《Follow me第二季第1期》,观看 创意任务二:章鱼哥

  • 2024-08-28
  • 加入了学习《【Follow me第二季第1期】简单方法实现(任务提交)》,观看 【Follow me第二季第1期】简单方法实现(任务提交)(接近检测视频补充)

  • 2024-08-27
  • 回复了主题帖: >>征集 | 使用 MCU,哪些问题最令你头大?

    在使用微控制器单元(MCU)进行项目设计和开发时,开发人员经常会遇到一系列挑战和问题,其中一些最让人头疼的问题可能包括: 电源管理与功耗优化:确保MCU在低功耗模式下仍能正常工作,同时在不牺牲性能的情况下最大限度地延长电池寿命,是一个复杂的任务。不同应用场景下的功耗优化策略需要精细调整,包括时钟频率调整、外设管理、睡眠模式选择等。 编程与调试复杂性:MCU的编程涉及多种编程语言和工具链(如C/C++、汇编语言),以及特定的开发环境和调试工具。对于初学者来说,理解和使用这些工具可能是一个挑战。此外,调试过程中遇到的难以复现的问题或硬件故障也可能让人头疼。 实时性能要求:在一些应用中,如工业自动化、汽车电子等,MCU需要满足严格的实时性要求。确保任务在预定时间内完成,同时处理可能的中断和异常情况,需要精心设计的任务调度和中断管理策略。 电磁兼容性(EMC)与信号完整性(SI):在高速或高灵敏度应用中,EMC和SI问题可能导致系统性能下降或完全失效。这些问题可能源于电路设计、布局布线、电源设计等多个方面,解决起来往往需要跨学科的知识和经验。 固件升级与安全性:随着产品生命周期的延长,固件升级成为必要。然而,如何安全、可靠地实现固件升级,同时防止未授权访问和数据泄露,是一个重要的问题。这包括加密通信、固件签名验证、安全启动等技术的应用。 硬件资源限制:MCU的硬件资源(如CPU速度、RAM和Flash大小、外设数量等)有限,如何在这些限制下实现复杂的功能是一个挑战。开发者需要仔细规划资源使用,优化算法和数据结构,以充分利用有限的资源。 兼容性和可移植性问题:不同的MCU厂商和型号之间可能存在兼容性问题,如引脚布局、外设接口、软件库等。当需要更换MCU或在不同平台间移植项目时,这些问题可能导致大量修改工作。 长期供货与生命周期管理:MCU产品可能面临停产或生命周期结束的风险,这要求开发者在选择MCU时考虑长期供货问题,并制定相应的供应链管理和风险应对策略。 解决这些问题需要开发者具备广泛的知识和技能,包括电路设计、嵌入式编程、系统架构设计等。同时,也需要不断学习和跟踪最新的技术动态和最佳实践。

最近访客

< 1/1 >

统计信息

已有5人来访过

  • 芯积分:49
  • 好友:--
  • 主题:4
  • 回复:1

留言

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


现在还没有留言