Raspberry Pi 3に、Rainbow HATを装着して、AndroidThingsのアプリを書いてみた

# Rainbow HAT
AndroidThingsのサンプルアプリでも使われている、[Rainbow HAT](https://shop.pimoroni.com/products/rainbow-hat-for-android-things)が届いたので、動作チェックも兼ねてプログラムを書いてみた。

![th_IMG_2182.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/10fafe81-f914-00e8-cc8b-bb88aa295355.jpeg)![th_IMG_2184.jpg](https://qiita-image-store.s3.amazonaws.com/0/33220/cdcdd3ba-c69e-6982-82e3-c6b472b0b21e.jpeg)



#環境
Android Studio 2.3.3
Raspberry Pi 3 (image androidthings_rpi3_devpreview_1.zip)
Rainbow HAT

#プロジェクトの作成
こちらに関しては、以前投稿した[Android Things 用の空のプロジェクトの作り方]( http://qiita.com/KazuyukiEguchi/items/7f90d03b5768fb646afd)を参照のこと

#ライブラリーの追加
build.grade(app)に追記下記を追記します。

```build.grade
compile 'com.google.android.things.contrib:driver-rainbowhat:0.1'
```

import文を追加する

```MainActivity.java
import com.google.android.things.contrib.driver.rainbowhat.RainbowHat;
```


#搭載されてい赤、緑、青の単色LEDをコントロールする例

import文を追加する

```MainActivity.java
import com.google.android.things.pio.Gpio;
import java.io.IOException;
```

グローバル変数の定義

```MainActivity.java
private Gpio led1 = null;
private Gpio led2 = null;
private Gpio led3 = null;
```


```MainActivity.java
    @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文を追加する

```MainActivity.java
import com.google.android.things.contrib.driver.pwmspeaker.Speaker;
import java.io.IOException;
```

グローバル変数の定義

```MainActivity.java
private Speaker buzzer = null;
```

```MainActivity.java
    @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文を追加する

```MainActivity.java
import com.google.android.things.contrib.driver.ht16k33.AlphanumericDisplay;
import com.google.android.things.contrib.driver.ht16k33.Ht16k33;
import java.io.IOException;
```

グローバル変数の定義

```MainActivity.java
private AlphanumericDisplay segment = null;
```

```MainActivity.java
    @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());
        }

    }
```

#７つのフルカラーLEDをコントロールする例

import文を追加する

```MainActivity.java
import android.graphics.Color;
import com.google.android.things.contrib.driver.apa102.Apa102;
import java.io.IOException;
```

グローバル変数の定義

```MainActivity.java
private Apa102 ledstrip = null;
```

```MainActivity.java
    @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文を追加する

```MainActivity.java
import com.google.android.things.contrib.driver.button.Button;
import java.io.IOException;
```

グローバル変数の定義

```MainActivity.java
private Button buttonA = null;
private Button buttonB = null;
private Button buttonC = null;
```

```MainActivity.java
    @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文を追加する

```MainActivity.java
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;
```

グローバル変数の定義

```MainActivity.java
private Bmx280SensorDriver mSensorDriver = null;
private SensorManager sensorManager = null;
```

```MainActivity.java
    @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なので、本来は、湿度も取れますが、ライブラリに実装されていないようです。

以上、ご参考までに