2015年1月14日 星期三

[專題]第十組-紅外線障礙物偵測器

程式碼
PPT簡報

2015年1月13日 星期二

[專題] 第三組-音量檢測器

程式碼 PPT簡報 影片介紹:

在昨天的課堂中有一些地方說錯,在影片中已修正,造成大家理解上的誤會,深感抱歉.......(跪

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]); 
  } 
} 



操作演示概況


[專題] 第11組-照明燈&節能燈

節能照明燈程式碼如下
//demo
int photocellPin = 2; // 光敏電阻 (photocell) 接在 anallog pin 2
int photocellVal = 0; // photocell variable
int rphotocellVal = 0;
int ledPin1 = 9;

void setup() {
  pinMode(ledPin1, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  photocellVal = analogRead(photocellPin);
  Serial.println(photocellVal);  
  rphotocellVal = map(photocellVal, 0, 1023, 255, 0);
  analogWrite(ledPin1, rphotocellVal);
  delay(100);      
}




一般照明燈程式碼
//demo
int photocellPin = 2; // 光敏電阻 (photocell) 接在 anallog pin 2
int photocellVal = 0; // photocell variable
int minLight = 200;   // 最小光線門檻值
int MaxLight = 650;
int ledPin1 = 9;
int ledpin2 = 10;
int ledPin3 = 8;
int ledState = 0;
int brightness = 0;
int fadeAmount = 100;

void setup() {
  pinMode(ledPin1, OUTPUT);
  pinMode(ledpin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  // 讀取光敏電阻並輸出到 Serial Port
  photocellVal = analogRead(photocellPin);
  Serial.println(photocellVal);  
  // 光線不足時打開 LED
  if (photocellVal < minLight && ledState == 0) {
    digitalWrite(ledPin1, HIGH); // turn on LED
    digitalWrite(ledpin2, LOW);
    ledState = 1;
  }
  // 光線充足時關掉 LED
  if (photocellVal > minLight && ledState == 1) {
    digitalWrite(ledPin1, LOW); // turn off LED
    digitalWrite(ledpin2, HIGH);
    ledState = 0;
  } 
    if (photocellVal > MaxLight) {
      digitalWrite(ledPin3, HIGH);
       }
  delay(100);      
}









[專題] 第四組 - 自動避障車

程式碼

PPT簡報檔

[專題] 第一組- 機械手臂




ppt
 

 #include
 #define echoPin 7
 #define trigPin 8

char key = 0;
const unsigned int BAUD_RATE = 9600;

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;


int pos1  = 90;  //initial position of servo 1
int pos2  = 90;
int pos3  = 90;
int pos4  = 90;



const int maxDeg  = 180; 
const int minDeg  = 0;    
const int maxDeg1 = 180;
const int minDeg1 = 0;
const int maxDeg2 = 180;
const int minDeg2 = 0;
const int maxDeg3 = 180;
const int minDeg3 = 0;


const int leftPin1  = 52;
const int rightPin1 = 50;
const int leftPin2  = 48;
const int rightPin2 = 46;
const int leftPin3  = 44;
const int rightPin3 = 42;
const int leftPin4  = 40;
const int rightPin4 = 38;



const int outputPin1 = 6; // pwm function will be disabled on pin 9 and 10 if using servo
const int outputPin2 = 3;
const int outputPin3 = 4;
const int outputPin4 = 5;
const int outputPin5 = 2;


int leftPressed1  = 0;
int rightPressed1 = 0;
int leftPressed2  = 0;
int rightPressed2 = 0;
int leftPressed3  = 0;
int rightPressed3 = 0;
int leftPressed4  = 0;
int rightPressed4 = 0;

void setup() 
{ 
myservo1.attach(outputPin1);  // attaches the servo on pin 9 to the servo object 
myservo2.attach(outputPin2);
myservo3.attach(outputPin3);
myservo4.attach(outputPin4);
myservo5.attach(outputPin5);
myservo5.write(outputPin5);
Serial.begin(BAUD_RATE);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
} 

void loop() 
{ 
leftPressed1  = digitalRead(leftPin1);
rightPressed1 = digitalRead(rightPin1);
leftPressed2  = digitalRead(leftPin2);
rightPressed2 = digitalRead(rightPin2);
leftPressed3  = digitalRead(leftPin3);
rightPressed3 = digitalRead(rightPin3);
leftPressed4  = digitalRead(leftPin4);
rightPressed4 = digitalRead(rightPin4);
 
 if(leftPressed1){
  if(pos1 < maxDeg) 
   pos1 += 1;
   myservo1.write(pos1);              // tell servo to go to position in variable ‘pos’ 
  }

 
 if(rightPressed1){
  if(pos1 > minDeg) 
   pos1 -= 1;
   myservo1.write(pos1);              // tell servo to go to position in variable ‘pos’ 
  }
  
  
  if(leftPressed2){
  if(pos2 < maxDeg1)
   pos2 += 1;
   myservo2.write(pos2);              // tell servo to go to position in variable ‘pos’ 
  }

 
  if(rightPressed2){
  if(pos2 > minDeg1) 
   pos2 -= 1;
   myservo2.write(pos2);              // tell servo to go to position in variable ‘pos’ 
  }
  
  
  if(leftPressed3){
  if(pos3 < maxDeg2)
   pos3 += 1;
   myservo3.write(pos3);              // tell servo to go to position in variable ‘pos’ 
  }

 
  if(rightPressed3){
  if(pos3 > minDeg2) 
   pos3 -= 1;
   myservo3.write(pos3);              // tell servo to go to position in variable ‘pos’ 
  }
  
  
   if(leftPressed4){
  if(pos4 < maxDeg3)
   pos4 += 1;
   myservo4.write(pos4);              // tell servo to go to position in variable ‘pos’ 
  }

 
  if(rightPressed4){
  if(pos4 > minDeg3) 
   pos4 -= 1;
   myservo4.write(pos4);              // tell servo to go to position in variable ‘pos’ 
  }
  
  
   if(Serial.available()>0)
  {
      key = Serial.read();
      Serial.print("I received: ");
      Serial.println(key, DEC);

       if(key == byte(97))
     {
        Serial.print("Turning Motor 1 to 0 deg");
        myservo5.write(0);
     }
       else if(key==byte(115))
     {
        Serial.print("Turning Motor 1 to 180 deg");
        myservo5.write(180);
     }  
      delay(1000);
   }
      delay(15);                       // waits 15ms for the servo to reach the position 
      
      int distance, duration;
      digitalWrite(trigPin,HIGH); 
      delayMicroseconds(500);
      digitalWrite(trigPin,LOW);
      duration = pulseIn(echoPin,HIGH);
      distance = (duration/2)/29.1;
      Serial.print(distance);
      Serial.println("CM");
      
}

[專題] 第二組 - 盆栽守護神

[專題] 第六組 - 紅外線感測器-風扇系統

fileName.cpp

PPT

[專題] 第五組 - 水位感測器

[專題] 第八組 - 一閃一閃亮晶晶


2015年1月11日 星期日

[專題] 第九組 - 紅外線人體偵測吼叫裝置

故事是這麼開始的:
有一天,三名探險家乘著草球戰艦來到了台灣,他們聽說在台灣有個好吃的起士蛋糕,外面有三隻龍貓在守護起士蛋糕免被不懂其美妙滋味的傢伙浪費掉
當他們接近那隻龍貓時,龍貓竟然對著他們發出了龍吼?!