這篇文章來源于DevicePlus.com英語網站的翻譯稿。
在此項目中,我們將利用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 電動工具
電烙鐵
圖1 Arduino Mega 2650(左),ROHM Arduino開發板(右),ROHM傳感器(上)
圖2 共陰極(-)RGB LED(左),共陽極(+)RGB LED(右)
圖3 接插線
圖4 12V電源
用亞克力制作樹的骨架
首先,讓我們使用亞克力制作圣誕樹的骨架。在一張適當大小的紙上畫一顆樹,并將紙蓋在亞克力板上,然后用小鋼鋸根據紙上的圖形將亞克力板切割成樹的樣子(圖5)。然后,根據以下需要安裝的器件,在骨架上鉆出足夠數量和尺寸的孔:
Arduino Mega (3個 或 4個)
RGB LED的連接電纜(5個)
紅色LED(2×5)
利用剩余的亞克力板切割出一個小的星形(圖6),然后將其粘到圣誕樹頂部(用CA膠或強力粘膠)。
圖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。
圖6 安裝RGBLED、紅色LED和接插線的圣誕樹
具體安裝情況請參見圖7(背面)。最后,焊接LED、導線和電阻之間的所有連接。
圖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開發板連接到Arduino Mega的頂部(確保引腳對齊),然后將ROHM溫度傳感器插到Analog 2接口,并將ROHM氣壓傳感器插到ROHM開發板板上的I2C接口。
圖11 頂部裝有ROHM傳感器開發板以及兩個傳感器的Arduino Mega
氣壓傳感器可以使用1.8V或3V,而溫度傳感器只能使用3V或5V。因此,我們必須用跳線將電壓設置為3V(圖12)。
有關ROHM傳感器的更多信息,請參閱ROHM傳感器評估套件概述!
圖12 用跳線選擇3V
還記得我們為Mega鉆的安裝孔嗎?請用三顆螺釘將Mega和ROHM傳感器開發板安裝到圣誕樹上。
圖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 |
圖14 將RGB LED的接插線連至Arduino
然后將從RGB LED(+)引出的3條并行線連接到5V,將從RGB LED(-)引出的2條并行線連接到GND。
將從紅色LED(-)引出的線纜連至Arduino的另一個GND引腳,再把從紅色LED(+)引出的線纜連至引腳24。
圖15 將其他線纜連至Arduino
圖16 連線局部放大圖
固定底座,讓圣誕樹能夠獨立站立。現在,圣誕樹制作完成!圖17顯示了所有組件組裝完成的樣子:
圖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*************** } //*****************************************************************************
如果程序正確運行,打開串行監視器,您會看到與下圖類似的結果:
上傳最終程序
現在我們可以測試最終程序了。該程序會執行以下步驟:
讀取氣壓和溫度傳感器的數值。
根據計數器的值設置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燈的顏色會變回綠色。
我希望您能喜歡這個項目!祝大家圣誕快樂,新年快樂!
圖18 最終的圣誕樹(前視圖)
圖19 完成的圣誕樹(側視圖)
Purnomo Nuhalim
來自墨爾本的Purnomo是一名退休人員,也是電子發燒友。目前,他正使用Arduino和Raspberry Pi從事各種開放式硬件項目的研發。除了電子學,他還對航空建模和天文學充滿熱情。
審核編輯黃宇
-
傳感器
+關注
關注
2548文章
50732瀏覽量
752126 -
led
+關注
關注
242文章
23151瀏覽量
658595 -
Arduino
+關注
關注
187文章
6464瀏覽量
186675
發布評論請先 登錄
相關推薦
評論