萬能超的arduino學習日記(一)

2021-01-13 processing與arduino

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

相關焦點

  • 數碼管與ARDUINO 開發板的連接使用
    數碼管模塊與arduino連接示意圖接線說明:數碼管的VCC –arduino上的5V數碼管的GND -- arduino上的GND數碼管的DS -- arduino上的A0數碼管的ST_CP -- arduino上的A1數碼管的SH_CP -- arduino上的A2
  • 一文看懂arduino驅動uln2003操作步進電機的方法
    打開APP 一文看懂arduino驅動uln2003操作步進電機的方法 發表於 2018-05-30 09:34:32   arduino驅動uln2003操作步進電機的方法   1、網上買的步進電機,很多接線順序都不對。
  • arduino從零開始(4)PWM與呼吸燈
    在arduino中,我們常用PWM來驅動LED的暗亮程度,電機的轉速等。我們知道,在數字電路中,電壓信號是離散的: 不是 0(0V)  就是 1(5V或者3.3V), 那麼如何輸出介於 0v 和  5V之間的某個電壓值呢?簡單來說就是在一個周期內讓電壓在0V與5V之間快速切換,根據5V的佔比便可以模擬出0v到5v之間的不同電壓。
  • [新課推薦]人工智慧科普活動資源包配套課程Micro:bit+ Arduino...
    為幫助廣大活動特色單位科技教師更好地學習資源包內課程,並使用資源包開展活動,中國科協青少年科技中心與中國青少年科技輔導員協會推出了兩門配套課程《人工智慧科普活動資源包配套課程-Micro:bit 課程》與《人工智慧科普活動資源包配套課程-Arduino 課程》。
  • Arduino使用光敏電阻實驗
    打開APP Arduino使用光敏電阻實驗 發表於 2018-01-24 17:18:02 Arduino是一款便捷靈活
  • 十個中文例程教會你輕鬆上手製作Arduino智能小車
    Arduino簡介本文引用地址:http://www.eepw.com.cn/article/201706/348117.htmArduino 是一款便捷靈活、方便上手的開源電子原型平臺,包含硬體(各種型號的arduino板)和軟體(arduino IDE)。
  • 智能家居控制-arduino紅外遙控控制燈
    上一篇文章介紹了 arduino接受智能家具系統中的紅外遙控的解碼在此基礎上,今天就做一個遙控器控制的燈,我們可以將燈換成繼電器,這樣的話就實現了,用紅外遙控機,控制家裡的電器開關,比如燈,電視,插座,洗衣機等接線圖幾原理圖如上,一個板子一個紅外接收器,一個燈(可以換成你想控制的任何設備
  • 如何使用Qt為arduino製作圖形界面
    如何使用Qt為arduino製作圖形界面 網絡整理 發表於 2019-11-13 11:11:39 步驟1:安裝Qt
  • 大牛輕鬆帶你玩轉Arduino智能硬體六-arduino入門:LED流水燈
    (六)arduino入門:LED流水燈    一、本節介紹  在本課中,您將進行一個簡單但有趣的實驗 - 使用LED來創建流動的LED燈。
  • 用Arduino讀取霍爾流量傳感器的脈衝數
    安裝好開發環境,接好線,選擇好通道,點亮板子,連接霍爾流量傳感器至arduino板子,黃線接pin 2.紅色接5V,黑色接GND.把霍爾流量傳感器接在管路上接好小水泵都接好之後,打開水泵開關,水流流過,監視窗口就會顯示脈衝數,每秒鐘更新一次。
  • Arduino教程┃模擬土壤溼度傳感器的介紹
    Arduino學習:認識模擬土壤溼度傳感器一、傳感器簡介本模塊可以實現土壤溼度的檢測,土壤溼度指的是土壤的含水量,能直接影響到作物的水分供應狀況。寬x高) ;2.工作電壓3.3V-5V;3.設有固定螺栓孔,方便安裝;4、靈敏度調節電位器:模塊中藍色的電位器是用於土壤溼度的閥值調節,順時針調節,控制的溼度會越大,逆時針越小;通過電位器調節土壤溼度控制閥值,溼度低於設定值時,DO輸出高電平,高於設定值時,DO輸出低電平;可以實現自動對菜園,花園自動澆水,家庭花盆土壤溼度的控制,各種電子比賽,電子積木,arduino
  • LabVIEW+Arduino之四位數碼管顯示
    charScan[] = {0x08, 0x04, 0x02, 0x01}; //位選所對應的掃描碼,對應從pin11掃描到pin8;voidsetup() {DDRB =0xff; // 設置 PORTB為輸出,對應arduino
  • 敢碰就報警的Arduino Yún系統
    打開瀏覽器,輸入http://arduino.local,然後即能看到Arduino網頁界面了。如果一切操作正常,打開SSH會話。$ sshroot@arduino.local默認密碼是:「arduino」。
  • 攝影學習日記,單反白平衡模式的設置技巧
    各位讀者朋友們大家好,我是攝影學習日記,從今天開始讓我們從一起來學習單反攝影,讓我們一起來見證我們攝影學習進步的一點一滴,從一個菜鳥到大神的過程。單反拍攝還有一個重要的屬性,那就是白平衡模式,今天就讓我們來迅速掌握白平衡模式的設置技巧。
  • 人類日記簡史
    誰知道太史一家人都是硬骨頭,最小的弟弟把頭一梗:我們做史官的就是要如實記載,你殺了我我還是寫你弒君,而且這事你也掩蓋不住,早晚成為千古笑柄。崔杼想想似乎是這麼個道理,於是無奈之下只好放人。這最小的弟弟一出門遇到另一位史官南史氏,趕忙打招呼:您怎麼來了?
  • 第二屆「紅色日記徵文大賽」徵集扶貧日記
    [脫貧攻堅 決戰決勝]第二屆「體育彩票•紅色日記徵文大賽」徵集「扶貧日記」【何媒通訊社】2020年是全面建成小康社會目標實現之年,是脫貧攻堅收官之年。舉全國之力,打贏脫貧攻堅戰,是今年工作的重中之重。在這場千軍萬馬共同參與的大戰役中,許多幹部走出機關,走向基層,進村入戶,調研幫扶,記寫日記(筆記)。
  • 這才是中國最真實的抗疫日記 |《查醫生援鄂日記》英文版開啟全球...
    這才是中國最真實的抗疫日記 |《查醫生援鄂日記》英文版開啟全球預售 2020-07-03 03:02 來源:澎湃新聞·澎湃號·政務
  • 《雷鋒日記》:穿越「時光隧道」的青春印記
    雷鋒遺留下來的日記從嚴格意義上講,並不完全是日記體裁。 雷鋒參軍前的3本日記本中只記了少許日記,其餘多數是他學政治、學文化、學技術的筆記。參軍後的5本日記本,也是日記和學習筆記混寫在一起的。如果是寫日記,雷鋒便在上面標明年月日;如果是筆記,一般沒有年月日。正因為雷鋒日記的這種特點,所以在以後準備正式發表、出版時,便有一個篩選、整理的過程。
  • 節氣日記每天寫,篇篇都是形容詞,語文老師教你用創新角度寫日記
    雖然有的語文老師,在每個節假日、節氣都會布置寫景、寫感受的日記,但出發點是好的,只是形式需要變換一下。讓小學生的日記內容,都被大雪、立冬、天氣真冷啊所佔據,老師們收到的可能就是千篇一律的美詞美句摘抄了。針對目前小學生寫天氣作文、日記的問題,我給大家上了一堂作文課。
  • Arduino在嵌入式開發中應用案例之arduino點亮LED
    Arduino是一款便捷靈活、方便上手的開源電子原型平臺。     包含硬體(各種型號的Arduino板)和軟體(Arduino IDE)。由一個歐洲開發團隊於2005年冬季開發。     本分享一個通過arduino點亮LED的案例。