Hi,大家好,這裡是萬能超,一個機械狗。本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。
最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。
最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。從arduino uno的各個引腳功能到各類元器件的使用方法視頻裡講的很清楚,我主要從三個小電路的控制來帶大家總結一下一些簡單的小函數。本次推送,主要是帶大家進行一個小小的入門,寫的相對粗略,具體的學習還是要靠大家自主學習,後面我將會帶大家開始一個個小項目的製作。
首先,拿出我珍藏已久的亂七八糟元器件和arduino開發板。
裡面有杜邦線、麵包板、小電阻、發光二極體、電位器、開關等。
當按左邊開關led亮度增加,右邊開關led亮度減小。
電路的連接如下圖:
代碼如下:
bool pushButton1; // 創建布爾型變量用來存儲按鍵開關1的電平狀態
bool pushButton2; // 創建布爾型變量用來存儲按鍵開關2的電平狀態
int ledPin = 9; //設置LED引腳號
int brightness = 127; //設計LED初始亮度參數
void setup() {
pinMode(2, INPUT_PULLUP); //將引腳2設置為輸入上拉模式
pinMode(8, INPUT_PULLUP); //將引腳8設置為輸入上拉模式
pinMode(ledPin, OUTPUT); //將LED引腳設置為輸出模式
Serial.begin(9600); //啟動串口通訊
}
void loop() {
// put your main code here, to run repeatedly:
pushButton1 = digitalRead(2); //讀取引腳2電平狀態並將其賦值給布爾變量
pushButton2 = digitalRead(8); //讀取引腳8電平狀態並將其賦值給布爾變量
if (!pushButton1 && brightness > 0){ // 當按下按鍵開關1並且LED亮度參數大於0
brightness--; // 減低LED亮度參數
//(brightness-- 相當於 brightness = brightness - 1;)
} else if (!pushButton2 && brightness < 255) { //當按下按鍵開關2並且LED亮度參數小於255
brightness++; //增加LED亮度參數
//(brightness++ 相當於 brightness = brightness + 1;)
}
analogWrite(ledPin, brightness); //模擬輸出控制LED亮度
Serial.println(brightness); //將LED亮度參數顯示在串口監視器上
delay(10);
}
除注釋外的代碼解析:
1、數據類型
首先開頭bool為定義布爾型變量,其全稱為boolean。Arduino開發板是基於C/C++程式語言。因此,具體的數據類型如下表:
2、pinMode函數
通過pinMode函數可以將引腳模式改為以下三種:
OUTPUT(輸出模式):當引腳設置為輸出(OUTPUT)模式時,引腳為低阻抗狀態。這意味著Arduino可以向其它電路元器件提供電流。也就是說,Arduino引腳在輸出(OUTPUT)模式下可以點亮LED或者驅動電機。
INPUT(輸入模式):當引腳設置為輸入(INPUT)模式時,引腳為高阻抗狀態(100兆歐)。此時該引腳可用於讀取傳感器信號或開關信號。
INPUT_PULLUP(輸入上拉模式):Arduino 微控制器自帶內部上拉電阻。如果你需要使用該內部上拉電阻,可以通過pinMode()將引腳設置為輸入上拉(INPUT_PULLUP)模式。
3、Serial串行通信
串行埠用於Arduino和電腦或其他設備進行通信。我們可以通過串口監視器來查看串口通信。
初學者常用的命令如下:
Serial.begin():設置電腦與Arduino進行串口通訊時的數據傳輸速率(每秒傳輸字節數)。
Serial.print():將每一數位以ASCII碼形式發送。
4、analogWrite()
將一個模擬數值寫進Arduino引腳。這個操作可以用來控制LED的亮度, 或者控制電機的轉速。該命令支持以下引腳: 3, 5, 6, 9, 10, 11。
5、if語句
接觸過編程的都會知道if語句的流程如下圖:
語句表達如下:
if(表達式) {
語句塊
}
其意義為:如果 「表達式」 的條件得到滿足則執行語句塊。否則Arduino將不執行該語句塊。
以上述代碼為例:
if (!pushButton1 && brightness > 0){ // 當按下按鍵開關1並且LED亮度參數大於0
brightness--; // 減低LED亮度參數
}
如果按下1並且led亮度大於0成立,那判斷為真,執行{}中的語句led亮度減小。
6、delay() 延遲
delay()函數可用於暫停程序運行。暫停時間可以由delay()函數的參數進行控制,單位是毫秒。
當電位器向右轉時,燈的亮度增加,電位器向左轉時,燈的亮度減小。
電路連接如下圖:
代碼如下:
void setup() {
Serial.begin(9600);
pinMode(9,OUTPUT);
}
void loop() {
int analogInputVal=analogRead(A0);//定義變量為A0引腳的值
Serial.println(analogInputVal);//串口監視器顯示該值
int brightness = map(analogInputVal,0,1023,0,255);//將電位器的數值等比映射到0-255led的亮度區間
analogWrite(9,brightness);//將亮度傳到led
}
除注釋外的代碼解析:
Map函數
map()可以用來將某一數值從一個區間等比映射到一個新的區間。
以上述代碼為例
int brightness = map(analogInputVal,0,1023,0,255);
analogInputVal為要映射的值;0,1023為映射前的最大最小值;0,255為映射後最大最小值。
按下右邊按鈕後,數碼管在隨後一段時間顯示一個隨機數。
電路接線如下:
代碼如下:
void setup() {
pinMode(2, INPUT_PULLUP);
Serial.begin(9600);
for (int i = 2; i <= 9; i++) {
pinMode(i, OUTPUT);//為每個需要的引腳設置為輸出模式
}
randomSeed(analogRead(A0));//設置為不同的隨機數種子
}
void loop() {
int myNumber;
if(!digitalRead(2)){
myNumber = getRandomNumber(0,10);//產生0-9隨機數字
}
displayNumber(myNumber);//顯示數字
}
int getRandomNumber(int minNumber, int maxNumber){
int randomNumber;
int i;
while(i<5){
i=i+1;
randomNumber=random(minNumber,maxNumber);
displayNumber(randomNumber);
delay(100);
displayClear();
delay(100);
Serial.print("i=");
Serial.println(i);
Serial.print("randomNumber=");
Serial.println(randomNumber);
Serial.println("");
}
return randomNumber;
}
void displayClear(){
// 清理顯示內容
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void displayNumber(int ledNumber){
switch(ledNumber){
case 1:
digitalWrite(4, HIGH);
digitalWrite(7, HIGH);
break;
case 2:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 3:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
break;
case 4:
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
break;
case 5:
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
break;
case 6:
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 7:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(7, HIGH);
break;
case 8:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
case 9:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
break;
case 0:
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
break;
default:
digitalWrite(5, HIGH);
}
}
除注釋外的代碼解析:
1、 for循環函數
同其他編程一樣,for循環的流程圖如下:
Arduino語句為:
for(表達式1; 表達式2; 表達式3){
語句塊
}
其執行過程為:
1) 先求解表達式1。
2) 求解表達式2,若其值為真(非0),則執行括號中的語句塊,否則將結束循環。
3) 每一次執行完語句塊,Arduino將求解表達式3。
4) 重複執行步驟 2) 和 3),直到循環結束。
以上述代碼為例:
for (int i = 2; i <= 9; i++) {
pinMode(i, OUTPUT);//為每個需要的引腳設置為輸出模式
}
解釋為定義i初始值為2,如果i小於等於9則將第i號引腳設置為輸出模式,在將i加1後循環判定。
1、 switch case語句
Arduino語句為:
switch (var) {
case 1:
//當var等於1時執行這裡的程序
break;
case 2:
//當var等於2時執行這裡的程序
break;
default:
// 如果var的值與以上case中的值都不匹配
// 則執行這裡的程序
break;
}
就像if語句,switch…case允許Arduino根據不同的條件運行不同的的程序代碼。switch語句通過對一個變量的值與case語句中指定的值進行比較。當一個case語句中的指定值與switch語句中的變量相匹配。就會運行這個case語句下的代碼。
2、 創建新函數
如果你想編一些複雜點的程序,實現一些更眩的功能,你會發現你的loop程序會寫得非常的長,有時候會搞不清楚具體的一個功能到底寫在哪行了。能不能將一個功能的實現寫在一個地方,如果要用的時候只要在loop主程序裡調用一下就可以了呢?答案當然是可以的,如果你已經學過了c語言等等,你或許已經知道如何來做了,那就是自定義函數。由於內容過多,我們將在以後講解。
到這裡,萬能超的arduino學習日記也完成了第一周的學習,我們對arduino的入門操作進行了回顧,以後我們將進行更加複雜深入以及和processing結合的學習,期待以後和大家的見面,如果有什麼疑問,可以加入我們的qq群478590904進行討論學習。
微信公眾號:processing與arduino
微信號:chen-mo_shi-jin