這篇文章來(lái)源于DevicePlus.com英語(yǔ)網(wǎng)站的翻譯稿。
	
在此項(xiàng)目中,我們將利用Arduino Mega和RGB LED制作一顆小型LED Arduino亞克力(丙烯酸樹(shù)脂)圣誕樹(shù)。我們將利用ROHM溫度傳感器和氣壓傳感器來(lái)更改LED的顏色。程序的構(gòu)建和編碼都很簡(jiǎn)單。用這棵LED圣誕樹(shù)裝飾您的房間將非常有趣!
我的上一篇文章介紹了如何設(shè)置傳感器開(kāi)發(fā)板以及如何連接Arduino。如果您還沒(méi)看過(guò)該文,請(qǐng)點(diǎn)擊ROHM傳感器評(píng)估套件概述!
該圣誕樹(shù)可以實(shí)現(xiàn)以下功能:
星形RGB LED交替改變顏色(循環(huán)顯示)。
兩個(gè)RGB LED(左上和右上)將根據(jù)局部溫度(示例程序中的溫度范圍為22到32攝氏度之間)改變顏色。
兩個(gè)RGB LED(左下方和右下方)將根據(jù)本地氣壓的變化而改變自身的顏色(示例程序中的氣壓范圍為1010至1020 hPa之間)。
硬件
Arduino Mega 2560
RGB LEDs (5x)
紅色 LEDs (5x)
Arduino ROHM 傳感器開(kāi)發(fā)板
ROHM 溫度傳感器 (BD1020HFV)
ROHM 壓力傳感器 (BM1383GLV)
接插線
195 x 195 x 3mm 亞克力板
M3 尼龍六角墊柱
電阻 (39 歐姆)
軟件
Arduino IDE
ROHM 溫度傳感器庫(kù) (https://micro.rohm.com/en/download_support/sensor_module/kiyaku.php?file=data/software/BD1020HFV.zip)
ROHM 氣壓傳感器庫(kù) (https://micro.rohm.com/en/download_support/sensor_module/kiyaku.php?file=data/software/BM1383GLV.zip)
工具
迷你鋼鋸
Dremel 電動(dòng)工具
電烙鐵
	
圖1 Arduino Mega 2650(左),ROHM Arduino開(kāi)發(fā)板(右),ROHM傳感器(上)
	
圖2 共陰極(-)RGB LED(左),共陽(yáng)極(+)RGB LED(右)
	
圖3 接插線
	
圖4 12V電源
用亞克力制作樹(shù)的骨架
首先,讓我們使用亞克力制作圣誕樹(shù)的骨架。在一張適當(dāng)大小的紙上畫(huà)一顆樹(shù),并將紙蓋在亞克力板上,然后用小鋼鋸根據(jù)紙上的圖形將亞克力板切割成樹(shù)的樣子(圖5)。然后,根據(jù)以下需要安裝的器件,在骨架上鉆出足夠數(shù)量和尺寸的孔:
Arduino Mega (3個(gè) 或 4個(gè))
RGB LED的連接電纜(5個(gè))
紅色LED(2×5)
利用剩余的亞克力板切割出一個(gè)小的星形(圖6),然后將其粘到圣誕樹(shù)頂部(用CA膠或強(qiáng)力粘膠)。
	
圖5 亞克力板制作的圣誕樹(shù)骨架
安裝LED和接插線
將紅色LED插入圣誕樹(shù)的鉆孔內(nèi),注意所有紅色LED應(yīng)該并聯(lián)連接,然后焊接連線。所有陽(yáng)極(+)和陰極(-)分別連接在一起,請(qǐng)務(wù)必確保所有LED的位置正確,將39歐姆電阻串行焊接到紅色LED的陰極(-)。還要焊接2個(gè)連接器:紅色接頭應(yīng)連至Arduino的24腳,棕色接頭應(yīng)連至Arduino的GND腳。
RGB LED有兩種類(lèi)型:共陰極(-)RGB LED,如圖2(左)所示;共陽(yáng)極(+)RGB LED,如圖2(右)所示。兩者都可以在該項(xiàng)目中使用。兩者的唯一區(qū)別是:對(duì)于共陰極LED,您需要將(-)引腳連接到地(GND);對(duì)于共陽(yáng)極LED,您需要將(+)引腳連接到5V。
為了說(shuō)明如何使用這兩種類(lèi)型的RGB LED,我們將使用3個(gè)共陽(yáng)極RGB LED(RGB LED1、RGB LED2和RGB LED3)和2個(gè)共陰極RGB LED(RGB LED4和RGB LED5)。用雙面膠將5個(gè)RGB LED粘貼到圣誕樹(shù),請(qǐng)參見(jiàn)圖6。
	
圖6 安裝RGBLED、紅色LED和接插線的圣誕樹(shù)
具體安裝情況請(qǐng)參見(jiàn)圖7(背面)。最后,焊接LED、導(dǎo)線和電阻之間的所有連接。
	
圖7 背面
安裝RGB接插線
接下來(lái),在每個(gè)RGB LED上連接三根接插線,R、G、B引腳各連接一根。這些接插線與Arduino Mega引腳的連接請(qǐng)參考圖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個(gè)六角螺柱安裝到Arduino Mega上:
	
圖10 裝有六角螺柱的Arduino Mega
將ROHM開(kāi)發(fā)板連接到Arduino Mega的頂部(確保引腳對(duì)齊),然后將ROHM溫度傳感器插到Analog 2接口,并將ROHM氣壓傳感器插到ROHM開(kāi)發(fā)板板上的I2C接口。
	
圖11 頂部裝有ROHM傳感器開(kāi)發(fā)板以及兩個(gè)傳感器的Arduino Mega
氣壓傳感器可以使用1.8V或3V,而溫度傳感器只能使用3V或5V。因此,我們必須用跳線將電壓設(shè)置為3V(圖12)。
有關(guān)ROHM傳感器的更多信息,請(qǐng)參閱ROHM傳感器評(píng)估套件概述!
	
圖12 用跳線選擇3V
還記得我們?yōu)镸ega鉆的安裝孔嗎?請(qǐng)用三顆螺釘將Mega和ROHM傳感器開(kāi)發(fā)板安裝到圣誕樹(shù)上。
	
圖13 安裝在圣誕樹(shù)上的Arduino Mega和ROHM開(kāi)發(fā)板
現(xiàn)在,將RGB LED的三根接插線連至Arduino的對(duì)應(yīng)引腳。連接線序請(qǐng)參考下表和圖8。下文的程序?qū)⑹褂靡韵乱_,因此請(qǐng)確保引腳的連接與下表匹配。
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的另一個(gè)GND引腳,再把從紅色LED(+)引出的線纜連至引腳24。
	
