Rainbow HAT
AndroidThingsのサンプルアプリでも使われている、Rainbow HATが届いたので、動作チェックも兼ねてプログラムを書いてみた。
環境
Android Studio 2.3.3
Raspberry Pi 3 (image androidthings_rpi3_devpreview_1.zip)
Rainbow HAT
プロジェクトの作成
こちらに関しては、以前投稿したAndroid Things 用の空のプロジェクトの作り方を参照のこと
ライブラリーの追加
build.grade(app)に追記下記を追記します。
compile 'com.google.android.things.contrib:driver-rainbowhat:0.1'
import文を追加する
import com.google.android.things.contrib.driver.rainbowhat.RainbowHat;
搭載されてい赤、緑、青の単色LEDをコントロールする例
import文を追加する
import com.google.android.things.pio.Gpio;
import java.io.IOException;
グローバル変数の定義
private Gpio led1 = null;
private Gpio led2 = null;
private Gpio led3 = null;
    @Override
    protected void onResume() {
        Log.d(TAG,"onResume()");
        super.onResume();
        try {
            led1 = RainbowHat.openLed(RainbowHat.LED_RED);
            led1.setValue(true);
            led2 = RainbowHat.openLed(RainbowHat.LED_GREEN);
            led2.setValue(true);
            led3 = RainbowHat.openLed(RainbowHat.LED_BLUE);
            led3.setValue(true);
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    @Override
    protected void onPause() {
        Log.d(TAG,"onPause()");
        super.onPause();
        try {
            if(led1 != null) {
                led1.setValue(false);
                led1.close();
            }
            if(led2 != null) {
                led2.setValue(false);
                led2.close();
            }
            if(led3 != null) {
                led3.setValue(false);
                led3.close();
            }
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
ブザーをコントールする例
import文を追加する
import com.google.android.things.contrib.driver.pwmspeaker.Speaker;
import java.io.IOException;
グローバル変数の定義
private Speaker buzzer = null;
    @Override
    protected void onResume() {
        Log.d(TAG,"onResume()");
        super.onResume();
        try {
            buzzer = RainbowHat.openPiezo();
            buzzer.play(261);
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    @Override
    protected void onPause() {
        Log.d(TAG,"onPause()");
        super.onPause();
        try {
            if(buzzer != null) {
                buzzer.stop();
                buzzer.close();
            }
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
4桁のディスプレイをコントロールする例
import文を追加する
import com.google.android.things.contrib.driver.ht16k33.AlphanumericDisplay;
import com.google.android.things.contrib.driver.ht16k33.Ht16k33;
import java.io.IOException;
グローバル変数の定義
private AlphanumericDisplay segment = null;
    @Override
    protected void onResume() {
        Log.d(TAG,"onResume()");
        super.onResume();
        try {
            segment = RainbowHat.openDisplay();
            segment.setBrightness(Ht16k33.HT16K33_BRIGHTNESS_MAX);
            segment.setEnabled(true);
            segment.display("1234");
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    @Override
    protected void onPause() {
        Log.d(TAG,"onPause()");
        super.onPause();
        try {
            if(segment != null)
            {
                segment.close();
            }
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
7つのフルカラーLEDをコントロールする例
import文を追加する
import android.graphics.Color;
import com.google.android.things.contrib.driver.apa102.Apa102;
import java.io.IOException;
グローバル変数の定義
private Apa102 ledstrip = null;
    @Override
    protected void onResume() {
        Log.d(TAG,"onResume()");
        super.onResume();
        try {
            int[] rainbow = new int[7];
            ledstrip = RainbowHat.openLedStrip();
            ledstrip.setBrightness(1);
            for (int i = 0; i < rainbow.length; i++) {
                rainbow[i] = Color.HSVToColor(255, new float[]{i * 360.f / rainbow.length, 1.0f, 1.0f});
            }
            ledstrip.write(rainbow);
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    @Override
    protected void onPause() {
        Log.d(TAG,"onPause()");
        super.onPause();
        try {
            if(ledstrip != null)
            {
                ledstrip.close();
            }
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
タッチボタンのイベントを拾う
import文を追加する
import com.google.android.things.contrib.driver.button.Button;
import java.io.IOException;
グローバル変数の定義
private Button buttonA = null;
private Button buttonB = null;
private Button buttonC = null;
    @Override
    protected void onResume() {
        Log.d(TAG,"onResume()");
        super.onResume();
        try {
            buttonA = RainbowHat.openButton(RainbowHat.BUTTON_A);
            buttonA.setOnButtonEventListener(onEvent);
            buttonB = RainbowHat.openButton(RainbowHat.BUTTON_B);
            buttonB.setOnButtonEventListener(onEvent);
            buttonC = RainbowHat.openButton(RainbowHat.BUTTON_C);
            buttonC.setOnButtonEventListener(onEvent);
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    @Override
    protected void onPause() {
        Log.d(TAG,"onPause()");
        super.onPause();
        try {
            if(buttonA != null) {
                buttonA.close();
            }
            if(buttonB != null) {
                buttonB.close();
            }
            if(buttonC != null) {
                buttonC.close();
            }
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    Button.OnButtonEventListener onEvent = new Button.OnButtonEventListener() {
        @Override
        public void onButtonEvent(Button button, boolean pressed) {
            if(button == buttonA)
            {
                Log.d(TAG,"Button A");
            }
            if(button == buttonB)
            {
                Log.d(TAG,"Button B");
            }
            if(button == buttonC)
            {
                Log.d(TAG,"Button C");
            }
        }
    };
温度、気圧の値をイベントで取得する
import文を追加する
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import com.google.android.things.contrib.driver.bmx280.Bmx280SensorDriver;
import java.io.IOException;
グローバル変数の定義
private Bmx280SensorDriver mSensorDriver = null;
private SensorManager sensorManager = null;
    @Override protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG,"onCreate()");
        super.onCreate(savedInstanceState);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        try {
            mSensorDriver = new Bmx280SensorDriver(RainbowHat.BUS_SENSOR);
            mSensorDriver.registerTemperatureSensor();
            mSensorDriver.registerPressureSensor();
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    @Override
    protected void onResume() {
        Log.d(TAG,"onResume()");
        super.onResume();
        List<Sensor> lists = sensorManager.getDynamicSensorList(Sensor.TYPE_ALL);
        for(int i = 0 ; i< lists.size() ; i++)
        {
            Log.d(TAG,"" + lists.get(i).toString());
            sensorManager.registerListener(onEvent2, lists.get(i), SensorManager.SENSOR_DELAY_NORMAL);
        }
    }
    @Override
    protected void onPause() {
        Log.d(TAG,"onPause()");
        super.onPause();
        try {
            if(mSensorDriver != null) {
                mSensorDriver.unregisterTemperatureSensor();
                mSensorDriver.unregisterPressureSensor();
                mSensorDriver.close();
            }
            sensorManager.unregisterListener(onEvent2);
        } catch (IOException e) {
            Log.d(TAG,e.toString());
        }
    }
    SensorEventListener onEvent2 = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            if(sensorEvent.sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE) {
                Log.d(TAG, "TEMPERATURE=" + sensorEvent.values[0]);
            }
            else if(sensorEvent.sensor.getType() == Sensor.TYPE_PRESSURE)
            {
                Log.d(TAG,"PRESSURE="+ sensorEvent.values[0]);
            }
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
        }
    };
動かしてみて
温度を取得してみるとわかるのですが、室温となんか違うなあと思うと思います。
Rainbow HATのBMP280が設置されている場所をみると、Raspberry Pi3のCPUの上にあることがわかりますってことは・・・
温度はご参考までにって感じです。
搭載されているセンサーはBMP280なので、本来は、湿度も取れますが、ライブラリに実装されていないようです。
以上、ご参考までに

