耶誕節近在咫尺!在此項目中,我們將利用Arduino Mega和RGB LED製作一顆小型LED Arduino壓克力(丙烯酸樹脂)聖誕樹。我們將利用ROHM溫度感測器和氣壓感測器來更改LED的顏色。程式的構建和編碼都很簡單。用這棵LED聖誕樹裝飾您的房間將非常有趣!
我的上一篇文章介紹了如何設定感測器研發板以及如何連接Arduino。如果您還沒看過該文,請點擊ROHM感測器評估套件概述!
該聖誕樹可以實現以下功能:
首先,讓我們使用壓克力製作聖誕樹的骨架。在一張適當大小的紙上畫一顆樹,並將紙蓋在壓克力板上,然後用小鋼鋸根據紙上的佈局將壓克力板切割成樹的樣子(圖5)。然後,根據以下需要安裝的器件,在骨架上鑽出足夠數量和尺寸的孔:
利用剩餘的壓克力板切割出一個小的星形(圖6),然後將其粘到聖誕樹頂部(用CA膠或強力粘膠)。
將紅色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。
具體安裝情況請參見圖7(背面)。最後,焊接LED、導線和電阻之間的所有連接。
接下來,在每個RGB LED上連接三根接插線,R、G、B引腳各連接一根。這些接插線與Arduino Mega引腳的連接請參考圖8:
將3條平行線連接到RGB LED 1(+)、RGB LED 2(+)和RGB LED 3(+),線的另一端連至Arduino的5V引腳。
將2條平行線連接至RGB LED 4(-)和RGB LED 5(-),線的另一端連接至Arduino的GND引腳。
如下圖所示,將3個六角螺柱安裝到Arduino Mega上:
將ROHM研發板連接到Arduino Mega的頂部(確保引腳對齊),然後將ROHM溫度感測器插到Analog 2介面,並將ROHM氣壓感測器插到ROHM研發板板上的I2C介面。
氣壓感測器可以使用1.8V或3V,而溫度感測器只能使用3V或5V。因此,我們必須用跳線將電壓設定為3V(圖12)。
有關ROHM感測器的更多資訊,請參閱ROHM感測器評估套件概述!
還記得我們為Mega鑽的安裝孔嗎?請用三顆螺釘將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 |
然後將從RGB LED(+)引出的3條平行線連接到5V,將從RGB LED(-)引出的2條平行線連接到GND。
將從紅色LED(-)引出的線纜連至Arduino的另一個GND引腳,再把從紅色LED(+)引出的線纜連至引腳24。
固定底座,讓聖誕樹能夠獨立站立。現在,聖誕樹製作完成!圖17顯示了所有元件組裝完成的樣子:
編寫程式測試感測器
現在,我們用以下程式測試專案所使用的感測器。該程式是根據ROHM的兩個範例程式研發的。其基本概念就是從感測器讀取資料並將其列印到序列監視器中。
首先,請從以下網站下載兩個程式館(BM1383GLV.h和BD1020.h):http://www.rohm.com/web/global/sensor-shield-support/pressure-sensor和http://www.rohm.com/web/global/sensor-shield-support/temperature-sensor
然後,將它們與之前已安裝的其他程式館一起複製到Arduino程式館中。接下來,複製以下程式並將其上傳到Arduino研發板。不要忘記在工具/板管理器(Tools/Board Manager)中指定“Arduino/Genuino Mega or Mega 2560”!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
//****************************************************************************** #include <Wire.h> #include <BM1383GLV.h> #include <BD1020.h> 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*************** } //***************************************************************************** |
如果程式正確運行,打開序列監視器,您會看到與下圖類似的結果:
現在我們可以測試最終程式了。該程式會執行以下步驟:
接下來,請將以下程式複製到Arduino IDE中,然後根據當地環境更改溫度和大氣壓力的數值。
最後,根據表1和圖8,再次檢查引腳分配是否匹配。
一切正確後,請將程式上傳到研發板上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 |
//****************************************************************************** #include <Wire.h> #include <BM1383GLV.h> #include <BD1020.h> 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燈的顏色會變回綠色。
我希望您能喜歡這個項目!祝大家聖誕快樂,新年快樂!