1. 程式人生 > >第五章 LED的魔性操作

第五章 LED的魔性操作

mage ora clu delay 方法 大腦 特效 range nbsp

想必大家都見過城市裏漂亮的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號分別為紅色和綠色
void
init() { B_start(); } void repeat() { for(int i=0;i<=8;i++){ led.sw(i,red);//1號亮紅燈 delay(500); //亮0.5s } }

上面的兩個程序都是在別人封裝函數的基礎上進行的對led的操作,當你需要更高的特效時你就不能用這個函數,因為這個函數雖然幫助你快速的寫出了簡單特效,但是效率很低,我們學習機器人的目的不是為了學習怎麽使用別人寫好的東西,而是要學習機器人的原理和思維,所以下面我重點闡述如何才能做出更高級的、更有特效的的led燈的思維方法。

Led燈進一步學習

技術分享圖片

上面是

led燈的原理圖

大家都知道燈泡要同時連接正負極才能發光。圖中的DP1就可以看成發紅光的燈泡,DP2可以看成發綠光的燈泡,當D1(23)J2-1(39)同時輸電,DP1就會亮起來,當D1(23)J2-2(41)同時輸電,DP2就會亮起來,當DP1DP2同時亮起來時紅綠光加在一起就會變成橙光,這就是led的基本原理。

有的人可能會問那8個燈同時亮是怎麽實現的呢。其實8個燈同時亮是人眼的一種錯覺,舉個例子說明可能你更能理解,1號燈亮起來1s,熄滅,然後2號燈亮起1s,熄滅,再1號燈亮起來1s。。。不停,你可以看到1號燈亮再2號燈亮。然後我們把燈亮的時間減為1ms1號燈亮起來1ms,熄滅,然後2號燈亮起1ms,熄滅,再1號燈亮起來1ms。。。不停,1號燈亮lms2號燈亮起來了,但是在短時間內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的魔性操作