Android Things入門(mén)-控制GPIO

(1) Android Things入門(mén)-環(huán)境搭建

上一篇簡(jiǎn)單的敘述一下Android Things系統(tǒng)的安裝和環(huán)境配置眷蚓,在文章最后我們導(dǎo)入了一個(gè)模板樣例酪刀,使用Android Studio進(jìn)行了編譯和下載。環(huán)境也搭建好了汤纸,應(yīng)用也都可以正常下載了,那接著就該對(duì)樹(shù)莓派已有的接口和Android Things的功能進(jìn)一步學(xué)習(xí)了。

我還是在 new-project-template 這個(gè)空白模板里學(xué)習(xí)GPIO控制的檐嚣,而沒(méi)有直接去看官方的GPIO例程,是希望自己可以寫(xiě)幾行代碼啰扛,出錯(cuò)了之后也能明白哪里的問(wèn)題嚎京。

先介紹一下硬件電路連接,開(kāi)關(guān)的一端連接輸入引腳GPIO7隐解,另一端連接GND挖藏;LED發(fā)光二極管正極接GPIO0,負(fù)極接GND厢漩。(關(guān)于樹(shù)莓派3引腳圖可自行搜索)

連接圖

我們要實(shí)現(xiàn)當(dāng)開(kāi)關(guān)按下之后LED亮膜眠,松開(kāi)開(kāi)關(guān)后LED滅,是嵌入式入門(mén)最基礎(chǔ)的GPIO操作。

接著看程序宵膨,MainActivity繼承Activity之后重寫(xiě)了父類的onCreate和onDestroy方法架谎,如果打開(kāi)調(diào)試窗口里的Android Monitor可以看到下載之后啟動(dòng)會(huì)打印onCreate方法里的輸出提示,我們就在onCreate方法里面處理GPIO讀寫(xiě)功能辟躏。

在MainActivity中加入兩個(gè)私有成員變量

private Gpio inputPin; // 輸入引腳
private Gpio outputPin; // 輸出引腳

把鼠標(biāo)停留在當(dāng)前行谷扣,按Alt+Enter可導(dǎo)入包含Gpio的包。

在onCreate方法里對(duì)這兩個(gè)引腳進(jìn)行設(shè)置

PeripheralManagerService service = new PeripheralManagerService();
try {
    inputPin = service.openGpio("BCM4");
    inputPin.setDirection(Gpio.DIRECTION_IN);
    inputPin.setActiveType(Gpio.ACTIVE_HIGH);

    outputPin = service.openGpio("BCM17");
    outputPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
}
catch(IOException e) {}

我們需要實(shí)例化GPIO處理類PeripheralManagerService捎琐,初始化輸入引腳打開(kāi)“BCM4”引腳對(duì)應(yīng)GPIO7(樹(shù)莓派有幾種不同的引腳命名方式)会涎,設(shè)置引腳為輸入,設(shè)置引腳懸空時(shí)為高電平瑞凑。初始化輸出引腳打開(kāi)“BCM17”引腳對(duì)應(yīng)GPIO0末秃,設(shè)置輸出默認(rèn)為低電平。

檢測(cè)GPIO可以有輪詢中斷兩種方式籽御。
我們首先介紹輪詢方式练慕,就是不斷的讀輸入IO的電平值。因此我們?cè)趏nCreate方法里新建一個(gè)線程啟動(dòng)之后不斷的讀輸入IO的值技掏,對(duì)應(yīng)的改變輸出IO的值來(lái)控制LED發(fā)光铃将。

(new Thread(new Runnable() {
    @Override
    public void run() { 
        try {
            while (true) {  // 線程中死循環(huán)的讀inputPin對(duì)應(yīng)IO的值
                boolean status = inputPin.getValue();
                if (status) {
                    outputPin.setValue(true);  // 如果status為true,我們就設(shè)置outputPin為true哑梳,則LED亮
                }
                else {
                    outputPin.setValue(false);
                }
                Thread.sleep(5000);
             }
       }
       catch(Exception e) 
       { 
            e.printStackTrace();
       }
   }
})).start();

