2015年1月12日 星期一

[專題] 第7組 - 光感計數器

專題簡報連結

專題內容報告



程式碼分為舊的部分與新的部分
內容的介紹將會在下方的影片中提及

舊的與新的之間的差異是在於,新的計數器在數到零後會再次順數回到預設的最大值;而舊的計數器不會

//程式碼內容(舊)

int photocellPin = 2; // 光敏電阻 (photocell) 接在 analog pin 2
int photocellVal = 0; // photocell variable

int totalnum = 300;

// 定義七段顯示器各節段與 Arduino 的腳位對應關係 
#define ASeg 3 
#define BSeg 4 
#define CSeg 5 
#define DSeg 6 
#define ESeg 7 
#define FSeg 8 
#define GSeg 9 

// 定義共陽極與 Arduino 的腳位對應關係 
#define CA1 10 
#define CA2 11 
#define CA3 12 
#define CA4 13 

#define LED 2

// 定義七個節段的腳位,將 A, B, C, D, E, F, G 依序放入陣列 
byte segs[7] = { ASeg, BSeg, CSeg, DSeg, ESeg, FSeg, GSeg }; 

// 定義共陽極七段顯示器的字型
byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 },  // = 0 
                                 { 1,0,0,1,1,1,1 },  // = 1 
                                 { 0,0,1,0,0,1,0 },  // = 2 
                                 { 0,0,0,0,1,1,0 },  // = 3 
                                 { 1,0,0,1,1,0,0 },  // = 4 
                                 { 0,1,0,0,1,0,0 },  // = 5 
                                 { 0,1,0,0,0,0,0 },  // = 6 
                                 { 0,0,0,1,1,1,1 },  // = 7 
                                 { 0,0,0,0,0,0,0 },  // = 8 
                                 { 0,0,0,0,1,0,0 }   // = 9 
                             };  

// 定義每個七段顯示器顯示的時間 (延遲時間), 預設 1ms  
int delay_time = 1; 
  
void setup() {
  Serial.begin(9600);
  pinMode(ASeg, OUTPUT); 
  pinMode(BSeg, OUTPUT); 
  pinMode(CSeg, OUTPUT); 
  pinMode(DSeg, OUTPUT); 
  pinMode(ESeg, OUTPUT); 
  pinMode(FSeg, OUTPUT); 
  pinMode(GSeg, OUTPUT); 
  pinMode(CA1, OUTPUT); 
  pinMode(CA2, OUTPUT); 
  pinMode(CA3, OUTPUT); 
  pinMode(CA4, OUTPUT); 
  pinMode(LED, OUTPUT);
}

void loop() {   
  // 讀取光敏電阻並輸出到 Serial Port
  photocellVal = analogRead(photocellPin);
  Serial.println(photocellVal); 
 
  for (unsigned int number = 0; number <= totalnum ; number++) {
    unsigned long startTime = millis(); 
    for (unsigned long elapsed=0; elapsed < (photocellVal*1.2); elapsed = millis() - startTime) { 
      Serial.println(photocellVal);
      int display_number=totalnum-number;
      photocellVal = analogRead(photocellPin);
      
      // 多工掃瞄,輪流點亮個、十、百、以及千位數的七段顯示器 
      // 顯示個位數 
      lightDigit1(display_number%10); 
      delay(delay_time); 

      // 顯示十位數 
      lightDigit2((display_number/10)%10); 
      delay(delay_time); 

      // 顯示百位數 
      lightDigit3((display_number/100)%10);             
      delay(delay_time); 

      // 顯示千位數 
      lightDigit4((display_number/1000)%10);  
      delay(delay_time);       
    }
  }
 while(1){
          digitalWrite(LED, HIGH);
          lightDigit1(0); 
          delay(delay_time); 

          lightDigit2(0); 
          delay(delay_time); 

          lightDigit3(0);             
          delay(delay_time); 

          lightDigit4(0);  
          delay(delay_time); 
      } 


} 

// 選擇顯示的位數 (4:千、3:百、2:十、或 1:個位數) 
void pickDigit(int x) { 
  digitalWrite(CA1, HIGH); 
  digitalWrite(CA2, HIGH); 
  digitalWrite(CA3, HIGH); 
  digitalWrite(CA4, HIGH); 

  switch(x) { 
    case 1: digitalWrite(CA1, LOW); break;
    case 2: digitalWrite(CA2, LOW); break; 
    case 3: digitalWrite(CA3, LOW); break;
    case 4: digitalWrite(CA4, LOW); break;     
  } 
} 

// 點亮個位數 
void lightDigit1(byte number) { 
  pickDigit(1);    
  lightSegments(number);   
} 

// 點亮十位數 
void lightDigit2(byte number) { 
  pickDigit(2); 
  lightSegments(number);   
} 

// 點亮百位數 
void lightDigit3(byte number) { 
  pickDigit(3); 
  lightSegments(number);   

} 

// 點亮千位數 
void lightDigit4(byte number) { 
  pickDigit(4); 
  lightSegments(number);   

} 

// 點亮七段顯示器 
void lightSegments(byte number) { 
  for (int i = 0; i < 7; i++) { 
    digitalWrite(segs[i], seven_seg_digits[number][i]); 
  } 
} 




操作演示概況



//程式碼(新)

