以下為Arduino Uno板的threeLevel_Motor實驗
需要材料:
Wire: n個
Button: 兩個
330Ω Resistor: 九個
10kΩ Resistor: 兩個
Potentiometer: 一個(不限電駔大小)
LED: 三個
IC 7447: 一個
H-Seven-segment display: 一個
Arduino Uno: 一個
Breadboard: 兩個
DC Motor: 一個
電路圖(Circuit diagram)
程式碼(Code)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | int potenPin = A4; / / 因為可變電阻輸出的是類比,所以要用A0~A5接收 int motorPin = 11 ; / / 對馬達的輸入 int buttonStop = 9 ; / / 停止馬達 int buttonLevel = 10 ; / / 啟動馬達轉速等級 const int NUM = 4 ; / / 要用到boolean[]內,要有const int pins[NUM] = { 5 , 6 , 7 , 8 }; / / 對應boolean的腳位,不用在[]內打內容??? const int motorLevel = 3 ; / / 馬達有的等級,要用到boolean[]內,要有const #define t true //true等於HIHG,另一種寫法 #define f false //false等於LOW,另一種寫法 boolean data[motorLevel][NUM] = { / / 有 3 種變化(代表數字 0 ~ 2 ),腳位有NUM個( 4 個輸出) {f, f, f, t}, / / 1 {t, f, f, f}, / / 2 {t, f, f, t}, / / 3 }; int ledCount = 3 ; / / 使用的LED數量 int ledPins[] { 2 , 3 , 4 }; / / 使用到的LED腳位 void setup() { Serial.begin( 9600 ); pinMode(potenPin, INPUT ); pinMode(buttonLevel, INPUT ); pinMode(buttonStop, INPUT ); for ( int i = 0 ; i < NUM; i + + ) { pinMode(pins[i],OUTPUT); } pinMode(motorPin,OUTPUT); for ( int thisLed = 0 ; thisLed < ledCount; thisLed + + ) { pinMode(ledPins[thisLed],OUTPUT); } } void sevenSeg( int n) { / / 用到的腳位,要輸出的腳位 / / n等於要輸出的種類 for ( int i = 0 ; i < NUM; i + + ) { digitalWrite(pins[i],data[n][i] = = t? HIGH : LOW); } } void loop() { int potenStates = analogRead(potenPin); Serial.println(potenStates); / / 可變電阻 if (potenStates < 300 ) { sevenSeg( 0 ); / / 要輸出的種類 } else if (potenStates < 600 ) { sevenSeg( 1 ); } else if ( 600 < potenStates) { sevenSeg( 2 ); } int level = digitalRead(buttonLevel); / / Serial.println(level); / / 按鈕:啟動變速 if (level = = HIGH) { int potenStates = analogRead(potenPin); / / Serial.println(potenStates); / / 可變電阻 / / 得出可變電阻的範圍 0 ~ 1023 ,跟有多少電阻值沒關西 if (potenStates < 300 ) { analogWrite(motorPin, 300 ); digitalWrite(ledPins[ 0 ],HIGH); digitalWrite(ledPins[ 1 ],LOW); digitalWrite(ledPins[ 2 ],LOW); } else if (potenStates < 600 ) { / / if 是一段一段的讀區,所以當potenStates小 300 時,這裡才不會也執行 / / 因為上方以先執行了,就不會在往下確認 analogWrite(motorPin, 600 ); digitalWrite(ledPins[ 1 ],HIGH); digitalWrite(ledPins[ 0 ],LOW); digitalWrite(ledPins[ 2 ],LOW); } else if ( 600 < potenStates) { / / 想要設定eles,就要在後方加上 if ,例如: else if (定義),不能直接 else (定義) analogWrite(motorPin, 900 ); digitalWrite(ledPins[ 2 ],HIGH); digitalWrite(ledPins[ 0 ],LOW); digitalWrite(ledPins[ 1 ],LOW); } } int bStop = digitalRead(buttonStop); if (bStop = = HIGH) { for ( int s = 0 ; s < ledCount; s + + ) { digitalWrite(ledPins[s],LOW); } digitalWrite(motorPin,LOW); } } |