tuyn76801 發表於 2016-12-5 12:28:40

新手求助

請問一下 兩個紅外線感應裝置A和B感應到有東西經過的話從0變1
下面重點......

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

這個部分應該怎麼寫?

croma 發表於 2016-12-5 16:43:27

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:25

感謝你的回答 幫了大忙
但按照我的要求,return(-1)和return(+1)的位置是不是應該反過來?
不過還是謝謝你

croma 發表於 2016-12-5 20:12:17

應該不用反過來吧~
你的要求是 先B再A 則輸出-1
所以是 A 發生變化時 A 要等於 1 而且 B 要等於 1

if(lastA != A){
    if(A==1 && B==1)
      return -1;
}

tuyn76801 發表於 2016-12-5 22:06:20

喔喔~ 原來是這樣 我看懂了

tuyn76801 發表於 2016-12-6 22:16:06

那個 不好意思 我又有問題了....void loop() {
int ira = digitalRead(irReceiver_a);      
int irb = digitalRead(irReceiver_b);

int check(void) {
static char lastA=0,lastB=0;
if(lastA != ira) {
    if(ira==1 && irb==1)
      return -1;
}
if(lastB != irb) {
    if(irb==1 && ira==1)
      return 1;
}
lastA = ira;
lastB = irb;
return 0;
}
}裡面 void loop() { 這段在編譯的時候會報錯
a function-definition is not allowed here before '{' token

請問這是哪裡錯了?

tuyn76801 發表於 2016-12-6 22:22:18

上面講錯了
報錯了的是 int check(void) { 這一行

croma 發表於 2016-12-7 10:35:17

本帖最後由 croma 於 2016-12-7 10:36 編輯

回復 7# tuyn76801

因為你的括號是不對齊的 loop 函數的下括號勒

tuyn76801 發表於 2016-12-7 12:22:43

對不起不是很懂,所謂括號不對齊是甚麼意思?
loop的下括號的話在19行

croma 發表於 2016-12-7 17:33:55

回復 9# tuyn76801
你一個函數包裹另一個函數,不是每個編譯器都支援這種語法

tuyn76801 發表於 2016-12-7 19:16:37

謝謝指點,現在把他全部宣告在外面就可以了const int irReceiver_a = 2;                // IRA
const int irLed_a= 3;                  
const int irReceiver_b = 4;                // IRB
const int irLed_b= 5;                  
const unsigned int frequency = 38000;    // 發射頻率(單位: Hz)

void setup() {               
Serial.begin(9600);                  // 開啟 Serial port, 通訊速率為 9600 bps
pinMode(irReceiver_a, INPUT);         // 把 irReceiverin 接腳設置為 INPUT
pinMode(irLed_a, OUTPUT);               // 把 irLedin 接腳設置為 OUTPUT
pinMode(irReceiver_b, INPUT);         // 把 irReceiverout 接腳設置為 INPUT
pinMode(irLed_b, OUTPUT);               // 把 irLedout 接腳設置為 OUTPUT

tone(irLed_a, frequency);               // 產生指定頻率的脈波 (Pulses)
tone(irLed_b, frequency);
}

int ira = digitalRead(irReceiver_a);
int irb = digitalRead(irReceiver_b);
int check(void) {
    static char lasta=0,lastb=0;
    if(lasta!=ira) {
      if(ira==1&&irb==1) {
      Serial.println("IN");
      return 1;
      }
    }
    if(lastb!=irb) {
      if(irb==1&&ira==1) {
      Serial.println("OUT");
      return -1;
      }
    }
    lasta=ira;
    lastb=irb;
    return 0;
}
int p;
void loop() {
int c = check();
if(c != 0) {
    p = p + c;            
    Serial.println(c);
    Serial.println(p);
}
}接下來就是上傳來實驗看看

tuyn76801 發表於 2016-12-9 14:36:59

現在遇到的問題
(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:26

宣告在外面,程式寫裡面即可
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:09

恩 謝謝 我這樣修改試試看
頁: [1]
查看完整版本: 新手求助