這篇文章來源于DevicePlus.com英語網(wǎng)站的翻譯稿。

在此項目中,我們將利用Arduino Mega和RGB LED制作一顆小型LED Arduino亞克力(丙烯酸樹脂)圣誕樹。我們將利用ROHM溫度傳感器和氣壓傳感器來更改LED的顏色。程序的構(gòu)建和編碼都很簡單。用這棵LED圣誕樹裝飾您的房間將非常有趣!
我的上一篇文章介紹了如何設(shè)置傳感器開發(fā)板以及如何連接Arduino。如果您還沒看過該文,請點擊ROHM傳感器評估套件概述!
該圣誕樹可以實現(xiàn)以下功能:
星形RGB LED交替改變顏色(循環(huán)顯示)。
兩個RGB LED(左上和右上)將根據(jù)局部溫度(示例程序中的溫度范圍為22到32攝氏度之間)改變顏色。
兩個RGB LED(左下方和右下方)將根據(jù)本地氣壓的變化而改變自身的顏色(示例程序中的氣壓范圍為1010至1020 hPa之間)。
硬件
Arduino Mega 2560
RGB LEDs (5x)
紅色 LEDs (5x)
Arduino ROHM 傳感器開發(fā)板
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 電動工具
電烙鐵

圖1 Arduino Mega 2650(左),ROHM Arduino開發(fā)板(右),ROHM傳感器(上)

圖2 共陰極(-)RGB LED(左),共陽極(+)RGB LED(右)

圖3 接插線

圖4 12V電源
用亞克力制作樹的骨架
首先,讓我們使用亞克力制作圣誕樹的骨架。在一張適當(dāng)大小的紙上畫一顆樹,并將紙蓋在亞克力板上,然后用小鋼鋸根據(jù)紙上的圖形將亞克力板切割成樹的樣子(圖5)。然后,根據(jù)以下需要安裝的器件,在骨架上鉆出足夠數(shù)量和尺寸的孔:
Arduino Mega (3個 或 4個)
RGB LED的連接電纜(5個)
紅色LED(2×5)
利用剩余的亞克力板切割出一個小的星形(圖6),然后將其粘到圣誕樹頂部(用CA膠或強力粘膠)。

圖5 亞克力板制作的圣誕樹骨架
安裝LED和接插線
將紅色LED插入圣誕樹的鉆孔內(nèi),注意所有紅色LED應(yīng)該并聯(lián)連接,然后焊接連線。所有陽極(+)和陰極(-)分別連接在一起,請務(wù)必確保所有LED的位置正確,將39歐姆電阻串行焊接到紅色LED的陰極(-)。還要焊接2個連接器:紅色接頭應(yīng)連至Arduino的24腳,棕色接頭應(yīng)連至Arduino的GND腳。
RGB LED有兩種類型:共陰極(-)RGB LED,如圖2(左)所示;共陽極(+)RGB LED,如圖2(右)所示。兩者都可以在該項目中使用。兩者的唯一區(qū)別是:對于共陰極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。

圖6 安裝RGBLED、紅色LED和接插線的圣誕樹
具體安裝情況請參見圖7(背面)。最后,焊接LED、導(dǎo)線和電阻之間的所有連接。

圖7 背面
安裝RGB接插線
接下來,在每個RGB LED上連接三根接插線,R、G、B引腳各連接一根。這些接插線與Arduino Mega引腳的連接請參考圖8:

圖8安裝接插線的RGB LED
將3條并行線連接到RGB LED 1(+)、RGB LED 2(+)和RGB LED 3(+),線的另一端連至Arduino的5V引腳。
將2條并行線連接至RGB LED 4(-)和RGB LED 5(-),線的另一端連接至Arduino的GND引腳。

圖9 所有LED和接插線都已安裝
安裝Arduino和傳感器
如下圖所示,將3個六角螺柱安裝到Arduino Mega上:

圖10 裝有六角螺柱的Arduino Mega
將ROHM開發(fā)板連接到Arduino Mega的頂部(確保引腳對齊),然后將ROHM溫度傳感器插到Analog 2接口,并將ROHM氣壓傳感器插到ROHM開發(fā)板板上的I2C接口。

圖11 頂部裝有ROHM傳感器開發(fā)板以及兩個傳感器的Arduino Mega
氣壓傳感器可以使用1.8V或3V,而溫度傳感器只能使用3V或5V。因此,我們必須用跳線將電壓設(shè)置為3V(圖12)。
有關(guān)ROHM傳感器的更多信息,請參閱ROHM傳感器評估套件概述!

