以下為Arduino Uno板的ThreeLevel_cdMotor實驗

需要材料:

Wire: n個
Button: 兩個
330Ω Resistor: 九個
10kΩ Resistor: 兩個
Potentiometer: 一個(不限電駔大小)
LED: 三個
IC 7447: 一個
H-Seven-segment display: 一個
DC Motor: 一個 Arduino Uno: 一個
Breadboard: 兩個

電路圖(Circuit diagram)

程式碼(Code)

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.