以下為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);
 }
}

測試影片(Test video)

三段變速_直流馬達 from 40423222 on Vimeo.