0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用ROHM传感器套件制作Arduino LED圣诞树

一刀两断 来源:罗姆 作者:罗姆 2023-02-23 17:56 次阅读

这篇文章来源于DevicePlus.com英语网站的翻译稿。

poYBAGPzFbGAefWcAAEptsQP1DQ272.jpg

在此项目中,我们将利用Arduino Mega和RGB LED制作一颗小型LED Arduino亚克力(丙烯酸树脂)圣诞树。我们将利用ROHM温度传感器和气压传感器来更改LED的颜色。程序的构建和编码都很简单。用这棵LED圣诞树装饰您的房间将非常有趣!

我的上一篇文章介绍了如何设置传感器开发板以及如何连接Arduino。如果您还没看过该文,请点击ROHM传感器评估套件概述!

该圣诞树可以实现以下功能:

星形RGB LED交替改变颜色(循环显示)。

两个RGB LED(左上和右上)将根据局部温度(示例程序中的温度范围为22到32摄氏度之间)改变颜色。

两个RGB LED(左下方和右下方)将根据本地气压的变化而改变自身的颜色(示例程序中的气压范围为1010至1020 hPa之间)。

硬件

Arduino Mega 2560

RGB LEDs (5x)

红色 LEDs (5x)

Arduino ROHM 传感器开发板

ROHM 温度传感器 (BD1020HFV)

ROHM 压力传感器 (BM1383GLV)

接插线

195 x 195 x 3mm 亚克力板

M3 尼龙六角垫柱

电阻 (39 欧姆)

软件

Arduino IDE

