第五章 LED的魔性操作
想必大家都見過城市裏漂亮的led廣告牌吧,這一節我將帶大家學習這些LED廣告牌最基本的實現原理。
初識LED
接線方法:D1~D8從接23~37號數字端口,v1和前面的針頭分別接41號和39號數字端口,v2接負極。
#include <LNDZ.h> twled led(23,39,41);//定義led燈端口從23號開始,39號和41號分別為紅色和綠色 void init() { B_start(); led.sw(1,red);//1號亮紅燈 delay(500); //亮0.5s led.sw(1,0); //1號紅燈熄滅 led.sw(2,green); delay(500); led.sw(2,0); led.sw(3,orange); delay(500); led.sw(3,0); } void repeat() { }
上傳代碼運行起來的效果是1號燈亮紅燈0.5s,熄滅後,2號燈亮綠燈0.5s,熄滅後,3號燈亮黃燈0.5s。如果沒有這種效果要麽就是沒插穩,要麽就是接線錯誤。
在成功運行前面的程序後,大家應該對led燈有所了解,那麽下面我來教大家寫一下從頭亮到尾的走馬燈效果。
#include <LNDZ.h> twled led(23,39,41);//定義led燈端口從23號開始,39號和41號分別為紅色和綠色 voidinit() { B_start(); } void repeat() { for(int i=0;i<=8;i++){ led.sw(i,red);//1號亮紅燈 delay(500); //亮0.5s } }
上面的兩個程序都是在別人封裝函數的基礎上進行的對led的操作,當你需要更高的特效時你就不能用這個函數,因為這個函數雖然幫助你快速的寫出了簡單特效,但是效率很低,我們學習機器人的目的不是為了學習怎麽使用別人寫好的東西,而是要學習機器人的原理和思維,所以下面我重點闡述如何才能做出更高級的、更有特效的的led燈的思維方法。
Led燈進一步學習
上面是
大家都知道燈泡要同時連接正負極才能發光。圖中的DP1就可以看成發紅光的燈泡,DP2可以看成發綠光的燈泡,當D1(23)和J2-1(39)同時輸電,DP1就會亮起來,當D1(23)和J2-2(41)同時輸電,DP2就會亮起來,當DP1和DP2同時亮起來時紅綠光加在一起就會變成橙光,這就是led的基本原理。
有的人可能會問那8個燈同時亮是怎麽實現的呢。其實8個燈同時亮是人眼的一種錯覺,舉個例子說明可能你更能理解,1號燈亮起來1s,熄滅,然後2號燈亮起1s,熄滅,再1號燈亮起來1s。。。不停,你可以看到1號燈亮再2號燈亮。然後我們把燈亮的時間減為1ms,1號燈亮起來1ms,熄滅,然後2號燈亮起1ms,熄滅,再1號燈亮起來1ms。。。不停,1號燈亮lms,2號燈亮起來了,但是在短時間內1號燈的殘影還在大腦中,殘影消失之前再亮起1號燈就達到了人眼看起來1號和2號燈同時亮的狀態。同理8個燈同時亮你只需要交替八個燈每個亮1ms,不停切換就可以了,這就是程序的神奇之處。
三色齊亮的效果
#include <LNDZ.h> int i; void init() { B_start(); } void repeat() { for(i=23;i<=27;i=i+2) { DO(i);DW(i,1);//向i號端口輸入1(1就是輸電,0就是不輸電) if(i==23) { DO(39);DW(39,1); //向39號端口輸入1, DO(41);DW(41,0); //向41號端口輸入0,i號紅燈亮起 delay(1); } if(i==25) { DO(39);DW(39,0); //向39號端口輸入0 DO(41);DW(41,1); //向41號端口輸入1,i號綠燈亮起 delay(1); }if(i==27) { DO(39);DW(39,1); //向39號端口輸入1, DO(41);DW(41,1); //向39號端口輸入1, i號黃燈亮起 delay(1); } DO(i);DW(i,0); } }
LED燈動畫特效
下面是我寫的兩個酷炫led燈動畫特效。
實例1:
#include <LNDZ.h> int t = 23, i = 23; void init() { B_start(); } void repeat() { //逐個慢亮 for (i = 23; i < 39; i++, i++) { DO(i); DW(i, true); green_(); delay(100); } while (true) { for (t = 23; t < 39; t += 2) for (int l = 0; l < 10; l++) { for (i = 23; i < 39; i += 2) { DO(i); DW(i, true); if (i <= t) orange_(); else green_(); delay(1); DO(i); DW(i, false); } } for (t = 23; t < 39; t += 2) for (int l = 0; l < 10; l++) { for (i = 23; i < 39; i += 2) { DO(i); DW(i, true); if (i <= t) red_(); else orange_(); delay(1); DO(i); DW(i, false); } } for (t = 23; t < 39; t += 2) for (int l = 0; l < 10; l++) { for (i = 23; i < 39; i += 2) { DO(i); DW(i, true); if (i <= t) green_(); else red_(); delay(1); DO(i); DW(i, false); } } } } void red_() { DO(39); DW(39, true); DO(41); DW(41, false); } void green_() { DO(39); DW(39, false); DO(41); DW(41, true); } void orange_() { DO(39); DW(39, true); DO(41); DW(41, true); }
實例2:
#include <LNDZ.h> //對代碼進行宏,增加代碼可讀性 #define Red(); DO(39); DW(39, true); DO(41); DW(41, false); #define Green(); DO(39); DW(39, false);DO(41); DW(41, true); #define Orange(); DO(39); DW(39, true); DO(41); DW(41, true); //輸入端在指定在x端口輸電,但是在實際使用中必須放在燈顏色控制宏之後,目的是為了關閉前面那個燈執行完效果後關閉顯示。 #define InPut(x); DO(x); DW(x, true);delay(1);DO(x); DW(x, false); long long d; void init() { B_start(); } void repeat() { int t; for (t = 0; t <= 8; t++)//8個燈每個燈都實現動畫 for (int j = 23; j <= (37 - t * 2); j += 2) {//過渡效果 d = millis(); while ((millis() - d) <= 50) {//控制每一幀的時間 Green(); InPut(j); for (int i = 37; i > (37 - t * 2); i--, i--) {Green();InPut(i);}//計算每一幀的效果 } } d = millis(); while((millis() - d) <= 300){ for(int i=23;i<39;i+=2){Green(); InPut(i);} } for (t = 7; t >= 0; t--) for (int j = 23 + t * 2; j < 39; j += 2) { d = millis(); while ((millis() - d) <= 50) { Green(); InPut(j); for (int i = 23; i < (23 + t * 2); i+=2) {Green();InPut(i);} } } //delay(300); /*======================================================================================*/ for (t = 0; t <= 8; t++) for (int j = 23; j <= (37 - t * 2); j += 2) { d = millis(); while ((millis() - d) <= 50) { Red(); InPut(j); for (int i = 37; i > (37 - t * 2); i--, i--) {Red();InPut(i);} } } d = millis(); while((millis() - d) <= 300){ for(int i=23;i<39;i+=2){Red(); InPut(i);} } for (t = 7; t >= 0; t--) for (int j = 23 + t * 2; j < 39; j += 2) { d = millis(); while ((millis() - d) <= 50) { Red(); InPut(j); for (int i = 23; i < (23 + t * 2); i+=2) {Red();InPut(i);} } } //delay(300); /*======================================================================================*/ for (t = 0; t <= 8; t++) for (int j = 23; j <= (37 - t * 2); j += 2) { d = millis(); while ((millis() - d) <= 50) { Orange(); InPut(j); for (int i = 37; i > (37 - t * 2); i--, i--) {Orange();InPut(i);} } } d = millis(); while((millis() - d) <= 300){ for(int i=23;i<39;i+=2){Orange(); InPut(i);} } for (t = 7; t >= 0; t--) for (int j = 23 + t * 2; j < 39; j += 2) { d = millis(); while ((millis() - d) <= 50) { Orange(); InPut(j); for (int i = 23; i < (23 + t * 2); i+=2) {Orange();InPut(i);} } } //delay(300); }
第五章 LED的魔性操作