Robofun 機器人論壇

標題: 新手發問 按鍵問題 [打印本頁]

作者: ming1104    時間: 2015-1-29 21:53
標題: 新手發問 按鍵問題
這是一個按鍵的範例程式
const int buttonPin = 2;   
const int ledPin =  10;   


boolean buttonState;      
boolean ledState = HIGH;   

void setup() {
  pinMode(ledPin, OUTPUT);        
  digitalWrite(ledPin, ledState);
  pinMode(buttonPin, INPUT);      
}

void loop(){
  buttonState = digitalRead(buttonPin);  


  if (buttonState == LOW) {
    ledState=!ledState;  
    digitalWrite(ledPin, ledState);
    delay(20);   
    while (1) {
        buttonState = digitalRead(buttonPin);
        if (buttonState == HIGH) break;
    }
    delay(20);  
  }
}


我的疑問是
while (1) {
        buttonState = digitalRead(buttonPin);
        if (buttonState == HIGH) break;
    }

這段程式的作用是什麼??

本來應該是按一下然後一直亮著

再按一下就熄滅

我把它刪掉之後再編譯一次

按下去有時候會閃一下 有時候會一直亮著怎麼會這樣?

-------------------------------------------------------------------

小弟剛接觸Arduino幾個禮拜而已 一直有很多問題

之後會陸續發問 希望大家能多多幫忙~~感恩
作者: mojamoja1202    時間: 2015-1-29 23:19
這篇文章可以參考看看
http://arduino.cc/en/tutorial/button
========
作者: mojamoja1202    時間: 2015-1-29 23:43
因為您的需求是按一下按鍵,燈亮;再按一下按鍵,燈暗
所以應該偵測到按鈕為HIGH時便開燈,又偵測到按鍵為HIGH時再關燈
如果是小弟寫的話
===========
boolean ledState = false;

void setup(){
  pinMode(2,INPUT);
  pinMode(10,OUTPUT);
}
void loop(){
  if(digitalRead(2) == LOW){  //按下開關
    ledState = !ledState;
  }
  digitalWrite(10,ledState);
}
=============
我應該會這樣寫吧!
沒測試過,自己靠想像寫的,麻煩大大測試一下囉!
作者: ming1104    時間: 2015-1-30 11:47
回復 3# mojamoja1202


謝謝你的解答~~
可是好像還是有彈跳時間的問題~
作者: mojamoja1202    時間: 2015-1-30 14:02
這篇?有符合您的需求?
http://arduino.cc/en/tutorial/button
作者: ming1104    時間: 2015-1-30 15:22
回復 5# mojamoja1202


我的書有您貼的中文版
可是小弟還是有看沒有懂啊QAQ
作者: mojamoja1202    時間: 2015-2-4 11:50
哪一段看不懂????
作者: mojamoja1202    時間: 2015-2-4 12:16
  1. const int buttonPin = 2;     // 按鈕的pin
  2. const int ledPin =  13;      // LED的pin

  3. // variables will change:
  4. int buttonState = 0;         // 設一個變數來存放按鈕的狀況:通電時為1,不通電時為0

  5. void setup() {
  6.   // LED的pin設為output
  7.   pinMode(ledPin, OUTPUT);      
  8.   // 按鈕的pin設為input
  9.   pinMode(buttonPin, INPUT);     
  10. }

  11. void loop(){
  12.   // 反覆偵測第二個pin接受到的值,並指定給buttonState
  13.   buttonState = digitalRead(buttonPin);

  14.   // 反覆偵測按鈕狀態
  15.   // 如果被按下,則會收到HIGH,HIGH代表1,LOW代表0
  16.   if (buttonState == HIGH) {     
  17.     // turn LED on:   
  18.     digitalWrite(ledPin, HIGH);  
  19.   }
  20.   else {
  21.     // turn LED off:
  22.     digitalWrite(ledPin, LOW);
  23.   }
  24. }
複製代碼

這段示範碼是當按下按鈕時,燈會亮,當放開按鈕時,燈會暗
但是您的需求是按一下,燈一直亮,再按一下,燈一直暗
所以後面IF的地方要做修改
可以改成
buttonState改成boolean函數,要嘛0(false),要嘛1(true)

boolean ledState = 0;  //怕您看不懂,我把它改成ledState,代表小弟希望燈的狀態為0或1
後面的程式碼就變成
//一接收到按下按鈕,就改變ledState
if (digitalRead(2) == HIGH){
  ledState = ledState + 1;  //每次pin 2 收到GIGH,我的ledState就加1,因為是boolean,所以不是0就是1
  digitalWrite(ledPin,ledState);  //按一下,就改一次ledState,然後13pin就送出0或1
}

這樣可以嗎?




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2