Robofun 機器人論壇

標題: 新手求助 [打印本頁]

作者: tuyn76801    時間: 2016-12-5 12:28
標題: 新手求助
請問一下 兩個紅外線感應裝置A和B感應到有東西經過的話從0變1
下面重點......

如果先A==1之後再B==1的情況,輸出+1
順序反過來(先B再A)則輸出-1

這個部分應該怎麼寫?
作者: croma    時間: 2016-12-5 16:43
int check(void) {
  static char lastA=0,lastB=0;
  if(lastA != A){
    if(A==1 && B==1)
      return -1;
  }
  if(lastB != B) {
    if(B==1 && A== 1)
      return 1;
  }
  lastA = A;
  lastB = B;
  return 0;
}
作者: tuyn76801    時間: 2016-12-5 17:59
感謝你的回答 幫了大忙
但按照我的要求,return(-1)和return(+1)的位置是不是應該反過來?
不過還是謝謝你
作者: croma    時間: 2016-12-5 20:12
應該不用反過來吧~
你的要求是 先B再A 則輸出-1
所以是 A 發生變化時 A 要等於 1 而且 B 要等於 1

if(lastA != A){
    if(A==1 && B==1)
      return -1;
  }
作者: tuyn76801    時間: 2016-12-5 22:06
喔喔~ 原來是這樣 我看懂了
作者: tuyn76801    時間: 2016-12-6 22:16
那個 不好意思 我又有問題了....
  1. void loop() {
  2.   int ira = digitalRead(irReceiver_a);      
  3.   int irb = digitalRead(irReceiver_b);  
  4.   
  5. int check(void) {
  6.   static char lastA=0,lastB=0;
  7.   if(lastA != ira) {
  8.     if(ira==1 && irb==1)
  9.       return -1;
  10.   }
  11.   if(lastB != irb) {
  12.     if(irb==1 && ira==1)
  13.       return 1;
  14.   }
  15.   lastA = ira;
  16.   lastB = irb;
  17.   return 0;
  18. }
  19. }
複製代碼
裡面 void loop() { 這段在編譯的時候會報錯
a function-definition is not allowed here before '{' token

請問這是哪裡錯了?
作者: tuyn76801    時間: 2016-12-6 22:22
上面講錯了
報錯了的是 int check(void) { 這一行
作者: croma    時間: 2016-12-7 10:35
本帖最後由 croma 於 2016-12-7 10:36 編輯

回復 7# tuyn76801

因為你的括號是不對齊的 loop 函數的下括號勒
作者: tuyn76801    時間: 2016-12-7 12:22
對不起不是很懂,所謂括號不對齊是甚麼意思?
loop的下括號的話在19行
作者: croma    時間: 2016-12-7 17:33
回復 9# tuyn76801
你一個函數包裹另一個函數,不是每個編譯器都支援這種語法
作者: tuyn76801    時間: 2016-12-7 19:16
謝謝指點,現在把他全部宣告在外面就可以了
  1. const int irReceiver_a = 2;                // IRA
  2. const int irLed_a  = 3;                    
  3. const int irReceiver_b = 4;                // IRB
  4. const int irLed_b  = 5;                  
  5. const unsigned int frequency = 38000;    // 發射頻率(單位: Hz)

  6. void setup() {               
  7.   Serial.begin(9600);                    // 開啟 Serial port, 通訊速率為 9600 bps
  8.   pinMode(irReceiver_a, INPUT);           // 把 irReceiverin 接腳設置為 INPUT
  9.   pinMode(irLed_a, OUTPUT);               // 把 irLedin 接腳設置為 OUTPUT
  10.   pinMode(irReceiver_b, INPUT);           // 把 irReceiverout 接腳設置為 INPUT
  11.   pinMode(irLed_b, OUTPUT);               // 把 irLedout 接腳設置為 OUTPUT
  12.   
  13.   tone(irLed_a, frequency);               // 產生指定頻率的脈波 (Pulses)
  14.   tone(irLed_b, frequency);
  15. }

  16. int ira = digitalRead(irReceiver_a);
  17. int irb = digitalRead(irReceiver_b);
  18. int check(void) {
  19.     static char lasta=0,lastb=0;
  20.     if(lasta!=ira) {
  21.       if(ira==1&&irb==1) {
  22.       Serial.println("IN");
  23.       return 1;
  24.       }
  25.     }
  26.     if(lastb!=irb) {
  27.       if(irb==1&&ira==1) {
  28.       Serial.println("OUT");
  29.       return -1;
  30.       }
  31.     }
  32.     lasta=ira;
  33.     lastb=irb;
  34.     return 0;
  35. }
  36. int p;
  37. void loop() {
  38.   int c = check();
  39.   if(c != 0) {
  40.     p = p + c;            
  41.     Serial.println(c);
  42.     Serial.println(p);
  43.   }
  44. }
複製代碼
接下來就是上傳來實驗看看
作者: tuyn76801    時間: 2016-12-9 14:36
現在遇到的問題
(1) int ira = digitalRead(irReceiver_a);
      int irb = digitalRead(irReceiver_b);
這兩個一定要在void loop()裡面,不然ira和irb會一直是1
(2) check(void)不能在void loop()裡面,不然編譯會失敗


但是如果把check(void)放在最外層的話,他就讀不到ira和irb了
請問有沒有什麼寫法可以讓check(void)抓的到在void loop()裡面的ira和irb ? (對不起,我副程式和return不太熟)
作者: 超新手    時間: 2016-12-9 19:55
宣告在外面,程式寫裡面即可
char ira;
char irb;
int check(void) {
            ira = digitalRead(irReceiver_a);
            irb = digitalRead(irReceiver_b);
static char lasta=0,lastb=0;
if(lasta!=ira) {
作者: tuyn76801    時間: 2016-12-9 20:34
恩 謝謝 我這樣修改試試看




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2