圖15 將其他線纜連至Arduino
	
圖16 連線局部放大圖
固定底座,讓圣誕樹(shù)能夠獨(dú)立站立?,F(xiàn)在,圣誕樹(shù)制作完成!圖17顯示了所有組件組裝完成的樣子:
	
圖17 完成的圣誕樹(shù)
編寫(xiě)程序測(cè)試傳感器
現(xiàn)在,我們用以下程序測(cè)試項(xiàng)目所使用的傳感器。該程序是根據(jù)ROHM的兩個(gè)示例程序開(kāi)發(fā)的。其基本概念就是從傳感器讀取數(shù)據(jù)并將其打印到串行監(jiān)視器中。
首先,請(qǐng)從以下網(wǎng)站下載兩個(gè)庫(kù)(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
然后,將它們與之前已安裝的其他庫(kù)一起復(fù)制到Arduino庫(kù)中。接下來(lái),復(fù)制以下程序并將其上傳到Arduino開(kāi)發(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***************
}
//*****************************************************************************
如果程序正確運(yùn)行,打開(kāi)串行監(jiān)視器,您會(huì)看到與下圖類(lèi)似的結(jié)果:
	
上傳最終程序
現(xiàn)在我們可以測(cè)試最終程序了。該程序會(huì)執(zhí)行以下步驟:
讀取氣壓和溫度傳感器的數(shù)值。
根據(jù)計(jì)數(shù)器的值設(shè)置RGB LED 1的顏色(即,每個(gè)循環(huán)計(jì)數(shù)器加1,如果值> 3,則將計(jì)數(shù)器重置為0)。
根據(jù)溫度讀數(shù)設(shè)置RGB LED 2和RGB LED 3的顏色。
根據(jù)氣壓讀數(shù)為RGB LED 4和RGB LED 5設(shè)置顏色。
接下來(lái),請(qǐng)將以下程序復(fù)制到Arduino IDE中,然后根據(jù)當(dāng)?shù)丨h(huán)境更改溫度和大氣壓力的數(shù)值。
最后,根據(jù)表1和圖8,再次檢查引腳分配是否匹配。
一切正確后,請(qǐng)將程序上傳到開(kāi)發(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********************************
如果一切正常,請(qǐng)運(yùn)行該程序。運(yùn)行結(jié)果應(yīng)該與上面視頻中展示的情況類(lèi)似。上述視頻演示了電子圣誕樹(shù)的工作原理。如果利用吹風(fēng)機(jī)將溫度升高,那么RGB LED 2和RGB LED 3的顏色會(huì)從綠色變成紅色;當(dāng)溫度恢復(fù)正常時(shí),LED燈的顏色會(huì)變回綠色。
我希望您能喜歡這個(gè)項(xiàng)目!祝大家圣誕快樂(lè),新年快樂(lè)!
	
圖18 最終的圣誕樹(shù)(前視圖)
	
圖19 完成的圣誕樹(shù)(側(cè)視圖)
	
Purnomo Nuhalim
	來(lái)自墨爾本的Purnomo是一名退休人員,也是電子發(fā)燒友。目前,他正使用Arduino和Raspberry Pi從事各種開(kāi)放式硬件項(xiàng)目的研發(fā)。除了電子學(xué),他還對(duì)航空建模和天文學(xué)充滿(mǎn)熱情。
	審核編輯黃宇
- 
                                傳感器
                                +關(guān)注
關(guān)注
2573文章
54043瀏覽量
782896 - 
                                led
                                +關(guān)注
關(guān)注
243文章
24373瀏覽量
685563 - 
                                Arduino
                                +關(guān)注
關(guān)注
190文章
6512瀏覽量
195447 
發(fā)布評(píng)論請(qǐng)先 登錄
用C語(yǔ)言實(shí)現(xiàn)一個(gè)圣誕樹(shù)!
DIY一顆圣誕樹(shù)
自制LED圣誕樹(shù)
簡(jiǎn)易LED圣誕樹(shù)制作教程
一款LED圣誕樹(shù)的制作
PCB圣誕樹(shù)的制作
    
基于Arduino裝飾圣誕樹(shù)的教程
    
Arduino LED圣誕樹(shù)開(kāi)源項(xiàng)目
    
制作圣誕樹(shù)Neopixel PCB
    
由LED點(diǎn)亮的圣誕樹(shù)
    
Arduino網(wǎng)絡(luò)圣誕樹(shù)
    
Arduino LCD圣誕樹(shù)
    
          
        
        
用ROHM傳感器套件制作Arduino LED圣誕樹(shù)
                
 
    
           
            
            
                
            
評(píng)論