PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   Arduino問題.. (https://www.pcdvd.com.tw/showthread.php?t=1151721)

poo123 2018-09-09 03:32 PM

以下是我最早拿範例做修改並拿掉else..幾次試下來加上拉電組比較穩(摸電線亂亮LED)

問題還是在loop內控制2個LED.我只想做各1次亮滅後停止(紅外線ON時不要無限閃爍).
然後..
斷開紅外線pinMode(2, INPUT)後.再紅外線ON時.2顆LED亮滅各1次..
斷開紅外線pinMode(2, INPUT)後.再紅外線ON時.2顆LED亮滅各1次..
斷開紅外線pinMode(2, INPUT)後.再紅外線ON時.2顆LED亮滅各1次..
.
.
.
.



int buttonState = 0;

void setup() {
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);

}

void loop() {

buttonState = digitalRead(2);


if (buttonState == HIGH) {

digitalWrite(3, HIGH); digitalWrite(4, LOW); // 停止
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, LOW);
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, HIGH); // 上升
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, LOW);

}
}

fpe 2018-09-09 04:27 PM

引用:
作者poo123
以下是我最早拿範例做修改並拿掉else..幾次試下來加上拉電組比較穩(摸電線亂亮LED)

問題還是在loop內控制2個LED.我只想做各1次亮滅後停止(紅外線ON時不要無限閃爍).
然後..
斷開紅外線pinMode(2, INPUT)後.再紅外線ON時.2顆LED亮滅各1次..
斷開紅外線pinMode(2, INPUT)後.再紅外線ON時.2顆LED亮滅各1次..
斷開紅外線pinMode(2, INPUT)後.再紅外線ON時.2顆LED亮滅各1次..
.
.
.
.



int buttonState = 0;

void setup() {
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);

}

void loop() {

buttonState = digitalRead(2);


if (buttonState == HIGH) {

digitalWrite(3, HIGH); digitalWrite(4, LOW); // 停止
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, LOW);
delay(1000);
digitalWrite(3, LOW);d...


上面程式只要紅外線是on就會無限閃爍
要在程式裡加計數器限制就好了

void setup() {
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
int sun=0;
}

void loop() {
if (digitalRead(2 == HIGH && sun == 0) ){

digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
delay(1000);
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
sun += 1;
}
else if (digitalRead(2 == LOW && sun == 1)) {
sun = 0;

}

}

這樣就會在紅外線在ON的時候只執行一次

poo123 2018-09-09 04:46 PM

if (digitalRead(2 == HIGH && sun == 0) ){
這一行紅字.. :cry:

exit status 1
'sun' was not declared in this scope

fpe 2018-09-09 04:52 PM

引用:
作者poo123
if (digitalRead(2 == HIGH && sun == 0) ){
這一行紅字.. :cry:

exit status 1
'sun' was not declared in this scope


int sun=0;

void setup() {
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}

void loop() {
if (digitalRead(2 == HIGH && sun == 0) ){

digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
delay(1000);
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
sun += 1;
}
else if (digitalRead(2 == LOW && sun == 1)) {
sun = 0;
}

}

這樣應該可以了

冰的啦魔王大人 2018-09-09 05:03 PM

這應該是C語言吧 ?

那個判斷式 有問題吧?
計數器 宣告掛外面才能被ref 到, 但是...
這樣很惡搞.


還有 不是你把他取成 loop 他就會一直 loop ,
他會loop 是因為一直有人call.


不如把計數器 變成狀態值, 根據狀態去做動作就好.
狀態轉換定義好, 其他的就很簡單了.
也比較不會出包.



吐一些 帶 time stamp 的trace, 才會好抓蟲.

fpe 2018-09-09 05:21 PM

在arduino裡

void loop() 條件成立是會無窮迴圈跑下去的

不成立也會無窮迴圈跑

只是不會執行if裡面的程式

只跑一次用狀態值也是可以

如果後面改成跑2次以上

用計數器程式碼會比較好修改

poo123 2018-09-09 07:24 PM

引用:
作者fpe
int sun=0;

void setup() {
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}

void loop() {
if (digitalRead(2 == HIGH && sun == 0) ){

digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
delay(1000);
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
sun += 1;
}
else if (digitalRead(2 == LOW && sun == 1)) {
sun = 0;
}

}

這樣應該可以了


這樣(2)LOW時34一直閃..



加個off delay timer就解決2一直ON時LED一直閃爍.
[照明] 幫女王做的NE555單穩態觸發電路.按一下亮30秒...7/24補電路圖

這個教學pinMode(2, INPUT) 可以用電容放電變LOW(HIGH)..我在研究這個方法..
[YOUTUBE]E_5SRNp2brA&t&start=307[/YOUTUBE]

第2題好像是我要的解決答案..
[YOUTUBE]AmZut5u4SWo&t[/YOUTUBE]

NEAL 2018-09-09 08:50 PM

樓主,我人用手機,不便回,簡單來說,你放一個global變數bool lock = false.

在loop裡,用個if包起來,if lock==false才執行設定紅字的內容,執行完紅字就做lock=true,這樣就只會執行一次。

poo123 2018-09-10 12:00 AM

我照著 Arduino 教學 CH02-08 While & do...while loop 迴圈 影片第2題修改..

void setup() {

pinMode(2, INPUT_PULLUP);
pinMode(3, OUTPUT);digitalWrite(3, LOW);
pinMode(4, OUTPUT);digitalWrite(4, LOW);

while(true){
if(!digitalRead(2)){

digitalWrite(3, HIGH);digitalWrite(4, LOW);
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, LOW);
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, HIGH);
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, LOW);

while(!digitalRead(2)){};
delay(200);
}}}

