Robofun 機器人論壇

標題: 用人體紅外線感測器判斷人體進門和出門 問題 [打印本頁]

作者: frongle    時間: 2018-11-18 20:58
標題: 用人體紅外線感測器判斷人體進門和出門 問題
本帖最後由 frongle 於 2018-11-18 20:58 編輯

小弟我想用兩個人體紅外線感測器來(HC-SR501)判斷人是<進門>還是<出門>,有看到網路上有人做出這樣的功能,但沒有給出程式碼,我想到破頭都想不出來,希望有大神能幫我指點一下,對於寫程式我還只是新手,很多還不太懂,懇請賜教!以下是依我個人想法寫的程式


int sensor1 = 9;  //訊號線
int sensor2 = 8;
int led1 = 2;
int led2 = 4;

void setup()
{
Serial.begin(9600);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);  
}

void loop()
{
int a , b ;
a = digitalRead(sensor1);
b = digitalRead(sensor2);
if(a == 1)
{
  if(b == 1)
  digitalWrite(led1,HIGH);
}

else if(b == 1)
{
  if(a == 1)
  digitalWrite(led2,HIGH);
}
else
{
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}
}

我會這樣寫是想判斷是哪邊的感測器先感測到1,然後換另一邊再感測到1,以判段是進門還是出門,可是每次都兩個燈都不亮,我很確定我的原件沒有壞掉,接線也沒有錯誤,因為我測試很多次了(原件測試),都沒有問題,我想知道我這程式真的可以達到我的目的嗎?是哪裡需要改嗎?還是說我這樣寫根本不行?

希望有人能幫助我, 謝謝!







作者: 超新手    時間: 2018-11-19 09:05
這樣寫有問題,
你的寫法可以簡化成
f((a == 1) && (b == 1)) {
  digitalWrite(led1,HIGH);
} else if((b == 1) && (a == 1)) {
  digitalWrite(led2,HIGH);
} else {
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}
然後第一個判斷式和第二個判斷式根本一樣, 所以又變成
f((a == 1) && (b == 1)) {
  digitalWrite(led1,HIGH);
}  else {
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
}
所以才不會亮
只要同時遮住兩個就會亮了

當通過的時候, 步驟應該是
(sensor1, sensor2) =  (0, 0)
(sensor1, sensor2) =  (1, 0)
(sensor1, sensor2) =  (0, 1)
(sensor1, sensor2) =  (0, 0)
如果從另一邊,
(sensor1, sensor2) =  (0, 0)
(sensor1, sensor2) =  (0, 1)
(sensor1, sensor2) =  (1, 0)
(sensor1, sensor2) =  (0, 0)
你要記住前一次 sensor1 和 sensor2 的狀態,
當有變化的時候再處理
才有辦法判斷

作者: frongle    時間: 2018-11-19 10:08
謝謝你幫我找出錯誤,我知到要用你說的方式這樣判斷,但是我不知道要怎麼用程式表達出來,可以的話麻煩告訴我方法,我也會繼續嘗試。
作者: 超新手    時間: 2018-11-19 10:47
另外宣告兩個變數, 代表上一次的狀態
初始值給 -1
int pa = -1, pb = -1;
如果 pa 不等於 a, 或 pb不等於 b (表示狀態改變)
{
如果 pa = 1, 且 pb = 0, 且 a = 0, b = 1; 就是進門
如果 pa = 0, 且 pb = 1 , 且 a = 1, b = 0; 就是出門
然後更新 pa 和 pb 的值, 也就是
pa 等於 a
pb 等於 b
}

前提是..不能兩個紅外線感測器同時被遮到

作者: frongle    時間: 2018-11-19 21:22
我試了您的方法,但是還是不行,兩個燈都沒有亮,元件動作正常,就是沒辦法觸發判斷式裡的東西,QQ
作者: 超新手    時間: 2018-11-20 05:50
改成
if(a == 1, 或 b== 1)
{
if( pa == 1, 且 pb == 0, 且 a == 0, b == 1){
就是進門
pa=-1
pb=-1
} else if(pa == 0, 且 pb == 1 , 且 a == 1, b == 0){
就是出門
pa=-1
pb=-1
}
else {
pa = a
pb = b
}
}
如果還不行,請把程式碼貼出來看看
作者: frongle    時間: 2018-11-21 14:20
有成功了
作者: frongle    時間: 2018-11-21 15:29
有成功了
作者: frongle    時間: 2018-11-21 19:44
謝謝你熱心的幫忙~




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