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