ROHM 温度传感器库 (https://micro.rohm.com/en/download_support/sensor_module/kiyaku.php?file=data/software/BD1020HFV.zip)

ROHM 气压传感器库 (https://micro.rohm.com/en/download_support/sensor_module/kiyaku.php?file=data/software/BM1383GLV.zip)

工具

迷你钢锯

Dremel 电动工具

电烙铁

pYYBAGPzFbKAM3XPAAFqnQumAuM554.jpg

图1 Arduino Mega 2650(左),ROHM Arduino开发板(右),ROHM传感器(上)

poYBAGPzFbSAJrW1AADk3OhQqes801.jpg

图2 共阴极(-)RGB LED(左),共阳极(+)RGB LED(右)

pYYBAGPzFbWAVx1yAACat1Aji4g648.jpg

图3 接插线

poYBAGPzFbiAKvbuAACg4ufWfj0903.jpg

图4 12V电源

用亚克力制作树的骨架

首先,让我们使用亚克力制作圣诞树的骨架。在一张适当大小的纸上画一颗树,并将纸盖在亚克力板上,然后用小钢锯根据纸上的图形将亚克力板切割成树的样子(图5)。然后,根据以下需要安装的器件,在骨架上钻出足够数量和尺寸的孔:

Arduino Mega (3个 或 4个)

RGB LED的连接电缆(5个)

红色LED(2×5)

利用剩余的亚克力板切割出一个小的星形(图6),然后将其粘到圣诞树顶部(用CA胶或强力粘胶)。

pYYBAGPzFbmAIIeGAACoIyKxUBk254.jpg

图5 亚克力板制作的圣诞树骨架

安装LED和接插线

将红色LED插入圣诞树的钻孔内,注意所有红色LED应该并联连接,然后焊接连线。所有阳极(+)和阴极(-)分别连接在一起,请务必确保所有LED的位置正确,将39欧姆电阻串行焊接到红色LED的阴极(-)。还要焊接2个连接器:红色接头应连至Arduino的24脚,棕色接头应连至Arduino的GND脚。

RGB LED有两种类型:共阴极(-)RGB LED,如图2(左)所示;共阳极(+)RGB LED,如图2(右)所示。两者都可以在该项目中使用。两者的唯一区别是:对于共阴极LED,您需要将(-)引脚连接到地(GND);对于共阳极LED,您需要将(+)引脚连接到5V。

为了说明如何使用这两种类型的RGB LED,我们将使用3个共阳极RGB LED(RGB LED1、RGB LED2和RGB LED3)和2个共阴极RGB LED(RGB LED4和RGB LED5)。用双面胶将5个RGB LED粘贴到圣诞树,请参见图6。

pYYBAGPzFbuAYNqoAADiCrorYk8741.jpg

图6 安装RGBLED、红色LED和接插线的圣诞树

具体安装情况请参见图7(背面)。最后,焊接LED、导线和电阻之间的所有连接。

poYBAGPzFbyADSGyAACtgW2YQ0M885.jpg

图7 背面

安装RGB接插线

接下来,在每个RGB LED上连接三根接插线,R、G、B引脚各连接一根。这些接插线与Arduino Mega引脚的连接请参考图8:

pYYBAGPzFb6ADn6hAAFNLOjrHg0486.jpg

图8安装接插线的RGB LED

将3条并行线连接到RGB LED 1(+)、RGB LED 2(+)和RGB LED 3(+),线的另一端连至Arduino的5V引脚。

将2条并行线连接至RGB LED 4(-)和RGB LED 5(-),线的另一端连接至Arduino的GND引脚。

poYBAGPzFb-ACntuAAEqQ-TQlBc658.jpg

图9 所有LED和接插线都已安装

安装Arduino和传感器

如下图所示,将3个六角螺柱安装到Arduino Mega上:

poYBAGPzFcGAX8suAACYK6aJV_I336.jpg

图10 装有六角螺柱的Arduino Mega

将ROHM开发板连接到Arduino Mega的顶部(确保引脚对齐),然后将ROHM温度传感器插到Analog 2接口,并将ROHM气压传感器插到ROHM开发板板上的I2C接口。

pYYBAGPzFcOAMm_yAADLoKTTlJk978.jpg

图11 顶部装有ROHM传感器开发板以及两个传感器的Arduino Mega

气压传感器可以使用1.8V或3V,而温度传感器只能使用3V或5V。因此,我们必须用跳线将电压设置为3V(图12)。

有关ROHM传感器的更多信息,请参阅ROHM传感器评估套件概述

pYYBAGPzFcWAIPTdAAEeZfmW6Xk817.jpg

图12 用跳线选择3V

还记得我们为Mega钻的安装孔吗?请用三颗螺钉将Mega和ROHM传感器开发板安装到圣诞树上。

poYBAGPzFcaAKlqoAAEoDrAHIds789.jpg

图13 安装在圣诞树上的Arduino Mega和ROHM开发板

现在,将RGB LED的三根接插线连至Arduino的对应引脚。连接线序请参考下表和图8。下文的程序将使用以下引脚,因此请确保引脚的连接与下表匹配。

RGB LED接线与Arduino引脚的连接关系:

Connection to Arduino RGB R- Pin RGB G- Pin RGB B- Pin
RGB Led 1 Arduino Pin 36 Arduino Pin 34 Arduino Pin 38
RGB Led 2 Arduino Pin 3 Arduino Pin 4 Arduino Pin 2
RGB Led 3 Arduino Pin 6 Arduino Pin 5 Arduino Pin 7
RGB Led 4 Arduino Pin 9 Arduino Pin 8 Arduino Pin 10
RGB Led 5 Arduino Pin 12 Arduino Pin 13 Arduino Pin 11

pYYBAGPzFciAI4bhAAE5dwVuiMY878.jpg

图14 将RGB LED的接插线连至Arduino

然后将从RGB LED(+)引出的3条并行线连接到5V,将从RGB LED(-)引出的2条并行线连接到GND。

将从红色LED(-)引出的线缆连至Arduino的另一个GND引脚,再把从红色LED(+)引出的线缆连至引脚24。

poYBAGPzFcqAZgXGAAFj_-2BnlY371.jpg

图15 将其他线缆连至Arduino

poYBAGPzFcuADXjFAAGQZGAecZo690.jpg

图16 连线局部放大图

固定底座,让圣诞树能够独立站立。现在,圣诞树制作完成!图17显示了所有组件组装完成的样子:

pYYBAGPzFc2AMQDjAAE_0ePpzUM774.jpg

图17 完成的圣诞树

编写程序测试传感器

现在,我们用以下程序测试项目所使用的传感器。该程序是根据ROHM的两个示例程序开发的。其基本概念就是从传感器读取数据并将其打印到串行监视器中。

首先,请从以下网站下载两个库(BM1383GLV.h 和 BD1020.h):https://www.rohm.com/web/global/sensor-shield-support/pressure-sensor 和 https://www.rohm.com/web/global/sensor-shield-support/temperature-sensor

然后,将它们与之前已安装的其他库一起复制到Arduino库中。接下来,复制以下程序并将其上传到Arduino开发板。不要忘记在工具/板管理器(Tools/Board Manager)中指定“Arduino/Genuino Mega or Mega 2560”!

//******************************************************************************

#include 

#include 

#include 

int tempout_pin = A2;

BM1383GLV bm1383;

BD1020 bd1020;

//***********setup*******************

void setup()

 {

  Serial.begin(9600);

  while (!Serial);

  bd1020.init(tempout_pin);

   byte rc;

   while (!Serial);

   Wire.begin();

   rc = bm1383.init();

}

//*********** start loop ***************

void loop()

{

 //******* read Barometric Pressure*****

  byte rc;

  float press;

  rc = bm1383.get_val(&press);

  if (rc == 0) {

   Serial.write("BM1383GLV (PRESS) = ");

   Serial.print(press);

   Serial.println(" [hPa]");

   Serial.println();}

 //******** read Temperature **********

  float temp;

  bd1020.get_val(&temp);

//********* print to serial monitor ******

  Serial.print("BD1020HFV Temp=");

  Serial.print(temp);

  Serial.print("  [degrees Celsius], ADC=");

  Serial.println(bd1020.temp_adc);



//**************end loop***************

}

//*****************************************************************************

如果程序正确运行,打开串行监视器,您会看到与下图类似的结果:

poYBAGPzFc-AbwnmAADpmEWxC_s240.jpg

上传最终程序

现在我们可以测试最终程序了。该程序会执行以下步骤:

读取气压和温度传感器的数值。

根据计数器的值设置RGB LED 1的颜色(即,每个循环计数器加1,如果值> 3,则将计数器重置为0)。

根据温度读数设置RGB LED 2和RGB LED 3的颜色。

根据气压读数为RGB LED 4和RGB LED 5设置颜色。

接下来,请将以下程序复制到Arduino IDE中,然后根据当地环境更改温度和大气压力的数值。

最后,根据表1和图8,再次检查引脚分配是否匹配。

一切正确后,请将程序上传到开发板上。

//******************************************************************************

#include 

#include 

#include 



BM1383GLV bm1383;

int tempout_pin = A2; // analog temperature sensor

BD1020 bd1020;



//******* RGB Led 1 (non PWM) *******

int redPin1   = 36;

int greenPin1 = 34;

int bluePin1  = 38;



//******* RGB Led 2 (PWM )    *******

int redPin2   = 3;

int greenPin2 = 4;

int bluePin2  = 2;



//******* RGB Led 3 (PWM)     *******

int redPin3   = 6;

int greenPin3 = 5;

int bluePin3  = 7;



//******* RGB Led 4 (PWM)     *******

int redPin4   = 9;

int greenPin4 = 8;

int bluePin4  = 10;



//******* RGB Led 5 (PWM)     *******

int redPin5   = 12;

int greenPin5 = 13;

int bluePin5  = 11;



//******* red Led  (non PWM) *******

int redLed = 24;



int time1  = 1000;

int time2  = 500;

int count  = 0;



//uncomment this line if using a Common Anode LED

#define COMMON_ANODE



//********************************************************************************

void setup() {



 pinMode(redPin1,   OUTPUT);

 pinMode(greenPin1, OUTPUT);

 pinMode(bluePin1,  OUTPUT);



 pinMode(redPin2,   OUTPUT);

 pinMode(greenPin2, OUTPUT);

 pinMode(bluePin2,  OUTPUT);



 pinMode(redPin3,   OUTPUT);

 pinMode(greenPin3, OUTPUT);

 pinMode(bluePin3,  OUTPUT);



 pinMode(redPin4,   OUTPUT);

 pinMode(greenPin4, OUTPUT);

 pinMode(bluePin4,  OUTPUT);



 pinMode(redPin5,   OUTPUT);

 pinMode(greenPin5, OUTPUT);

 pinMode(bluePin5,  OUTPUT);



 pinMode(redLed,    OUTPUT);

 

 Serial.begin(9600);

 while (!Serial);

 bd1020.init(tempout_pin);

  byte rc;

  while (!Serial);

  Wire.begin();

  rc = bm1383.init();

}



//*********************** start loop **************************************

void loop()

{

//*********************** read barometric oressure ************************

 byte rc;

 float press;

 rc = bm1383.get_val(&press);

 if (rc == 0) {

  Serial.write("BM1383GLV (PRESS) = ");

  Serial.print(press);

  Serial.println(" [hPa]");

  Serial.println();}

//********************** read Temperature ********************************

 float temp;

 bd1020.get_val(&temp);

 Serial.print("BD1020HFV Temp=");

 Serial.print(temp);

 Serial.print("  [degrees Celsius], ADC=");

 Serial.println(bd1020.temp_adc);

 Serial.println(count);

 

//********************* set color for RGB Led 1 ****************************

// This non PWM digital input, so we only put high (128 - 255) or low (0 -127)

 if (count == 0)

 {setColor1(128,128,128);  // white

 delay(time1);

 setColor1(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}  

 

 if (count == 1)

 {setColor1(255,0,0);  // red

 delay(time1);

 setColor1(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 

 if (count == 2)

 {setColor1(0,255,0);  // green

 delay(time1);

 setColor1(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 

 if (count == 3)

 {setColor1(0,0,255);  // blue

 delay(time1);

 setColor1(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}



 count = count + 1;

 if (count > 3) {count = 0;}



//********************* set color for RGB Led 2 and 3 ******************

 if (temp > 32.00)    // *********** Change temperature ( in degree Celcius) to adapt local temp ******

 {setColor2(50, 0, 0);// red

 delay(time1);

 setColor2(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (temp > 30.00)   // *********** Change temperature ( in degree Celcius) to adapt local temp ******

 {setColor2(50, 25, 0);  

 delay(time1);

 setColor2(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (temp > 28.00)   // *********** Change temperature ( in degree Celcius) to adapt local temp ******

 {setColor2(25, 50, 0);

 delay(time1);

 setColor2(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (temp > 26.00)   // *********** Change temperature ( in degree Celcius) to adapt local temp ******

 {setColor2(0, 50, 0);  // green

 delay(time1);

 setColor2(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (temp> 24.00)    // *********** Change temperature ( in degree Celcius) to adapt local temp ******

 {setColor2(0, 50, 25);  //

 delay(time1);

 setColor2(0, 0, 0);  // off  

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (temp > 22.00)    // *********** Change temperature ( in degree Celcius) to adapt local temp ******

 {setColor2(0, 25, 50);  //

 delay(time1);

 setColor2(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if(temp <= 22.00)   // *********** Change temperature ( in degree Celcius) to adapt local temp ******

 {setColor2(0 ,0 ,50);  //blue

 delay(time1);

 setColor2(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}



//************************* set color for RGB Led 4 and 5  ******************

 if (press > 1020.00)

 {setColor3(50, 0, 0);  // red

 delay(time1);

 setColor3(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (press > 1015.00)

 {setColor3(50, 50, 0);  // yellow

 delay(time1);

 setColor3(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (press > 1010.00)

 {setColor3(0, 50, 0);  // green

 delay(time1);

 setColor3(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 else

 if (press <= 1010.00)

 {setColor3(0, 0, 50);  // blue

 delay(time1);

 setColor3(0, 0, 0);  // off

 digitalWrite(redLed, HIGH);

 delay(time2);

 digitalWrite(redLed, LOW);}

 

//************************ end of loop *****************************************

}

//******************************** RGB Led 1 *********************************************

void setColor1(int red1, int green1, int blue1)

{

 #ifdef COMMON_ANODE

   red1 = 255 - red1;

   green1 = 255 - green1;

   blue1 = 255 - blue1;

 #endif



 analogWrite(redPin1, red1);

 analogWrite(greenPin1, green1);

 analogWrite(bluePin1, blue1);

}

//*******************************RGB Led 2 **********************************************

void setColor2(int red2, int green2, int blue2)

{

 #ifdef COMMON_ANODE

   red2 = 255 - red2;

   green2 = 255 - green2;

   blue2 = 255 - blue2;

 #endif

 analogWrite(redPin2, red2);

 analogWrite(greenPin2, green2);

 analogWrite(bluePin2, blue2);  



 analogWrite(redPin3, red2);

 analogWrite(greenPin3, green2);

 analogWrite(bluePin3, blue2);  

}

//***************************** RGB Led 3 *************************************************

void setColor3(int red3, int green3, int blue3)

{

 analogWrite(redPin4, red3);

 analogWrite(greenPin4, green3);

 analogWrite(bluePin4, blue3);



 analogWrite(redPin5, red3);

 analogWrite(greenPin5, green3);

 analogWrite(bluePin5, blue3);

}

//***************************** end of program********************************

如果一切正常,请运行该程序。运行结果应该与上面视频中展示的情况类似。上述视频演示了电子圣诞树的工作原理。如果利用吹风机将温度升高,那么RGB LED 2和RGB LED 3的颜色会从绿色变成红色;当温度恢复正常时,LED灯的颜色会变回绿色。

我希望您能喜欢这个项目!祝大家圣诞快乐,新年快乐!

poYBAGPzFbGAefWcAAEptsQP1DQ272.jpg

图18 最终的圣诞树(前视图)

pYYBAGPzFdKAI2nzAAEsVPPQf9M545.jpg

图19 完成的圣诞树(侧视图)

pYYBAGPzFWyADVB1AAAGS83r-qY435.jpg

Purnomo Nuhalim

来自墨尔本的Purnomo是一名退休人员,也是电子发烧友。目前,他正使用Arduino和Raspberry Pi从事各种开放式硬件项目的研发。除了电子学,他还对航空建模和天文学充满热情。

审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2525

    文章

    48129

    浏览量

    740189
  • led
    led
    +关注

    关注

    237

    文章

    22455

    浏览量

    645897
  • Arduino
    +关注

    关注

    184

    文章

    6428

    浏览量

    184852
收藏 人收藏

    评论

    相关推荐

    圣诞树 电子制作

    本帖最后由 1053344544 于 2024-4-8 22:54 编辑 `圣诞树
    发表于 10-07 15:17

    DIY一颗圣诞树

    .多年来我一直在想这个问题。圣诞树-尺寸:15.5厘米x 28.7厘米-LED数量:22个3mm红色LED编程:这个PCB是通过PinguinIDE编程的,它使用与
    发表于 06-20 09:24

    使用IC555制作一颗圣诞树

    描述blink_y 圣诞树去年我参加了 JuliaPcbChallenge2020,我的电路完全失败了,今年我希望能有所收获,所以我决定这次做一个更简单的项目。我使用 IC 555 来闪烁 LED
    发表于 06-27 07:08

    制作一颗简单漂亮的圣诞树

    描述圣诞树PCB gerbers文件
    发表于 07-01 06:58

    制作一棵新年圣诞树

    描述项目圣诞树 v2在上一篇文章中,我详细告诉过你如何用自己的双手为新年制作一棵圣诞树,其中是关于我的名为 Xmas Tree v1 的项目 - 使用 STM8 微控制在 16 个地
    发表于 07-04 06:29

    组装一个非常简单的圣诞树

    描述非常简单的圣诞树#2这是一个非常简单的圣诞树,带有 5 毫米 LED 和 CR2032 纽扣电池,任何人都可以构建和组装。您将需要 7 个您选择的 5 毫米 LED(可以是静态的或
    发表于 07-04 07:26

    自制一个有创意的微型圣诞树

    的 8 位微控制上的大脑将适合 STM8S003F3P6 或 STM8S103F3P6。圣诞树效果:填充物开火五彩纸屑彩虹带闪光的彩虹戏剧像素追逐gorenje 火焰的动画逐像素出现和消失的效果3
    发表于 07-08 08:17

    自制一颗有旋律节奏的圣诞树

    描述圣诞树V2这是我的观众每年都会问我的一个项目,所以我不断更新他们非常喜欢的不同版本,这是关于一棵有节奏的圣诞树,有本季的 3 首优美的经典旋律,其中包括 21 个点亮的 LED随着旋律的节奏。PCB+展示
    发表于 07-18 07:01

    利用RGB LED创造圣诞树的智能装饰品

    描述RGB圣诞树今年我想在我的圣诞树上添加我自己设计和建造的东西,所以我 RGB LED 创造了这个智能装饰。LED 由 ESP32 控制
    发表于 07-28 07:48

    自制LED圣诞树

    描述LED圣诞树简单的圣诞装饰品,可与 Arduino(通过电源驱动)或其他驱动电路一起使用。非常适合作为
    发表于 08-03 06:50

    制作一个圣诞树礼帽

    描述我们从亚马逊买了一棵带 RGB 灯的带灯圣诞树。它在死前持续了一个赛季。今年我决定为我的妻子做一个圣诞树礼帽,因为圣诞节是她最喜欢的节日。它涉及为 LED 设计一个小型电路板,在烤
    发表于 08-25 06:18

    绘制有8个Neopixels的圣诞树

    描述圣诞树Neopixel PCB这款圣诞树 PCB 有 8 个 Neopixels,可以通过按钮更改图案。XY 模式下的示波器还有一个双 PWM 输出,可以在示波器上绘制圣诞树!展示代码https://github.com/G
    发表于 08-29 07:52

    构建一颗圣诞树的教程

    描述圣诞树
    发表于 09-14 06:54

    基于Arduino装饰圣诞树的教程

    由于圣诞节快到了,没有装饰和圣诞树,它的本质是不完整的。所以,不要使用我们每年都放的旧圣诞树装饰品,让我们更上一层楼,使用带有 Neo 像素 LED 灯条、JQ6500 语音模块和PI
    的头像 发表于 07-13 16:45 2683次阅读
    基于<b class='flag-5'>Arduino</b>装饰<b class='flag-5'>圣诞树</b>的教程

    Arduino LED圣诞树开源项目

    电子发烧友网站提供《Arduino LED圣诞树开源项目.zip》资料免费下载
    发表于 07-20 17:20 0次下载
    <b class='flag-5'>Arduino</b> <b class='flag-5'>LED</b><b class='flag-5'>圣诞树</b>开源项目