void loop() {}

測試OK..INPUT(2)按鍵不管是吋動還是一直按著.都能讓LED(3)(4)各自亮暗1次

謝謝各位大力幫忙.感恩.. :)

fpe 2018-09-10 12:31 AM

引用:
作者poo123
這樣(2)LOW時34一直閃..


https://i.imgur.com/wGhDluX.jpg
加個off delay timer就解決2一直ON時LED一直閃爍.
[照明] 幫女王做的NE555單穩態觸發電路.按一下亮30秒...7/24補電路圖 (https://forum.jorsindo.com/thread-2202963-1-4.html)

這個教學pinMode(2, INPUT) 可以用電容放電變LOW(HIGH)..我在研究這個方法..
E_5SRNp2brA&t&start=307

第2題好像是我要的解決答案..
AmZut5u4SWo&t


你提到的按鈕不穩定問題

參考一下這個教學


[YOUTUBE]JOqezO2zI_M&t=278s[/YOUTUBE]


下面是我的紅外線模組及arduino UNO 連接出來的電路



我的紅外線模組當有遮蔽物時,會發送低電位訊號LOW
無遮蔽物時,會送出高電位訊號HIGH
紅外線的感應很快,用手遮擋離開的一瞬間,LED又閃了一次
要放慢紅外線感應的速度,在IF前加了delay(300);
這樣整個運作就正常了

int sun=0;

void setup() {
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}

void loop() {
delay(300);
if (digitalRead(2) == LOW && sun == 0){
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
delay(1000);
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
sun += 1;
}
else if (digitalRead(2) == HIGH && sun == 1) {
sun = 0;
}
}

上面的程式IF判斷式是以我的紅外線模組設計的,可以正常運作,
不會有你說的紅外線在無遮蔽時,會一直閃,

不可直接複制貼上
先確認你的紅外線模組在有遮蔽的狀況下所發送的訊號是高電位HIGH還是低電位LOW
再來修改IF裡面digitalRead(2) == HIGH或LOW


所有的時間均為GMT +8。 現在的時間是03:08 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。