<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> Arduino >> 瀏覽文章

        Arduino與led燈

        作者:未知   來源:互聯網   點擊數:  更新時間:2014年07月31日   【字體:
        最近在學校里開設了一門Arduino課程,因為是高一學生,所以幾乎沒有什么基礎,不說編程,甚至基本的電路知識也沒有。所以基本整個學期就是讓他們接 觸一下Arduino,玩一下Arduino控制Led燈。為了方便學生學習,我打算將課程里的東西寫成博客,其實這也算最基礎的Arduino教程了 吧......
         首先如何安裝Arduino驅動,如何打開軟件等等都不談了。先來說寫入的第一段程序。
        這段程序來自與Arduino軟件例子里的Blink程序
        ————————————————————————————————————————————
        // Pin 13 has an LED connected on most Arduino boards.
        // give it a name:
        int led = 13;
         
        // the setup routine runs once when you press reset:
        void setup() {                
          // initialize the digital pin as an output.
          pinMode(led, OUTPUT);     
        }
         
        // the loop routine runs over and over again forever:
        void loop() {
          digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
          delay(1000);               // wait for a second
          digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
          delay(1000);               // wait for a second
        }
        ————————————————————————————————————————
        首先程序中的“//”后面跟的是注釋語言,并不會運行。“”中間的也是注釋語言,不會運行。所以上面程序其實真正運行的只有如下:
        ————————————————————————————————————————————
        int led = 13;
        =====================
        void setup() {                
           pinMode(led, OUTPUT);     
        }
        ========================
        void loop() {
          digitalWrite(led, HIGH);   
          delay(1000);              
          digitalWrite(led, LOW);    
          delay(1000);              
        }
        ————————————————————————————————————
        首先上面程序其實可以分成三部分(已經用========隔開)
        第一部分是變量定義部分,其實就是命名一些量,比如說
        int led = 13;
        意思就是命名一個量,這個量的名字叫“led”,它是一個“int”類型的量,“int”類型就是說明這是一個數字,并且是整數。然后這個名叫“led”的量它等于13。
        第二部分是初始化部分,“void setup() {  ...........}”,大括號中間的是需要初始化的語句。
         pinMode(led, OUTPUT);
        pinMode是Arduino的內置函數,就是說Arduino它認得pinMode。這句程序的意思就是讓led這個量所指的接口,其實這里就是13號數字輸出口,把這個端口設為OUTPUT,就是輸出端口。
        第三部分才是最重要的主要程序部分void loop() {.........},大括號中間的就是我們所要讓Arduino運行的程序,loop的意思就是大括號中的程序不停的重復執行,從頭執行到尾,然后再回到頭再執行一遍。
        下面來看看上面程序執行的是什么。
        digitalWrite(led, HIGH); 
        這句話光看字面意思就已經很明白了,就是“數字寫入”,讓led(其實就是代表13號數字端口)為“HIGH”,HIGH就是會使這個端口的電平達到5V左右。如果我們讓一個LED的一極接在13號端口,另一極接在GND(接地端),那么當led為HIGH時,這個led燈就會發光了。
          delay(1000);  
        這句簡單,就是休息1000毫秒(等待1秒)。
        再后面相信已經不用我解釋了,這樣最后程序寫入Arduino后,執行的結果就是一端接13號端口,一端接gnd的led燈會亮一秒然后再滅一秒然后再.......周而復始。
        看到這里,相信你已經可以用程序來控制一盞led燈的發光了,而且可以自己設定讓它如何發光,試試看吧.....
        ----------------------
        上次講了一下Arduino自帶例程序里的blink程序學習了下面幾個程序語句:
        int led = 13;
         pinMode(led, OUTPUT);
        digitalWrite(led, HIGH);
        delay(1000);

        只有輸出,沒有輸入,今天我們來學習一下輸入。
        最簡單的輸入當然是開關信號的輸入了,自帶程序中同樣有一個例子,第二項里的第2個button程序:
        ——————————————————————————————
        const int buttonPin = 2;    
        const int ledPin =  13;     
         
        int buttonState = 0;        
         
        void setup() {
           pinMode(ledPin, OUTPUT);      
           pinMode(buttonPin, INPUT);     
        }
         
        void loop(){
            buttonState = digitalRead(buttonPin);
         
           if (buttonState == HIGH) {     
              digitalWrite(ledPin, HIGH);  
          } 
          else {
              digitalWrite(ledPin, LOW); 
          }
        }
        ————————————————————————————————————————————————
        以上已經去掉了注釋語句。
        來看一下新出現的幾句程序:
        pinMode(buttonPin, INPUT); 
        這句相信不用解釋了,就是buttonPin這個端口(也就是2號端口)為輸入端口
         buttonState = digitalRead(buttonPin);
        這句意思也簡單,就是讀取buttonPin這個端口的電平,然后將結果賦值于buttonState(注意在程序中大小寫也是要嚴格區分的),如果buttonPin這個端口電平為高,則buttonState這個值為“HIGH”(或者說等于1),否則為“LOW”(或者說等于0)。
         if (buttonState == HIGH) {     
             digitalWrite(ledPin, HIGH);  
          } 
          else {
             digitalWrite(ledPin, LOW); 
          }
        if......else....語句為判斷語句,意思就是假如......否則......
        翻譯一下上述語句就是
        假如(buttonState等于"HIGH")
        就使ledPin端口位于高電平
        否則
        就是ledPin端口位于低電平
        看到這里,就就能讀懂這段程序的結果,那就是當你按下按鈕時,燈亮,斷開按鈕,燈滅,就這么簡單......
        下面在來說說這個接線問題

        當開關斷開是,2號端口與GND之間用一個電阻連接,這樣2號端口實際上是低電平,開關閉合時2號端口接到了5V,位于高電平。
         
        ------------------------------------------------------------------------------
         
         第三節  嘗試自己編程控制燈
        一、編程是不需要每個字都自己編寫,可以通過改變現有程序。例如這次我們來改寫例程中的Button程序來完成下面的任務。改寫之前可以先將程序中原有的注釋語句刪除。
        const int buttonPin = 2;    //2號端口命名為buttonPi ,“const”說明這個量為之后不變
        const int ledPin =  13;     //13號端口命名為ledPin
        int buttonState = 0;        //命名一個變量,它的初始值為0,這個量之后可以改變
        void setup() {
           pinMode(ledPin, OUTPUT);      //ledPin端口定義為輸出
           pinMode(buttonPin, INPUT);     //buttonPin端口定義為輸入
        }
        void loop(){
            buttonState = digitalRead(buttonPin);   //buttonState變量值等于buttonPin端的輸入
           if (buttonState == HIGH) {           //如果buttonState等于HIGH,即2端口接5V
              digitalWrite(ledPin, HIGH);       //使ledPin端口為5V
          
          else {                         // 否則
              digitalWrite(ledPin, LOW);      //使ledPin端口為接地。
             }
         
        二、            任務1,用一個開關來控制2Led燈,當開關彈起時,燈1亮,當開關按下時,燈2亮。
        思考:
        1、需要利用幾個端口,有哪些是輸出,哪些是輸入?
        2、這段程序中的判斷語句,if……else……語句該如何寫?
        3、思考線路該如何連
        4、編寫完后寫入Arduino,觀察運行結果。
        三、            任務2,用一個開關來控制一個Led燈,當開關按下時燈會閃爍三次后熄滅。
        思考:
        1、需要利用幾個端口,有哪些是輸出,哪些是輸入?
        2、判斷語句中,如果開關按下,接下去燈的閃爍改如何編寫。
        3、編寫完后寫入Arduino,觀察運行結果。
        四、            任務答案:
        1、任務一答案:
        const int buttonPin = 2;    //2號端口命名為buttonPi ,“const”說明這個量為之后不變
        const int ledPin1 =  12;     //12號端口命名為ledPin1
        const int ledPin2 =  13;     //13號端口命名為ledPin2
        int buttonState = 0;        //命名一個變量,它的初始值為0,這個量之后可以改變
        void setup() {
           pinMode(ledPin1, OUTPUT);      //ledPin1端口定義為輸出
           pinMode(ledPin2, OUTPUT);      //ledPin2端口定義為輸出
           pinMode(buttonPin, INPUT);     //buttonPin端口定義為輸入
        }
        void loop(){
            buttonState = digitalRead(buttonPin);   //buttonState變量值等于buttonPin端的輸入
           if (buttonState == HIGH) {           //如果buttonState等于HIGH,即2端口接5V
              digitalWrite(ledPin1, HIGH);       //使ledPin1端口為5V
        digitalWrite(ledPin2, LOW);       //使ledPin2端口為接地。
          
          else {                         // 否則
             digitalWrite(ledPin2, HIGH);       //使ledPin2端口為5V
             digitalWrite(ledPin1, LOW);      //使ledPin1端口為接地。
             }
        2、任務二答案
        const int buttonPin = 2;    //2號端口命名為buttonPi ,“const”說明這個量為之后不變
        const int ledPin =  13;     //13號端口命名為ledPin
        int buttonState = 0;        //命名一個變量,它的初始值為0,這個量之后可以改變
        void setup() {
           pinMode(ledPin, OUTPUT);      //ledPin端口定義為輸出
           pinMode(buttonPin, INPUT);     //buttonPin端口定義為輸入
        }
        void loop(){
            buttonState = digitalRead(buttonPin);   //buttonState變量值等于buttonPin端的輸入
           if (buttonState == HIGH) {           //如果buttonState等于HIGH,即2端口接5V
              digitalWrite(ledPin, HIGH);       //使ledPin端口為5V,第一次亮
           delay(500);                    //500毫秒
        digitalWrite(ledPin, LOW);      //使ledPin端口為接地。
        delay(500);                    //500毫秒
         digitalWrite(ledPin, HIGH);       //使ledPin端口為5V,第二次亮
           delay(500);                    //500毫秒
        digitalWrite(ledPin, LOW);      //使ledPin端口為接地。
        delay(500);                    //500毫秒
         digitalWrite(ledPin, HIGH);       //使ledPin端口為5V,第三次亮
           delay(500);                    //500毫秒
        digitalWrite(ledPin, LOW);      //使ledPin端口為接地。
        delay(500);                    //500毫秒
          
          else {                         // 否則
              digitalWrite(ledPin, LOW);      //使ledPin端口為接地。
         
             }
         
        -------------------------------------------------------------------------------------------------------
        第四節  Arduino一樣思考
        一、          像程序一樣思考
        有一個輕觸開關,一個led燈,如果要實現按下開關led燈亮,松開開關led燈滅,該如何實現?
        思考:
        1、輸入和輸出器材分別是什么,如何將這些器材的動作變成電的信號?
        2、逐步思考整個過程,包括任何細節部分。
        3、     該命名幾個量來記錄這些信號?
        4、     該如何編寫程序來實現這些功能?
        解答:
        輸入器材為輕觸式開關,此種開關有兩端,當按下時兩端連接,松開時兩端斷開。也就是開關能給出兩種信號,一種是斷開,一種是閉合。那么如何將斷開與閉合兩種狀態變成相應的電信號呢?如圖:
        2號端口來接受這個信號,當開關閉合時,2號端口直接與5V相連,然后又通過電阻與地相連,這是2號端口上的電壓為5V。當開關斷開是,2號端口只通過電阻與地相連,這時其上電壓為0V。通過這個電路就可以將開關的開與關信號轉變成2號端口上的0V與5V的電壓信號。(如果2號端口什么都沒接,則其上的電壓為不確定)
        這樣我們就把現實生活中開關的狀態轉變成了電信號。那么如何讓電信號去轉變為led燈的亮與滅呢?其實原理也是類似的,將led的正極(長的一端),接到13號端口,負極接到GND端,當13號端口上電壓為5V時,led燈就會發光,否則就滅。這樣就完成了電信號轉變為燈光亮與滅的過程。
        上幾節我們已經了解了Arduino程序的執行過程,那就是loop(){……}內的語句不停的循環執行,如果沒有delay()語句的話,每執行一遍大概在幾十微秒。所以接下去我們的思考就變成了:
        每遍程序執行時,當2號端口電壓為5V時,就使13號端口電壓為5V,2號端口電壓為0V時,就使13號端口電壓也為0V。那么接下去就可以進行程序的編寫了。
        該命名幾個量呢?其實只需要一個量來記錄2號端口的值就夠了。所以語句可以設計成:
        int buttonState = 0;        //命名一個變量,它的初始值為0,這個量之后可以改變
        void setup() {
           pinMode(13, OUTPUT);      //13端口定義為輸出
           pinMode(2, INPUT);     //2端口定義為輸入
        }
        void loop(){
            buttonState = digitalRead(2);   //buttonState變量值等于buttonPin端的輸入
           if (buttonState == HIGH) {           //如果buttonState等于HIGH,即2端口接5V
              digitalWrite(13, HIGH);       //使ledPin端口為5V
          
          else {                         // 否則
              digitalWrite(13, LOW);      //使ledPin端口為接地。
             }
        觀察上述語句與上節課所使用的語句的差別?
        有時候為了使程序更加簡介,修改更加方便,往往將程序中多次出現的值定義一個量來表示,例如:
        const int ledPin =  13; //命名一個量ledPin,其值為13.
        這樣接下去的程序中,就可以用ledPin來代替13了,這有什么好處呢?如果你想修改程序,讓12號端口來當作輸出端口,如果按照未定義前,你的找到程序中所有13的地方,都修改成12,但是如果你定義了ledPin,那么只需要將“const int ledPin =  13;”改成“const int ledPin =  12;”就可以了,而不用改動程序中的其他語句。
        二、          任務:
        一個輕觸開關,一個led燈,如果要實現第一次按下開關led燈亮,松開開關led燈不滅;第二次按下開關led燈滅,松開繼續滅;第三次按下開關led燈亮,松開繼續亮……該如何實現?
        思考:
        1、輸入量和輸出量有幾個?
        2、逐步逐步思考具體的實現過程。
        3、需要定義幾個量?
        4、具體程序如何?
        解答:
        輸入量和輸出量與上個任務相同,下面來逐步思考整個過程:
        開始時燈是滅的,開關沒有按下;然后按下開關,開關的狀態從開到關,燈從滅到亮;然后斷開開關,開關狀態從關到開,燈的狀態不變,繼續亮;接下去再按下開關,開關狀態沖從開到關,燈從亮到滅;最后松開開關,開關狀態從關到開,燈的狀態不變……
        每次燈的狀態改變發生在開關按下,即從開到關改變瞬間。那么怎么樣解釋“改變”呢?改變的意思是事物產生顯著的差別。用程序的思考改變就是現在的狀態與過去的狀態不同,也就是說必須要有一個量來記錄過去的狀態,還有一個量來記錄現在的狀態,注意,這里所謂的過去和現在都是針對某一遍程序執行來說的。當記錄現在的量和記錄過去的量不同時,即是發生改變的時刻。
        當然,開關狀態的改變瞬間找到后,還需要關注燈的狀態,因為每次開關改變的瞬間都要改變燈的狀態,如果亮就要變滅,如果滅就要變量,這樣就必須還得定義一個量來記錄燈的狀態。
        下面我們將上述過程像程序一樣來進行思考:
        先命名一個變量bts來記錄開關現在的狀態,當開關閉合時,bts=1;當開關斷開是,bts=0;然后再命名一個變量btsb來記錄開關過去的狀態。然后再命名一個變量leds來記錄燈的狀態,如果leds=1就是燈亮,否則就是滅。
        然后開始思考loop()程序每次循環需要執行的語句。
        首先btsb、bts、leds都等于0。然后當開關閉合一瞬間,bts就會等于1,這時bts就不等于了btsb,那么用if()語句來找到這個瞬間,if(bts!=btsb),就執行改變燈亮滅的程序;然后再將此刻的開關狀態變成過去的開關狀態,也就是btsb=bts;這樣下一遍執行時開關狀態就應該是現在的狀態。但是開關斷開的一瞬間其實也會出現bts!=btsb,這時我們就不需要執行改變燈的程序了,不過記錄開關過去狀態的btsb還是需要改變。那么改變燈亮滅的程序該怎么寫呢?其實很簡單,那就是如果leds=0;就把燈變亮,然后再使leds=1,因為下遍執行時燈的狀態其實已經是亮了。如果leds=1;就把燈變滅,然后再使leds=0;下面是具體的程序:
        int buttonPin = 2;    
        int ledPin =  12;   
        int bts = 0;       
        int btsb=0;
        int leds=0;
        void setup() {
           pinMode(ledPin, OUTPUT);     
           pinMode(buttonPin, INPUT);    
        }
        void loop(){
           bts = digitalRead(buttonPin);    //bts等于此刻開關的狀態
            //假如開關此刻的狀態不等于過去的狀態,并且此刻開關為閉合時,執行下面語句
          if (bts !=btsb&&bts==1) {  //&&為并且的意思,就是bts!=btsbbts=1兩個同時滿足
             if(leds==0)   //假如燈的狀態為滅,用leds的值來記錄燈的亮和滅
             {digitalWrite(ledPin, HIGH);        //將燈變亮
              leds=1;   }                  //讓記錄燈狀態的leds=1,即燈已經亮了
             else            //否則,如果燈的狀態為亮
             {   digitalWrite(ledPin, LOW);     //將燈變滅
             leds=0;  }               //讓記錄燈的狀態的leds=0,即燈已經滅了
             btsb=bts;              //最后讓btsb燈過去的狀態值等于現在的狀態值,即現
                                //在馬上就要變成過去了。
        //假如開關此刻的狀態不等于過去的狀態,并且此刻開關為斷開時,執行下面語句
          if (bts !=btsb&&bts==0) {   
            btsb=bts;              //只執行燈過去狀態記錄量btsb的改變。
          }  }
         
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