Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3886|回復: 7
打印 上一主題 下一主題

新手發問 按鍵問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-1-29 21:53:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是一個按鍵的範例程式
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幾個禮拜而已 一直有很多問題

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

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


謝謝你的解答~~
可是好像還是有彈跳時間的問題~
5#
發表於 2015-1-30 14:02:47 | 只看該作者
這篇?有符合您的需求?
http://arduino.cc/en/tutorial/button
6#
 樓主| 發表於 2015-1-30 15:22:52 | 只看該作者
回復 5# mojamoja1202


我的書有您貼的中文版
可是小弟還是有看沒有懂啊QAQ
7#
發表於 2015-2-4 11:50:41 | 只看該作者
哪一段看不懂????
8#
發表於 2015-2-4 12:16:06 | 只看該作者
  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
}

這樣可以嗎?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-9-30 19:41 , Processed in 0.180762 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表