專題簡報連結
專題內容報告
程式碼分為舊的部分與新的部分
內容的介紹將會在下方的影片中提及
舊的與新的之間的差異是在於,新的計數器在數到零後會再次順數回到預設的最大值;而舊的計數器不會
//程式碼內容(舊)
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]);
}
}
操作演示概況