開關+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 讀取對應引腳的資料
下課~
光說不練假把式,記得練習哦~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297655.html
標籤:其他
上一篇:IoT邊緣,你究竟是何方神圣?
