这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 电源与模拟 » 用ROHM传感器套件制作ArduinoLED圣诞树

共2条 1/1 1 跳转至

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

工程师
2022-08-16 14:59:08     打赏

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


arduino christmas tree

圣诞节近在咫尺!在此项目中,我们将利用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 电动工具

  • 电烙铁

 

arduino christmas tree


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

 

arduino christmas tree


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


arduino christmas tree


图3 接插线

 

arduino christmas tree


图4 12V电源

用亚克力制作树的骨架

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

  • Arduino Mega (3个 或 4个)

  • RGB LED的连接电缆(5个)

  • 红色LED(2×5)

 

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

 

arduino christmas tree


图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。

 

arduino christmas tree


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

 

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

 

arduino christmas tree


图7 背面

 

安装RGB接插线

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

 

arduino christmas tree


图8安装接插线的RGB LED

 

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

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

 

arduino christmas tree


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

 

安装Arduino和传感器

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

 

arduino christmas tree


图10 装有六角螺柱的Arduino Mega

 

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

 

arduino christmas tree


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

 

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

 

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

 

arduino christmas tree


图12 用跳线选择3V

 

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

 

arduino christmas tree


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


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

 

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

 

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

 

arduino christmas tree


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

 

 

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

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

 

arduino christmas tree


图15 将其他线缆连至Arduino

 

 

arduino christmas tree


图16 连线局部放大图

 

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

 

arduino christmas tree


图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#includeint 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*************** } //*****************************************************************************

 

 

 

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

arduino christmas tree

上传最终程序

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

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

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

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

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

 

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

 

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

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

 

//****************************************************************************** #include#include#includeBM1383GLV 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灯的颜色会变回绿色。

 

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

 

arduino christmas tree


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

 

arduino christmas tree


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





关键词: ROHM     传感器     套件     制作     Arduino LE    

高工
2022-08-16 16:07:59     打赏
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]