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
那個 不好意思 我又有問題了....
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
上面講錯了
報錯了的是 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
謝謝指點,現在把他全部宣告在外面就可以了
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
現在遇到的問題
(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