前言
在上一篇樹莓派Android Things使用超聲波測距模塊HC-SR04文章中,簡單的介紹了超聲波模塊的使用,本篇介紹下人體紅外感應模塊HC-SR501在刷入了Android Things的樹莓派中的使用方法。由于上一篇已經介紹了樹莓派和Android Things的基本信息,本篇將不再贅述,直接提供接線方法和代碼,如果你沒有基本的樹莓派運行環境,建議看一下上一篇了解下。
操作步驟
準備以下物品
硬件
- 樹莓派 * 1(假定是一個可以啟動的樹莓派,包含電源線、8G以上的TF卡,已經刷入了Android Things。沒有刷入的看官方操作方法,包含(Linux、Mac、Windows)刷入即可)
- 杜邦線 若干
- HC-SR501人體感應模塊 * 1
HC-SR501人體感應模塊簡單介紹
某度的文檔HC-SR501人體感應模塊
HC-SR501紅外感應模塊
HC-SR501人體感應模塊一共有三個針腳,比超聲波測距少了一個,看一下三個針腳分別什么用途。
VCC:電源(Volt Current Condenser) 接樹莓派5v電源即可。
OUT:輸出針腳,當傳感器收到感應時,從此針腳輸出數據。
GND:接地線,接樹莓派的Ground口即可。
軟件環境
- Android Things 系統鏡像(官網下載,選擇Raspberry Pi的鏡像)
- Android Studio
將HC-SR501和樹莓派連接起來
VCC:我接入了樹莓派4口。
OUT:我接入了樹莓派7口,即BCM4。(PS:DEMO代碼接收針腳也是BCM4,如果此處你換針腳,注意修改代碼)
GND:接入樹莓派39口。(PS:本次例子我買了一包電阻,所以GND多接了個10K阻值的電阻。)
可能接線有點亂,再梳理一下。VCC(藍線)、OUT(紅線)都是直接接樹莓派的,GND(黑線)接面包板接電阻后(白線)再接入的樹莓派。多說一句,本次例子我多用了個盒子,是因為我在查資料的時候,有一篇文章說HC-SR501如果直接暴露在外可能會誤報,所以找了個盒子裝了起來。
編譯工程到樹莓派上
將我寫的Android Things HC-SR04超聲波模塊測距Demo克隆到本地,用的上一篇的工程,我在里面新建了一個Module。用Android Studio打開,將已經連接好傳感器的樹莓派電源打開,在Andorid Studio的Terminal中輸入
adb connect <ip-address>
連接到你的樹莓派,Run hongwai Module即可。如果成功當有人從傳感器前經過的時候可以從LOG中看到結果。
關鍵代碼
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.GpioCallback;
import com.google.android.things.pio.PeripheralManagerService;
import java.io.IOException;
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private Gpio mInputGpio;
private final String pinInput = "BCM4";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "Starting MainActivity");
PeripheralManagerService peripheralManagerService = new PeripheralManagerService();
try {
mInputGpio = peripheralManagerService.openGpio(pinInput);//Echo針腳
mInputGpio.setDirection(Gpio.DIRECTION_IN);//將引腳初始化為輸入
mInputGpio.setActiveType(Gpio.ACTIVE_HIGH);//設置收到高電壓是有效的結果
//注冊狀態更改監聽類型 EDGE_NONE(無更改,默認)EDGE_RISING(從低到高)EDGE_FALLING(從高到低)
mInputGpio.setEdgeTriggerType(Gpio.EDGE_BOTH);
mInputGpio.registerGpioCallback(mGpioCallback);//注冊回調
} catch (IOException e) {
e.printStackTrace();
}
}
private GpioCallback mGpioCallback = new GpioCallback() {
@Override
public boolean onGpioEdge(Gpio gpio) {
try {
if (gpio.getValue()) {
Log.e("有人來了", gpio.getValue() + ":1111111111111");
} else {
Log.e("沒有人", gpio.getValue() + ":222222222222");
}
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
@Override
public void onGpioError(Gpio gpio, int error) {
super.onGpioError(gpio, error);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if (mInputGpio != null) {
try {
mInputGpio.close();
} catch (IOException e) {
Log.w(TAG, "Unable to close mEchoGpio", e);
} finally {
mInputGpio = null;
}
}
mInputGpio.unregisterGpioCallback(mGpioCallback);
}
}