控制LED相關文章:
內容目錄
材料
材料名稱 | 蝦皮連結 |
---|---|
1.【傑森創工】Arduino Uno R3 開發板 原廠晶片 *限時特惠 附USB線 | |
2.【傑森創工】665mm 輕觸開關 4腳 微動按鈕 按鍵 Arduino 5個一組 | |
3.【傑森創工】20個 1/4W 220Ω 電阻DIP 插板電阻 碳膜電阻,1%電阻 8051 Arduino | |
3.【傑森創工】20個 1/4W 10KΩ 電阻DIP 插板電阻 碳膜電阻,1%電阻 8051 Arduino | |
4.【傑森創工】5mm 超高亮度LED 白光 10個一組 可用於Arduino 單晶片 汽機車 無人機 | |
5.【傑森創工】170孔 迷你 彩色 麵包板 六色 白黑藍黃綠紅 Arduino (顏色隨機出貨) |
電路連接
按鈕介紹
按鈕要注意的是,圖中同個紅色框內的針腳是連通的。
當按鈕按下時,左右的針腳就會導通。
上拉電阻
上拉電阻接10kΩ,主要是讓電流降低,避免燒壞板子。
按鈕狀態 | Arduin針腳讀取電壓 |
---|---|
按下 | 5V |
放開 | 0V |
arduino內建上拉電阻
還有另外一個方式,就是使用Arduino內建上拉電阻,就不用再從外部接電阻。
但要注意,程式碼中要更改pinMode(buttonPin,INPUT_PULLUP),告訴Arduino這個pin腳要啟用內建上拉電阻。
pinMode(buttonPin, INPUT_PULLUP);
使用內建上拉電阻,ardunio針腳讀取到的電壓動作會變相反,按下時0V,放開時5V。
按鈕狀態 | Arduin針腳讀取電壓 |
---|---|
按下 | 0V |
放開 | 5V |
延伸閱讀: 三用電錶使用教學,檢查電路必備工具!!
arduino程式
LED按下開,放開關
我們可以直接使用arduino IDE 提供的範例程式。
const int buttonPin = 8; // 按鈕連接的pin
const int ledPin = 2; // LED pin
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
//讀取按鈕狀態
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
//LED點亮
digitalWrite(ledPin, HIGH);
} else {
//LED熄滅
digitalWrite(ledPin, LOW);
}
}
LED按一下開,再按一下關
這裡可以參考懶番茄工作室的旗標技巧教學
const int buttonPin = 8; // 按鈕連接的pin
const int ledPin = 2; // LED pin
int buttonState = 0;
boolean LedState = false; //LED狀態
boolean buttonUp = true; //按鈕放開狀態
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
//讀取按鈕狀態
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH && buttonUp == true) {
LedState=!LedState;
digitalWrite(ledPin, LedState);
buttonUp = false;
}
else if(buttonState != HIGH && buttonUp != true){
buttonUp = true;
}
delay(100); //設置延遲100ms,防機械彈跳
}
請問可以教一個按鈕控制開關led跑馬燈,程式和電路嗎?最近想破頭都還是想不出來
你這個控制要同時讓跑馬燈跑,又要檢查按鈕狀態,因此先前跑馬燈用for迴圈跟delay,會被卡在for 迴圈中。
這裡要改用millis(),來取代delay,millis()用法可以參考這篇
https://www.qutaojiao.com/21537.html
程式流程大致如下:
loop
{
檢查按鈕狀態(會是1或0)
while(狀態0){
檢查按鈕狀態(會是1或0)
跑馬燈程式<--這就要用millis()去寫 } 關閉LED } *程式碼連結: https://drive.google.com/file/d/1iLqIkNHYNg4irw0KMsb0RO0nm2dZ0emP/view?usp=sharing
開關控制LED跑馬燈影片:
https://youtu.be/RznjF5NZZzY
之後再出一篇比較詳細說明的文章
那當有人經過感測器使LED燈亮起不滅,然後再一次有人經過LED燈就會熄滅,想請問怎麼寫程式?最近一直想不出來求解?
其實跟本篇的按鈕按一下開,在按一下關,蠻類似的。
下列大概寫一下:
readSensor是讀取感測器的狀態結果
stillStand是來表示是否有人在感測器前面。
void loop{
readSensor=digitalRead(sensorPin);
if( readSensor==HIGH&& stillStand==0){
ledState=!ledState;
stillStand=1;
}
else if(readSensor==LOW&&stillStand==1){
stillStand=0;
}
digitalWrite(ledPin, ledState);
}
1.一開始是感測器感應到HIGH,且stillStand=0,所以就把燈改成反向(亮起)。
2.因為人還沒走,所以感應器還是HIGH,可是stillStand=1,所以兩個if都不會執行。
3.當人走時,感應器變成LOW,stillStand=1,於是執行第二個if,把stillStand又改回0,這時燈還是亮著的。
4.直到下次感測器變HIGH,才會再執行第一個if,把燈改成反向(暗掉)。
思考一下這個程式的邏輯,自己試著把程式完成看看吧~
如果還有問題的話可以在留言發問或發email,加油~
謝謝!!我試著研究看看
作者,抱歉我研究一下還是不知道怎麼繼續寫下去,寫出完整的程式,可以提供完整的程式嗎?
研究了一下還是有點不懂,雖然看的懂程式,卻不會寫完整的,求解?
我還是有點不太懂怎麼打出完整的程式
我有稍微研究出來程式,但是我發現他的第一次是恆亮的但是測第二次的時候,還是跟第一次一樣恆亮,第三次才慢慢熄滅,想不出來為甚麼,給你看程式:
#define PIR_PIN 2 //感測器腳位
#define LED_PIN 13 //LED燈腳位
bool pirState = false; //宣告一個布林 用於儲存感人體感測器的狀態
int led = 13; //設定led pin, PWM pin有~3,~5,~6,~9,~10,~11
int brightness = 0; //LED亮度變數
int fadeAmount = 5; //亮度變化變數
void setup() {
pinMode(PIR_PIN,INPUT);//設定人體感測器腳位為輸入
pinMode(LED_PIN,OUTPUT);//設定LED燈腳位為輸出
//設定led pin為OUTPUT
pinMode(led, OUTPUT);
}
void loop() {
pirState = digitalRead(PIR_PIN); //取得感測器狀態
if(pirState == true){ //如果感測器偵測到人體點亮LED燈
digitalWrite(LED_PIN,HIGH);
}
//PWM輸出
analogWrite(led, brightness);
if(pirState == true){ //如果感測器偵測到人體點亮LED燈
digitalWrite(LED_PIN,HIGH);
//在每次回圈brightness都會累加fadeAmount
brightness = brightness + fadeAmount;
//到最亮或最暗時反轉
if (brightness = 255) {
fadeAmount = -fadeAmount;
}
你的兩個if條件都一樣,這樣兩個都會執行。
LED_PIN 13 、led = 13 這兩個led腳位也是一樣,但其中一個你用digitalWrite,另一個又用analogWrite,這裡也怪怪的。
我不太知道你的感測器是用甚麼,但我先用超音波感測器,依照你上次敘述的條件來做一個完整的給你參考,你可以再email到這個信箱derek@crazymaker.com.tw,敘述你的問題~
你好,我傳過去了,我的email叫:F*******0@gmail.com
想請教一下,若增加為4顆LED和4顆開關分別控制,那是否有比較快的寫法,還是只能土法煉鋼。
我想到的是用陣列的寫法,搭配for迴圈,可以精簡土法煉鋼的程式
const int buttonPin[4] = {8,9,10,11}; // 按鈕連接的pin
const int ledPin[4] = {2,3,4,5}; // LED pin
boolean buttonState[4] = {0,0,0,0};
boolean LedState[4] = {1,1,1,1}; //LED狀態
boolean buttonUp[4] = {1,1,1,1}; //按鈕放開狀態
void setup() {
for(int i=0;i<4;i++){
pinMode(ledPin[i], OUTPUT);
pinMode(buttonPin[i], INPUT_PULLUP);
}
}
void loop() {
//讀取按鈕狀態
for(int i=0;i<4;i++){
buttonState[i] = digitalRead(buttonPin[i]);
if (buttonState[i] == HIGH && buttonUp[i] == true) {
LedState[i]=!LedState[i];
digitalWrite(ledPin[i], LedState[i]);
buttonUp[i] = false;
}
else if(buttonState[i] != HIGH && buttonUp[i] != true){
buttonUp[i] = true;
}
//delay(100); //設置延遲100ms,防機械彈跳
}
}
可以寫一下按一下一顆亮,一顆暗,按第二下一顆暗,一顆亮嗎
可以,兩個led的動作用相反的就可以了。
謝謝
可以請問
如果一個開關控制兩個led
按按鈕第一次一亮一暗
第二次全暗
第三次另一個亮一暗
第四次全暗
的程式要怎麼寫嗎
可以設定變數,例如:按鈕只要按下,變數就+1,直到=4時再回到0。
再用switch case來選擇如何讓Led亮。
可以問一下怎麼讓他按2下亮按一下暗,要不管什麼狀態按兩下點燈都會亮按一下點燈都會暗
有程式讓我比較好理解嗎?謝謝我是粗學