2018年1月28日 星期日

Arduino (10) 紅外線收發器+4位元七段LED顯示器。



4位元七段LED顯示器

就是1位元的顯示器結合4個。

市面上有賣一種整合上TM1637晶片的模組,接線上會比較方便。

下圖是顯示器的接腳定義。




其實我這篇本來是沒有紅外線收發的,只是覺得單單跑數字這樣有點單調,

後來多結合了紅外線控制數字變化。

所以紅外線介紹可以看第(11)篇。






影片中大概就是,

按"CH-":4位元顯示器同時跑0~9。

按"CH":自己發明的規則跑數字。




程式如下:

#include <IRremote.h>
#include <LedControl.h>
const int irReceiverPin = A0;
IRrecv irrecv(irReceiverPin);
decode_results results; 
const byte port[4] = {13, 12, 9, 8};
const byte led[8] = {5, 7, 4, 11, 10, 3, 6, 2};

#define H 1
#define L 0
const boolean data[10][8] = {
{H,H,H,H,H,H,L,L},//0
{L,H,H,L,L,L,L,L},//1
{H,H,L,H,H,L,H,L},//2
{H,H,H,H,L,L,H,L},//3
{L,H,H,L,L,H,H,L},//4
{H,L,H,H,L,H,H,L},//5
{H,L,H,H,H,H,H,L},//6
{H,H,H,L,L,L,L,L},//7
{H,H,H,H,H,H,H,L},//8
{H,H,H,H,L,H,H,L},//9
};
//宣告0~9亮燈方式。

void LED1(int N)
{
  for(int j=0;j<=6;j++){
   digitalWrite(led[j],data[N][j]);
  }
}
//使LED作動的函式。


void setup()
{
 for(int i=0;i<7;i++){
   pinMode(led[i],OUTPUT);
 } 
  for(int i=0;i<4;i++){
   pinMode(port[i],OUTPUT);
}
 digitalWrite(port[0],HIGH);
 digitalWrite(port[1],HIGH);
 digitalWrite(port[2],HIGH);
 digitalWrite(port[3],HIGH);
 Serial.begin(9600);
 irrecv.enableIRIn();
}
void loop(){
   if (irrecv.decode(&results)){ 
            Serial.print("Protocol: ");   
            switch(results.decode_type) {
        case NEC:
          Serial.print("NEC");
          break;
        case SONY:
          Serial.print("SONY");
          break;
        case RC5:
          Serial.print("RC5");
          break;
        case RC6:
          Serial.print("RC6");
          break;
        default:
          Serial.print("Unknown encoding");  
    }  
//確認Protocol。

  if (results.value == 16753245) { 
     for(int k=0;k<=9;k++){
       delay(500);
       LED1(k);
         } 
       delay(1000);
     }  
//按"CH-":4位元顯示器同時跑0~9。


  if (results.value == 16736925){
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],LOW);
       digitalWrite(port[2],LOW);
       digitalWrite(port[3],LOW);
       delay(100);
       LED1(k);}
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],HIGH);
       digitalWrite(port[2],LOW);
       digitalWrite(port[3],LOW);
       delay(300);
       LED1(k);}
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],HIGH);
       digitalWrite(port[2],HIGH);
       digitalWrite(port[3],LOW);
       delay(900);
       LED1(k);}
     for(int k=1;k<=10;k++){
       digitalWrite(port[0],HIGH);
       digitalWrite(port[1],HIGH);
       digitalWrite(port[2],HIGH);
       digitalWrite(port[3],HIGH);
       delay(1200);
       LED1(k);
        }
      }
    //按"CH":自己發明的規則跑數字。

    Serial.print("  irCode: ");            
    Serial.print(results.value); 
    Serial.print(",  bits: ");           
    Serial.println(results.bits);  
    delay(500);
    irrecv.resume();    
   }
}

紅外線的程式說明可以參考第11篇喔。

沒有留言:

張貼留言

8051 (6) 紅外線避障模組控制LED七段顯示器。

這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數, 到第5次時會讓紅色LED燈發光。 程式如下: #include <reg52.h> unsigned char seg[5]={0xf9,...