開關+led+旋鈕電位器的實驗視訊
已經購買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 讀取對應引腳的資料
下課~
光說不練假把式,記得練習哦~