中斷方式在Android Things中用監(jiān)聽(tīng)器來(lái)封裝劲阎,我們對(duì)輸入引腳設(shè)置監(jiān)聽(tīng),如果被觸發(fā)則調(diào)用事件回調(diào)方法處理我們的邏輯鸠真。我們還是在onCreate這個(gè)方法里去實(shí)現(xiàn)哪工,把上面介紹的建立線程部分注釋掉防止沖突,留下輸入輸出的配置弧哎。我們以上升沿和下降沿都觸發(fā)的事件為例雁比,其他事件分別為

  • EDGE_NONE
  • EDGE_RISING
  • EDGE_FALLING
  • EDGE_BOTH
PeripheralManagerService service = new PeripheralManagerService();
try {
    inputPin = service.openGpio("BCM4");
    inputPin.setDirection(Gpio.DIRECTION_IN);
    inputPin.setActiveType(Gpio.ACTIVE_HIGH);
    gpioPin.setEdgeTriggerType(Gpio.EDGE_BOTH);  // 設(shè)置觸發(fā)事件類型

    outputPin = service.openGpio("BCM17");
    outputPin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);

    SensorCallBack callback = new SensorCallBack();
    gpioPin.registerGpioCallback(callback);  // 注冊(cè)我們的回調(diào)
}
catch(IOException e) {}

我們?cè)谏厦嬖O(shè)置了事件之后,必須創(chuàng)建一個(gè)回調(diào)類來(lái)處理這個(gè)事件的觸發(fā)撤嫩,這個(gè)回調(diào)類必須繼承GpioCallback偎捎,在MainActivity中最后面加入以下代碼

private class SensorCallBack extends GpioCallback {
    @Override
    public boolean onGpioEdge(Gpio gpio) { 
        try {
            boolean callBackState = gpio.getValue();
            if(callBackState) {
                outputPin.setValue(false);
            }
            else {
                outputPin.setValue(true);
            }
        }
        catch(IOException ioe) { 
            ioe.printStackTrace();
        } 
        return true;
    } 
    @Override
    public void onGpioError(Gpio gpio, int error) {
        super.onGpioError(gpio, error);
    }
}

在回調(diào)類里有兩個(gè)父類的方法需要我們重寫(xiě)來(lái)實(shí)現(xiàn)要處理的行為,一個(gè)是IO中斷觸發(fā)序攘,另一個(gè)IO異常錯(cuò)誤

  • public boolean onGpioEdge
  • public boolean onGpioError

最后編譯下載茴她,按照電路圖的接線方法,當(dāng)按鍵按下之后燈亮程奠,松開(kāi)之后燈滅丈牢。試試看吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞄沙,一起剝皮案震驚了整個(gè)濱河市己沛,隨后出現(xiàn)的幾起案子慌核,更是在濱河造成了極大的恐慌,老刑警劉巖申尼,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垮卓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡师幕,警方通過(guò)查閱死者的電腦和手機(jī)粟按,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霹粥,“玉大人灭将,你說(shuō)我怎么就攤上這事『罂兀” “怎么了庙曙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)忆蚀。 經(jīng)常有香客問(wèn)我矾利,道長(zhǎng)姑裂,這世上最難降的妖魔是什么馋袜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮舶斧,結(jié)果婚禮上欣鳖,老公的妹妹穿的比我還像新娘。我一直安慰自己茴厉,他們只是感情好泽台,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著矾缓,像睡著了一般怀酷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗜闻,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天蜕依,我揣著相機(jī)與錄音,去河邊找鬼琉雳。 笑死样眠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翠肘。 我是一名探鬼主播檐束,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼束倍!你這毒婦竟也來(lái)了被丧?” 一聲冷哼從身側(cè)響起盟戏,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晚碾,沒(méi)想到半個(gè)月后抓半,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡格嘁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年笛求,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕簿。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡探入,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出懂诗,到底是詐尸還是另有隱情蜂嗽,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布殃恒,位于F島的核電站植旧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏离唐。R本人自食惡果不足惜病附,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亥鬓。 院中可真熱鬧完沪,春花似錦、人聲如沸嵌戈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熟呛。三九已至宽档,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庵朝,已是汗流浹背吗冤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偿短,地道東北人欣孤。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像昔逗,于是被迫代替她去往敵國(guó)和親降传。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容