Robofun 機器人論壇

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

用人體紅外線感測器判斷人體進門和出門 問題

[複製鏈接]
跳轉到指定樓層
1#
發表於 2018-11-18 20:58:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 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,以判段是進門還是出門,可是每次都兩個燈都不亮,我很確定我的原件沒有壞掉,接線也沒有錯誤,因為我測試很多次了(原件測試),都沒有問題,我想知道我這程式真的可以達到我的目的嗎?是哪裡需要改嗎?還是說我這樣寫根本不行?

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






2#
發表於 2018-11-19 09:05:21 | 只看該作者
這樣寫有問題,
你的寫法可以簡化成
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 的狀態,
當有變化的時候再處理
才有辦法判斷
3#
 樓主| 發表於 2018-11-19 10:08:49 來自手機 | 只看該作者
謝謝你幫我找出錯誤,我知到要用你說的方式這樣判斷,但是我不知道要怎麼用程式表達出來,可以的話麻煩告訴我方法,我也會繼續嘗試。
4#
發表於 2018-11-19 10:47:10 | 只看該作者
另外宣告兩個變數, 代表上一次的狀態
初始值給 -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
}

前提是..不能兩個紅外線感測器同時被遮到
5#
 樓主| 發表於 2018-11-19 21:22:03 來自手機 | 只看該作者
我試了您的方法,但是還是不行,兩個燈都沒有亮,元件動作正常,就是沒辦法觸發判斷式裡的東西,QQ
6#
發表於 2018-11-20 05:50:54 | 只看該作者
改成
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
}
}
如果還不行,請把程式碼貼出來看看
9#
 樓主| 發表於 2018-11-21 19:44:55 | 只看該作者
謝謝你熱心的幫忙~
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-21 20:49 , Processed in 0.141200 second(s), 6 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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