圖12 用跳線選擇3V
還記得我們?yōu)镸ega鉆的安裝孔嗎?請用三顆螺釘將Mega和ROHM傳感器開發(fā)板安裝到圣誕樹上。

圖13 安裝在圣誕樹上的Arduino Mega和ROHM開發(fā)板
現(xiàn)在,將RGB LED的三根接插線連至Arduino的對應(yīng)引腳。連接線序請參考下表和圖8。下文的程序?qū)⑹褂靡韵乱_,因此請確保引腳的連接與下表匹配。
RGB LED接線與Arduino引腳的連接關(guān)系:
| 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 |

圖14 將RGB LED的接插線連至Arduino
然后將從RGB LED(+)引出的3條并行線連接到5V,將從RGB LED(-)引出的2條并行線連接到GND。
將從紅色LED(-)引出的線纜連至Arduino的另一個GND引腳,再把從紅色LED(+)引出的線纜連至引腳24。

圖15 將其他線纜連至Arduino

圖16 連線局部放大圖
固定底座,讓圣誕樹能夠獨立站立?,F(xiàn)在,圣誕樹制作完成!圖17顯示了所有組件組裝完成的樣子:

圖17 完成的圣誕樹
編寫程序測試傳感器
現(xiàn)在,我們用以下程序測試項目所使用的傳感器。該程序是根據(jù)ROHM的兩個示例程序開發(fā)的。其基本概念就是從傳感器讀取數(shù)據(jù)并將其打印到串行監(jiān)視器中。
首先,請從以下網(wǎng)站下載兩個庫(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
然后,將它們與之前已安裝的其他庫一起復(fù)制到Arduino庫中。接下來,復(fù)制以下程序并將其上傳到Arduino開發(fā)板。不要忘記在工具/板管理器(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***************
}
//*****************************************************************************
如果程序正確運行,打開串行監(jiān)視器,您會看到與下圖類似的結(jié)果:

上傳最終程序
現(xiàn)在我們可以測試最終程序了。該程序會執(zhí)行以下步驟:
讀取氣壓和溫度傳感器的數(shù)值。
根據(jù)計數(shù)器的值設(shè)置RGB LED 1的顏色(即,每個循環(huán)計數(shù)器加1,如果值> 3,則將計數(shù)器重置為0)。
根據(jù)溫度讀數(shù)設(shè)置RGB LED 2和RGB LED 3的顏色。
根據(jù)氣壓讀數(shù)為RGB LED 4和RGB LED 5設(shè)置顏色。
接下來,請將以下程序復(fù)制到Arduino IDE中,然后根據(jù)當(dāng)?shù)丨h(huán)境更改溫度和大氣壓力的數(shù)值。
最后,根據(jù)表1和圖8,再次檢查引腳分配是否匹配。
一切正確后,請將程序上傳到開發(fā)板上。
//******************************************************************************
#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********************************
如果一切正常,請運行該程序。運行結(jié)果應(yīng)該與上面視頻中展示的情況類似。上述視頻演示了電子圣誕樹的工作原理。如果利用吹風(fēng)機將溫度升高,那么RGB LED 2和RGB LED 3的顏色會從綠色變成紅色;當(dāng)溫度恢復(fù)正常時,LED燈的顏色會變回綠色。
我希望您能喜歡這個項目!祝大家圣誕快樂,新年快樂!

圖18 最終的圣誕樹(前視圖)

圖19 完成的圣誕樹(側(cè)視圖)

Purnomo Nuhalim
來自墨爾本的Purnomo是一名退休人員,也是電子發(fā)燒友。目前,他正使用Arduino和Raspberry Pi從事各種開放式硬件項目的研發(fā)。除了電子學(xué),他還對航空建模和天文學(xué)充滿熱情。
審核編輯黃宇
-
傳感器
+關(guān)注
關(guān)注
2573文章
53934瀏覽量
781836 -
led
+關(guān)注
關(guān)注
243文章
24338瀏覽量
685020 -
Arduino
+關(guān)注
關(guān)注
190文章
6509瀏覽量
195300
發(fā)布評論請先 登錄
用C語言實現(xiàn)一個圣誕樹!
DIY一顆圣誕樹
簡易LED圣誕樹制作教程
一款LED圣誕樹的制作
基于Arduino裝飾圣誕樹的教程
Arduino網(wǎng)絡(luò)圣誕樹

用ROHM傳感器套件制作Arduino LED圣誕樹
評論