Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 10173|回復: 11
打印 上一主題 下一主題

arduino跳出迴圈問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-9-14 10:14:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#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是我寫的兩種方式
但是放開按鈕時都無法馬上順利跳出迴圈
勞請各位前輩指點一下  感激不盡
2#
發表於 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吧?
3#
 樓主| 發表於 2015-9-14 14:22:31 | 只看該作者
#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
4#
 樓主| 發表於 2015-9-14 14:26:49 | 只看該作者
抱歉  我更新一下程式碼
因為一直改寫很多地方錯掉了
謝謝前輩的提醒
原本有寫到val=a所以才會出現a
然後這個程式是要搭配APP INVENTOR的
送出訊號為 :  按下按鍵 傳送一次'1'的值
                   放開按紐  傳送一次'0'的值
所以目的是要讓  點選按鍵時跑CASE1
途中放開按件時傳送0  跑到CASE0
5#
發表於 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[i]);
      }
      break;
6#
 樓主| 發表於 2015-9-14 16:39:02 | 只看該作者
if(val=0)break;
這個應該需要吧?
如果沒判斷  那怎麼在i=2的時候就跳出迴圈呢?
我會加delay也是因為這樣看監視視窗時
比較清楚可以看到  不會跑太快
謝謝前輩給的意見  我會繼續試試看
辛苦您了
7#
發表於 2015-9-14 17:15:06 | 只看該作者
你的判斷式都寫錯了
應該是兩個等於
if(val==0)break;
while(val==2);
而不是
if(val=0)break;
while(val=2);
8#
 樓主| 發表於 2015-9-14 18:08:19 | 只看該作者
前輩您好,聽從您的指正後把判斷事都改成==了
但是迴圈還是無法順利跳出耶
9#
發表於 2015-9-14 18:25:45 | 只看該作者
當然會很久
因為這個判斷式 if(val==0) break;     
永遠不會成立, 有寫跟沒寫一樣
因為val在case 1時, 永遠為 1
所以一定會等 2 秒(4x500)才會結束迴圈
10#
 樓主| 發表於 2015-9-14 19:47:26 | 只看該作者
在case裡永遠是1!!
難怪都跑不出來,我是剛接觸的新人
謝謝前輩給的指導
那如果要達成我想呈現的
應該是要使用
for(){
..if()break;
}.   是嗎?
我在試試看,之後再來跟您分享所遇到的問題或者是否成功解決
謝謝您耐心的回覆我!!
11#
 樓主| 發表於 2015-9-14 22:28:21 | 只看該作者
試了一下  不管是switch還是if(val==1) for(...)...
在裡面永遠都是1!!
前輩有什麼好方法可以提供給後進試試看的嗎?
謝謝您了
12#
發表於 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':
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-4 04:58 , Processed in 0.231461 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表