int photocellPin = 2; // 光敏電阻 (photocell) 接在 analog pin 2
int photocellVal = 0; // photocell variable
int totalnum = 300;
int backtime=300;
int led=2;

// 定義七段顯示器各節段與 Arduino 的腳位對應關係 
#define ASeg 3 
#define BSeg 4 
#define CSeg 5 
#define DSeg 6 
#define ESeg 7 
#define FSeg 8 
#define GSeg 9 

// 定義共陽極與 Arduino 的腳位對應關係 
#define CA1 10 
#define CA2 11 
#define CA3 12 
#define CA4 13 


// 定義七個節段的腳位,將 A, B, C, D, E, F, G 依序放入陣列 
byte segs[7] = { ASeg, BSeg, CSeg, DSeg, ESeg, FSeg, GSeg }; 

// 定義共陽極七段顯示器的字型
byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 },  // = 0 
                                 { 1,0,0,1,1,1,1 },  // = 1 
                                 { 0,0,1,0,0,1,0 },  // = 2 
                                 { 0,0,0,0,1,1,0 },  // = 3 
                                 { 1,0,0,1,1,0,0 },  // = 4 
                                 { 0,1,0,0,1,0,0 },  // = 5 
                                 { 0,1,0,0,0,0,0 },  // = 6 
                                 { 0,0,0,1,1,1,1 },  // = 7 
                                 { 0,0,0,0,0,0,0 },  // = 8 
                                 { 0,0,0,0,1,0,0 }   // = 9 
                             };  

// 定義每個七段顯示器顯示的時間 (延遲時間), 預設 1ms  
int delay_time = 1; 
  
void setup() {
  Serial.begin(9600);
  pinMode(ASeg, OUTPUT); 
  pinMode(BSeg, OUTPUT); 
  pinMode(CSeg, OUTPUT); 
  pinMode(DSeg, OUTPUT); 
  pinMode(ESeg, OUTPUT); 
  pinMode(FSeg, OUTPUT); 
  pinMode(GSeg, OUTPUT); 
  pinMode(CA1, OUTPUT); 
  pinMode(CA2, OUTPUT); 
  pinMode(CA3, OUTPUT); 
  pinMode(CA4, OUTPUT); 
  pinMode(led, OUTPUT); 
}

void loop() {   
  // 讀取光敏電阻並輸出到 Serial Port
  photocellVal = analogRead(photocellPin);
  Serial.println(photocellVal); 
 
 
  for (unsigned int number = 0; number <= totalnum ; number++) {
    unsigned long startTime = millis(); 
    for (unsigned long elapsed=0; elapsed < (photocellVal*1.2); elapsed =millis() - startTime) { 
      Serial.println(photocellVal);
      int display_number=totalnum-number;
      photocellVal = analogRead(photocellPin);
      
      // 多工掃瞄,輪流點亮個、十、百、以及千位數的七段顯示器 
      // 顯示個位數 
      lightDigit1(display_number%10); 
      delay(delay_time); 

      // 顯示十位數 
      lightDigit2((display_number/10)%10); 
      delay(delay_time); 

      // 顯示百位數 
      lightDigit3((display_number/100)%10);             
      delay(delay_time); 

      // 顯示千位數 
      lightDigit4((display_number/1000)%10);  
      delay(delay_time);       
    }
  }
 digitalWrite(led, HIGH);
  for(unsigned int i = 0; i <= backtime; i++){
     unsigned long startTime = millis();
    for (unsigned long elapsed=0; elapsed < (photocellVal*1.2); elapsed = millis() - startTime) { 
      Serial.println(photocellVal);
      photocellVal = analogRead(photocellPin);
       
       lightDigit1(i%10); 
      delay(delay_time); 

      // 顯示十位數 
      lightDigit2((i/10)%10); 
      delay(delay_time); 

      // 顯示百位數 
      lightDigit3((i/100)%10);             
      delay(delay_time); 

      // 顯示千位數 
      lightDigit4((i/1000)%10);  
      delay(delay_time);       
    }
          
  }
digitalWrite(led, LOW);

} 

// 選擇顯示的位數 (4:千、3:百、2:十、或 1:個位數) 
void pickDigit(int x) { 
  digitalWrite(CA1, HIGH); 
  digitalWrite(CA2, HIGH); 
  digitalWrite(CA3, HIGH); 
  digitalWrite(CA4, HIGH); 

  switch(x) { 
    case 1: digitalWrite(CA1, LOW); break;
    case 2: digitalWrite(CA2, LOW); break; 
    case 3: digitalWrite(CA3, LOW); break;
    case 4: digitalWrite(CA4, LOW); break;     
  } 
} 

// 點亮個位數 
void lightDigit1(byte number) { 
  pickDigit(1);    
  lightSegments(number);   
} 

// 點亮十位數 
void lightDigit2(byte number) { 
  pickDigit(2); 
  lightSegments(number);   
} 

// 點亮百位數 
void lightDigit3(byte number) { 
  pickDigit(3); 
  lightSegments(number);   

} 

// 點亮千位數 
void lightDigit4(byte number) { 
  pickDigit(4); 
  lightSegments(number);   

} 

// 點亮七段顯示器 
void lightSegments(byte number) { 
  for (int i = 0; i < 7; i++) { 
    digitalWrite(segs[i], seven_seg_digits[number][i]); 
  } 
} 



操作演示概況


沒有留言:

張貼留言