wiskfly 發表於 2015-9-14 10:14:48

arduino跳出迴圈問題

#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
int val,i=0,j=0,a;
int ang = {0, 40, 80, 120, 160};
int anglength = sizeof(ang) / sizeof(ang);
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:03

程式問題很多
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:31

#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
int val,i=0,j=0;
int ang = {0, 40, 80, 120, 160};
int anglength = sizeof(ang) / sizeof(ang);
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(val=2);


    break;

}//switch

}//if ava
}//loop

wiskfly 發表於 2015-9-14 14:26:49

抱歉我更新一下程式碼
因為一直改寫很多地方錯掉了
謝謝前輩的提醒
原本有寫到val=a所以才會出現a
然後這個程式是要搭配APP INVENTOR的
送出訊號為 :按下按鍵 傳送一次'1'的值
                   放開按紐傳送一次'0'的值
所以目的是要讓點選按鍵時跑CASE1
途中放開按件時傳送0跑到CASE0

超新手 發表於 2015-9-14 15:42:18

delay 和不必要的東西拿掉

   case 0:
    Serial.println(val);
    break;

    case 1:
   for(i=4;i>0;i--){
         Serial.println(val);
      Serial.println(ang);
      }
      break;

wiskfly 發表於 2015-9-14 16:39:02

if(val=0)break;
這個應該需要吧?
如果沒判斷那怎麼在i=2的時候就跳出迴圈呢?
我會加delay也是因為這樣看監視視窗時
比較清楚可以看到不會跑太快
謝謝前輩給的意見我會繼續試試看
辛苦您了

超新手 發表於 2015-9-14 17:15:06

你的判斷式都寫錯了
應該是兩個等於
if(val==0)break;
while(val==2);
而不是
if(val=0)break;
while(val=2);

wiskfly 發表於 2015-9-14 18:08:19

前輩您好,聽從您的指正後把判斷事都改成==了
但是迴圈還是無法順利跳出耶

超新手 發表於 2015-9-14 18:25:45

當然會很久
因為這個判斷式 if(val==0) break;   
永遠不會成立, 有寫跟沒寫一樣
因為val在case 1時, 永遠為 1
所以一定會等 2 秒(4x500)才會結束迴圈

wiskfly 發表於 2015-9-14 19:47:26

在case裡永遠是1!!
難怪都跑不出來,我是剛接觸的新人
謝謝前輩給的指導
那如果要達成我想呈現的
應該是要使用
for(){
..if()break;
}.   是嗎?
我在試試看,之後再來跟您分享所遇到的問題或者是否成功解決
謝謝您耐心的回覆我!!

wiskfly 發表於 2015-9-14 22:28:21

試了一下不管是switch還是if(val==1) for(...)...
在裡面永遠都是1!!
前輩有什麼好方法可以提供給後進試試看的嗎?
謝謝您了

超新手 發表於 2015-9-15 12:41:00

在switch中把旗標設起來
然後在外層負責顯示
void loop() {
// 顯示

// 接收資料
   if(Serial.available() >0){
   val = Serial .read()-48;

另外,
1) 那個 BT 宣告是多餘的. 直接用 Serial 即可
2) -48 也可省略
直接用
case '0':
case '1':
頁: [1]
查看完整版本: arduino跳出迴圈問題