天天看點

第一課:超級hello Arduino.使用多種知識串聯一個入門小項目,很适合初學第一課喲.前言實驗内容實驗說明廢話不多說,直接上代碼關鍵代碼說明下課~

開關+led+旋鈕電位器的實驗視訊

第一課:超級hello Arduino.使用多種知識串聯一個入門小項目,很适合初學第一課喲.前言實驗内容實驗說明廢話不多說,直接上代碼關鍵代碼說明下課~

已經購買Arduino開發版的同學,開始上課~來一場緊張刺激的hello Arduino之旅吧~

前言

開發工具的下載下傳,安裝,使用都很簡單,我這裡就不贅述了,附上官方的說明,跟着步驟來,十分鐘搞定~

相關連接配接

  • ide下載下傳:https://www.arduino.cn/thread-5838-1-1.html
  • 官方hello world:https://www.arduino.cn/thread-76154-1-1.html
  • 為什麼成為Arduino開發?https://www.arduino.cn/thread-5414-1-1.html
  • 函數參考文檔:https://wiki.arduino.cn/?file=home-%E9%A6%96%E9%A1%B5

實驗内容

  • 通過開關,來控制整體的通電功能
  • 通過旋鈕電位器實作燈的亮度
  • 開關燈的時候,使用呼吸的方式
  • 開關燈的時候,根據旋鈕電位器目前的位置來決定最高亮度
  • 異步做開關監聽
  • 開燈關燈無異常
    • 目前還有小問題,關燈的時候無法完全關閉,會有低電荷在led燈裡面,有細微亮點.

實驗說明

開關

本實驗中,對開關沒有使用電阻,而是采用的高拉電阻的方式.通過這種方式,并且采用死循環卡點方式,實作類似于監聽開關按鈕的能力.

普通電阻功能: 當開關不按下去的時候,開關處于低電荷情況,按下去時,處于高電荷.

不帶電阻功能: 開關不管是否按下去,都處于不穩定電荷狀态.

高拉電阻功能: 開關不按下去,開關穩定處于高電荷位,按下去後,使之變為高電荷位.

led燈

末尾白色led燈為rgb三色燈,放在4号引腳,4号引腳沒有pwm功能,不支援呼吸.黃色5号引腳,紅色9号引腳,綠色10号引腳.

提供PWM功能的引腳為3、5、6、9、10、11。 亮度取值範圍0~255

白色燈自由閃爍,不做特殊處理,黃色,紅色,綠色燈使用pwm功能,讓亮度産生一個漸變過程,進而達到類似于呼吸的功能.

旋鈕電位器

通過讀取旋鈕電位器的阻值,通過比例轉換為亮度.然後對led燈做修改亮度操作,達到旋鈕控制亮度的功能.

Arduino 模拟輸入功能有10位精度,即可以将0~5V的電壓信号轉換為0~1023的整數形式表示。

廢話不多說,直接上代碼

/*
 * 開關控制燈 開和關
 * 
 * 通過旋鈕電位器來控制燈的亮度.
 * 
 * 通過呼吸的方式将燈緩慢開啟 和 緩慢關閉.
 * 
 */

// 設定各引腳别名
const int buttonPin = 2;     // 連接配接按鍵的引腳
const int ledPin[3] = {6,9,10};      // 連接配接LED 具有 PWM功能的引腳 
const int ledPin2 = 4;  // 白色rgb三色閃爍led

const int pot=A0;   //旋鈕電位器引腳

int fadeValueMax = 255;  //最大亮度

// 變量定義
//int buttonState = 0;         // 存儲按鍵狀态的變量

boolean ledState=false;  // 記錄LED狀态
boolean buttonState=true;  // 記錄按鍵狀态


/**
 * 程式執行之前都會先執行該方法
 */
void setup() {
  // 初始化LED引腳為輸出狀态
  for(int i=0; i<3; i++){
    pinMode(ledPin[i], OUTPUT);   
  }
  pinMode(ledPin2, OUTPUT);

  // 監聽9600 序列槽
  Serial.begin(9600);
  // 初始化按鍵引腳為輸入狀态
  pinMode(buttonPin, INPUT_PULLUP);     
}

