Robofun 機器人論壇
標題:
arduino跳出迴圈問題
[打印本頁]
作者:
wiskfly
時間:
2015-9-14 10:14
標題:
arduino跳出迴圈問題
#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
int val,i=0,j=0,a;
int ang[5] = {0, 40, 80, 120, 160};
int anglength = sizeof(ang) / sizeof(ang[4]);
Servo myservo;
SoftwareSerial BT(0,1);
void setup() {
Serial.begin(9600);
BT.begin(9600);
myservo.attach(3);
myservo.write(0);
}
void loop() {
if(Serial.available() >0){
val = BT.read()-48;
switch(val){
case 0:
delay(500);
Serial.println(val);
break;
case 1:
if(i>0){
for(i=4;i>0;i--){
Serial.println(val);
Serial.println(ang
);
delay(500);
if(val=0)break;
}//for
}//if
break;
case 2:
do{ i=i-1;
Serial.println(val);
Serial.println(ang
);
delay(500);
}while(a=2);
break;
}//switch
}//if ava
}//loop
按下按鍵一 輸出1 放開按鍵輸出0
按下按鍵二 輸出2 放開按鍵輸出0
case1 跟 case2是我寫的兩種方式
但是放開按鈕時都無法馬上順利跳出迴圈
勞請各位前輩指點一下 感激不盡
作者:
超新手
時間:
2015-9-14 11:56
程式問題很多
1. 判斷式要用 ==, 不可用 =
while(a=2);
if(val=0)break;
2. 這樣寫 compiler 應該不會過吧?
Serial.println(ang);
3. 跳出迴圈的判斷式也很奇怪, 看 a 或 val 的結果?
while(a=2);
if(val=0)break;
a 從來沒用過, 而 VAL在 CASE 1, 應該永遠是 1吧?
作者:
wiskfly
時間:
2015-9-14 14:22
#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
int val,i=0,j=0;
int ang[5] = {0, 40, 80, 120, 160};
int anglength = sizeof(ang) / sizeof(ang[4]);
Servo myservo;
SoftwareSerial BT(0,1);
void setup() {
Serial.begin(9600);
BT.begin(9600);
myservo.attach(3);
myservo.write(0);
}
void loop() {
if(Serial.available() >0){
val = BT.read()-48;
switch(val){
case 0:
delay(500);
Serial.println(val);
break;
case 1:
if(i>0){
for(i=4;i>0;i--){
Serial.println(val);
Serial.println(ang[i]);
delay(500);
if(val=0)break;
}//for
}//if
break;
case 2:
do{ i=i-1;
Serial.println(val);
Serial.println(ang[i]);
delay(500);
}while(val=2);
break;
}//switch
}//if ava
}//loop
作者:
wiskfly
時間:
2015-9-14 14:26
抱歉 我更新一下程式碼
因為一直改寫很多地方錯掉了
謝謝前輩的提醒
原本有寫到val=a所以才會出現a
然後這個程式是要搭配APP INVENTOR的
送出訊號為 : 按下按鍵 傳送一次'1'的值
放開按紐 傳送一次'0'的值
所以目的是要讓 點選按鍵時跑CASE1
途中放開按件時傳送0 跑到CASE0
作者:
超新手
時間:
2015-9-14 15:42
delay 和不必要的東西拿掉
case 0:
Serial.println(val);
break;
case 1:
for(i=4;i>0;i--){
Serial.println(val);
Serial.println(ang[i]);
}
break;
作者:
wiskfly
時間:
2015-9-14 16:39
if(val=0)break;
這個應該需要吧?
如果沒判斷 那怎麼在i=2的時候就跳出迴圈呢?
我會加delay也是因為這樣看監視視窗時
比較清楚可以看到 不會跑太快
謝謝前輩給的意見 我會繼續試試看
辛苦您了
作者:
超新手
時間:
2015-9-14 17:15
你的判斷式都寫錯了
應該是兩個等於
if(val==0)break;
while(val==2);
而不是
if(val=0)break;
while(val=2);
作者:
wiskfly
時間:
2015-9-14 18:08
前輩您好,聽從您的指正後把判斷事都改成==了
但是迴圈還是無法順利跳出耶
作者:
超新手
時間:
2015-9-14 18:25
當然會很久
因為這個判斷式 if(val==0) break;
永遠不會成立, 有寫跟沒寫一樣
因為val在case 1時, 永遠為 1
所以一定會等 2 秒(4x500)才會結束迴圈
作者:
wiskfly
時間:
2015-9-14 19:47
在case裡永遠是1!!
難怪都跑不出來,我是剛接觸的新人
謝謝前輩給的指導
那如果要達成我想呈現的
應該是要使用
for(){
..if()break;
}. 是嗎?
我在試試看,之後再來跟您分享所遇到的問題或者是否成功解決
謝謝您耐心的回覆我!!
作者:
wiskfly
時間:
2015-9-14 22:28
試了一下 不管是switch還是if(val==1) for(...)...
在裡面永遠都是1!!
前輩有什麼好方法可以提供給後進試試看的嗎?
謝謝您了
作者:
超新手
時間:
2015-9-15 12:41
在switch中把旗標設起來
然後在外層負責顯示
void loop() {
// 顯示
// 接收資料
if(Serial.available() >0){
val = Serial .read()-48;
另外,
1) 那個 BT 宣告是多餘的. 直接用 Serial 即可
2) -48 也可省略
直接用
case '0':
case '1':
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2