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)
|
---|
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新手只看過網路影片跟著做.麻煩高手解答..感謝 |
引用:
你叫幾次 loop 就跑幾次啊. 一直叫 當然一直跑 一直叫 loop , 又不想跑 紅字, 那就是你 判斷式內寫錯: if (digitalRead(2 == HIGH) ){ 可能是 if (digitalRead(2) == HIGH ){ 這時loop 外要是沒有 delay(N); 你的 else { 裡面要放 1個 delay(1000); :think: 好了, :think: |
只寫了啟動的判定,卻沒寫上停止的時機。
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,然後一直以這個基準當判定跑下去,變成無限回圈。 越想越覺得,程式碼我應該有很高機率是寫錯的,印象太模糊了,照原理的概念去確認程式碼吧。 |
照著 冰的跟gcar2000方法還是讓3.4 LED一直循環閃爍..
紅外線一直遮住時.4有短暫時間ON.假設有人按閘門按鍵下時.會發生馬達同時正逆轉馬達燒 毀.. |
你要不要把配線方式也擺上來,應該會有助於讓人幫忙判斷,只看程式別人腦裡想到的配線圖,可能不見得跟你一樣。
|
我先用android uno做測試.再上NodeMCU或attiny85..
這麼簡單線路應該不會錯誤的.. 車頭遮住紅外線(2)-門停止(B接點串聯閘門的停止健(3))-1秒-上升(4)-1秒-上升放開(馬達 自保持)-不做任何動作(假設車頭沒移開.會一直循環..) |
車頭遮住紅外線(2)-(閘門正往下關) 門停止 (B接點串聯閘門的停止健(3))
-1秒 -上升(4) -1秒 -上升放開(馬達自保持) -不做任何動作(假設車頭沒移開.會一直循環..) |
你的問題, 在於你沒有把問題描述清楚.
你要叫 loop , 但內容卻只執行一次 ? 那你要先檢查為何一直叫loop. 你要一直叫 loop , 但不一直去執行紅字, 只有一次? 那你要檢查那個判斷式 if (digitalRead(2 是讀出 PIN 再決定執行 ? 還是做一個計數器, 讓它只跑一次? 你最好整理一個完整的動作邏輯流程圖 在寫程式. |
我知道放在loop內會一直循環.我有爬文好像紅字後要用break;
放在setup內也不對.車頭遮住NodeMCU送電..車頭移開後NodeMCU斷電wifi不能做動(另一種線路)..(跟只用一個NE555做delay off timer同一樣線路) 其實還有另外線路也可行.只不過要多配1條線路..紅外線B點切停止鍵.A點接到digitalRead(2) 現場工作比較難一點.. |
引用:
談邏輯就好 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。