/**
 * 程式會一直循環的調用該方法
 */
void loop(){

  //按照比例計算目前的最大亮度
  fadeValueMax = analogRead(pot)/4;

  //如果目前按鈕處于高電荷狀态,就一直循環該方法,實作類似于監聽功能
  while(digitalRead(buttonPin)==HIGH){

    if(ledState){
      //如果目前led處于開啟狀态,讓旋鈕電位器控制led的亮度
      int fadeValue = analogRead(pot)/4;
      analogWrite(ledPin[0], fadeValue);
      analogWrite(ledPin[1], fadeValue);
      analogWrite(ledPin[2], fadeValue);
      Serial.println(fadeValue);

      //稍稍停一下,防止太快發生意想不到的問題
      delay(50);
    }
    
  
  }

  // 當按鍵按下時,點亮或熄滅LED
  if(ledState==true){
    //如果目前處于亮燈狀态,就讓所有裝置處于低電荷狀态
    digitalWrite(ledPin2,LOW);

    delay(1000);

//    digitalWrite(ledPin[0],LOW);

    //呼吸的方式關閉led燈
    int i = fadeValueMax;
    do{
      analogWrite(ledPin[0], i);
      i= i - 5;
      delay(30);
    }while(i>=0);

    delay(1000);

//    digitalWrite(ledPin[1],LOW);
    i = fadeValueMax;
    do{
      analogWrite(ledPin[1], i);
      i= i - 5;
      delay(30);
    }while(i>=0);

    delay(1000);

//    digitalWrite(ledPin[2],LOW);
    i = fadeValueMax;
    do{
      analogWrite(ledPin[2], i);
      i= i - 5;
      delay(30);
    }while(i>=0);

    delay(1000);

    //狀态取反
    ledState=!ledState;
  }
  else
  {
    //如果目前是關閉狀态,就讓所有裝置處于高電荷狀态
    
//    digitalWrite(ledPin[2],HIGH);

    //呼吸的方式緩慢開啟led燈
    int i = 5;
    while(i<=fadeValueMax){
      analogWrite(ledPin[2], i);
      i= i+ 5;
      delay(30);
    }

    delay(30);

//    digitalWrite(ledPin[1],HIGH);

    i = 0;
    while(i<=fadeValueMax){
      analogWrite(ledPin[1], i);
      i= i+ 5;
      delay(30);
    }

    delay(30);

    digitalWrite(ledPin[0],HIGH);

    i = 0;
    while(i<=fadeValueMax){
      analogWrite(ledPin[0], i);
      i= i+ 5;
      delay(30);
    }

    delay(1000);

    
    digitalWrite(ledPin2,HIGH);
//
//    i = 0;
//    analogWrite(ledPin2, i);
//    while(i<255){
//      i+=5;
//      delay(30);
//    }
    
    delay(1000);

    //狀态取反
    ledState=!ledState;
  }
  delay(500);
}
           

關鍵代碼說明

  • const 修飾的變量為常量,不能修改哦
  • delay 休眠時間不可過長,不然無法起到監聽效果.可能會導緻按下開關沒有反應.也不可沒有,否則太快按一次之後,可能會執行方法多次,導緻燈狀态混亂.
  • Serial.begin 監聽序列槽,打開ide的序列槽監聽頁面,選擇對應波特率,就可以看到相關輸出了.
  • Serial.println 将要輸出的内容輸出到對應的序列槽上面
  • analogWrite 使用pwm能力,讓燈以特定值亮起來. 最低0 關閉. 最高255 亮
  • digitalWrite(ledPin[0],HIGH); 将ledPin[0] 引腳位置設定為高電荷模式, LOW為低電荷模式
  • pinMode(buttonPin, INPUT_PULLUP); 設定為上拉電阻. INPUT 為普通的輸入模式
  • digitalRead analogRead 讀取對應引腳的資料

下課~

光說不練假把式,記得練習哦~