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:02 AM

Arduino問題..
 
void setup() {
pinMode(2, INPUT); // 對照式紅外線
pinMode(3, OUTPUT); // 停止(B接點)
pinMode(4, OUTPUT); // 上升(A接點)
}

void loop() {
if (digitalRead(2 == HIGH) ){


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

}

else {
digitalWrite(3, LOW);digitalWrite(4, LOW);
} }


loop紅字內怎樣跑一次就停止..想用NodeMCU做個車道閘門停止(3)上升(4)加對照式紅
外線(2)控制.加上wifi+App Inventor2 用手機開閘門..紅外線(2)遮住不放一直輪迴.
...紅字拿到setup內沒動作...

Arduino新手只看過網路影片跟著做.麻煩高手解答..感謝

冰的啦魔王大人 2018-09-09 06:59 AM

引用:
作者poo123
loop紅字內怎樣跑一次就停止..



你叫幾次 loop 就跑幾次啊.
一直叫 當然一直跑

一直叫 loop , 又不想跑 紅字,
那就是你 判斷式內寫錯:


if (digitalRead(2 == HIGH) ){


可能是
if (digitalRead(2) == HIGH ){



這時loop 外要是沒有 delay(N);
你的 else { 裡面要放 1個

delay(1000);


:think:



好了,
:think:

gcar2000 2018-09-09 09:44 AM

只寫了啟動的判定,卻沒寫上停止的時機。

digitalWrite(3, HIGH); digitalWrite(4, LOW); // 停止(B接點)
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, LOW);
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, HIGH); // 上升(A接點)
delay(1000);
digitalWrite(3, LOW);digitalWrite(4, LOW);
delay(N);
digitalWrite(2, LOW);


試試這樣改吧,好陣子沒玩Arduino了,不知道有沒有記錯。
反正就這原理,在跑完動作之後,順道再度讀取一次2接點的訊號,或是直接覆蓋2的訊號。
不然程式上會一直認定一開始讀到的2 HIGH,然後一直以這個基準當判定跑下去,變成無限回圈。

越想越覺得,程式碼我應該有很高機率是寫錯的,印象太模糊了,照原理的概念去確認程式碼吧。

poo123 2018-09-09 10:33 AM

照著 冰的跟gcar2000方法還是讓3.4 LED一直循環閃爍..

紅外線一直遮住時.4有短暫時間ON.假設有人按閘門按鍵下時.會發生馬達同時正逆轉馬達燒
毀..

gcar2000 2018-09-09 11:19 AM

你要不要把配線方式也擺上來,應該會有助於讓人幫忙判斷,只看程式別人腦裡想到的配線圖,可能不見得跟你一樣。

poo123 2018-09-09 12:44 PM

我先用android uno做測試.再上NodeMCU或attiny85..
這麼簡單線路應該不會錯誤的..

車頭遮住紅外線(2)-門停止(B接點串聯閘門的停止健(3))-1秒-上升(4)-1秒-上升放開(馬達
自保持)-不做任何動作(假設車頭沒移開.會一直循環..)

poo123 2018-09-09 01:17 PM

車頭遮住紅外線(2)-(閘門正往下關) 門停止 (B接點串聯閘門的停止健(3))

-1秒

-上升(4)

-1秒

-上升放開(馬達自保持)

-不做任何動作(假設車頭沒移開.會一直循環..)

冰的啦魔王大人 2018-09-09 01:25 PM

你的問題, 在於你沒有把問題描述清楚.




你要叫 loop , 但內容卻只執行一次 ?
那你要先檢查為何一直叫loop.


你要一直叫 loop , 但不一直去執行紅字, 只有一次?
那你要檢查那個判斷式
if (digitalRead(2
是讀出 PIN 再決定執行 ? 還是做一個計數器, 讓它只跑一次?



你最好整理一個完整的動作邏輯流程圖 在寫程式.

poo123 2018-09-09 01:50 PM

我知道放在loop內會一直循環.我有爬文好像紅字後要用break;
放在setup內也不對.車頭遮住NodeMCU送電..車頭移開後NodeMCU斷電wifi不能做動(另一種線路)..(跟只用一個NE555做delay off timer同一樣線路)

其實還有另外線路也可行.只不過要多配1條線路..紅外線B點切停止鍵.A點接到digitalRead(2)
現場工作比較難一點..

fpe 2018-09-09 02:58 PM

引用:
作者poo123
void setup() {
pinMode(2, INPUT); // 對照式紅外線
pinMode(3, OUTPUT); // 停止(B接點)
pinMode(4, OUTPUT); // 上升(A接點)
}

void loop() {
if (digitalRead(2 == HIGH) ){


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

}

else {
digitalWrite(3, LOW);digitalWrite(4, LOW);
} }


loop紅字內怎樣跑一次就停止..想用NodeMCU做個車道閘門停止(3)上升(4)加對照式紅
外線(2)控制.加上wifi+App Inventor2 用手機開閘門..紅外線(2)遮住不放一直輪迴.
...紅字拿到setup內沒動作....


談邏輯就好

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

PIN3,PIN4為輸出電位
在設定裡定義好
順便把電位直接改成LOW,比較保險

pin2為紅外線,有遮蔽物電位就為HIGH,無遮蔽物就為LOW
沒有錯的話

void loop() {
if (digitalRead(2 == HIGH) ){

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

}

else {
digitalWrite(3, LOW);digitalWrite(4, LOW);
} }


上面LOOP的寫法可以精簡一點

void loop() {
if (digitalRead(2 == HIGH) ){ //紅外線有遮蔽物擋住會變高電位HIGH

digitalWrite(3, HIGH); // 停止(B接點) PIN4已經在低電位LOW,不須要再寫
delay(1000); // 停止1秒
digitalWrite(3, LOW); // 將PIN3改成低電位LOW,PIN4還是保持在低電位
delay(1000); // 停止1秒
digitalWrite(4, HIGH); // 上升(A接點) 將PIN4改成高電位,這時PIN3保持低電位
delay(1000); // 停止1秒
digitalWrite(3, LOW); // 將PIN3改成低電位LOW
digitalWrite(4, LOW); // 將PIN4改成低電位LOW

}

}

ELSE就不須要寫了
不管PIN2有沒有成高電位 if digitalRead(2 == HIGH)
在void setup {}裡就將PIN3,PIN4先預設低電位LOW

PIN2如果是高電位HIGH
if條件成立
跑完void loop {}時
在末段會將PIN3,PIN4設定成低電位LOW

上述只是提供邏輯參考
可以幫助你分析看看程式有沒有寫錯方向
不代表正確無誤


所有的時間均為GMT +8。 現在的時間是06:13 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2024。