BluemixでRaspberryPi2のセンサーデータを拾う (4)センサーを付けてデータを拾う　温度センサーデジタル編（リベンジ）

#<i class="fa fa-cubes" style="font-size:1em;"></i>概要
[BluemixのRaspberryPi登録レシピ](https://developer.ibm.com/recipes/tutorials/raspberry-pi-4/)に登場する[デバイス用のsampleプログラム](https://github.com/ibm-messaging/iot-raspberrypi/releases/tag/1.0.2)は、どんなにセンサーがたくさん付いていようが固定の4項目のデータのみをBluemixに送信する作りになっている。

Raspberry Pi 2にセンサーを付け加えて固定4項目以外のデータをBluemixで取得するには、[sampleプログラムのソースコード](https://github.com/ibm-messaging/iot-raspberrypi/blob/master/samples/c/)を修正してビルドすれば良い。その方法を整理する。

整理している内に長くなってきたので、(1)Sampleプログラムの仕組みの整理と(2)どこをどのように変更すればよいのかを分けることにした。

[(1)　仕組みの理解](http://qiita.com/getapojim/items/b76ea2cfadaff6dfd159)
[(2)　センサーを付けてデータを拾う　温度センサーデジタル編](http://qiita.com/getapojim/items/0f2b5178bfaddafcde9f)
[(3)　センサーを付けてデータを拾う　温度センサーアナログ編](http://qiita.com/getapojim/items/12e5cb64a8046ab033e9)
(4)　センサーを付けてデータを拾う　温度センサーデジタル編（リベンジ）　(これ)
[(5)　センサーを付けてデータを拾う　温度・湿度・気圧まとめて採取編](http://qiita.com/getapojim/items/dfa526ece3af603b981e)
番外編 [『ムック「日経Linux ラズパイマガジン 2015年春号 」電子工作入門キット パーツセット』に入っていたもの](http://qiita.com/getapojim/items/c90edd38c0ad9d5eb379)

#<i class="fa fa-cube" style="font-size:1em;"></i>リベンジのポイント
##はんだ付け
[『ムック「日経Linux ラズパイマガジン 2015年春号 」電子工作入門キット パーツセット』に入っていたもの](http://qiita.com/getapojim/items/c90edd38c0ad9d5eb379)の中で、唯一はんだ付けが必要だったADT7410。
これだけのためにはんだごてやらはんだやら買うのをためらっていたところ、[『はんだづけカフェ』](http://handazukecafe.com/)なる所を発見！
無料ではんだ付けができる。中学以来のはんだ付けで色々不安だったが、無事はんだ付け完了。
スタッフさんが親切で、私のような素人におススメ。


#<i class="fa fa-cube" style="font-size:1em;"></i>回路（ネタ）
ムック「日経Linux ラズパイマガジン 2015年春号 」第3部 はじめての電子工作ステップ50の内、「No.21 I2Cを有効にしてアドレスをチェック　温度センサーを読んでみよう」に記載されている回路でやってみる。

掲載されていた図（Excelで作図）
![温度を測定するための回路.png](https://qiita-image-store.s3.amazonaws.com/0/85506/36e85498-ce4d-b29a-0310-8058f14b5e15.png)

#<i class="fa fa-cube" style="font-size:1em;"></i>回路（設計）
元ネタの図の通りにFritzingで作ってみた。
ADT7410のパーツはここからから入手して、[Fritzing](http://fritzing.org/download/)にインポートした。
https://github.com/MozOpenHard/examples/blob/master/i2c-ADT7410/ADT7410.fzz
![温度を測定するための回路2.png](https://qiita-image-store.s3.amazonaws.com/0/85506/3b1d8ca2-fa2b-9743-1f07-ba5f84826c0e.png)

#<i class="fa fa-cube" style="font-size:1em;"></i>回路（実装）
Fritzingで作った絵の通りにつなげてみた。
ADT7410は、**今度ははんだ付けしてある**　←リベンジポイント
![温度デジタル_回路(実装)リベンジ.jpg](https://qiita-image-store.s3.amazonaws.com/0/85506/b84211f0-167d-64a6-6593-7fbd4e84d237.jpeg)

#<i class="fa fa-cube" style="font-size:1em;"></i>Raspberry Pi 2上でI2Cの有効化
作業はRaspberry Pi 2にログインして行う。
実行時ユーザは次の通り
$ : pi
\# : root

##WiringPiの導入
`# cd /var/tmp`
`# git clone git://git.drogon.net/wiringPi`
`# cd wiringPi`
`# ./build`

導入確認のためにバージョンを確認してみる。
`# gpio -v`
バージョンが表示されること。

##I2C有効化
Raspberry Pi 2はraspi-configから設定する。
`# raspi-config`

「8 Advanced Options」を選択して、「Select」を押下
![I2C有効化1.png](https://qiita-image-store.s3.amazonaws.com/0/85506/fa010037-ad76-44f2-02ce-a801720b2dd4.png)

「A7 I2C」を選択して、「Select」を押下
![I2C有効化2.png](https://qiita-image-store.s3.amazonaws.com/0/85506/f2cefe9e-06cd-b0e9-9108-bc3d12ce313b.png)

「はい」を押下
![I2C有効化3.png](https://qiita-image-store.s3.amazonaws.com/0/85506/503bfe65-0895-dc15-a0a1-2764a104d544.png)

「了解」を押下
![I2C有効化4.png](https://qiita-image-store.s3.amazonaws.com/0/85506/504e2fea-ac0f-a89d-feea-67e2a6d0e6cc.png)

「はい」を押下
![I2C有効化5.png](https://qiita-image-store.s3.amazonaws.com/0/85506/5e9dc6a1-89f4-2098-e945-948a1a8f5ede.png)

「了解」を押下
![I2C有効化6.png](https://qiita-image-store.s3.amazonaws.com/0/85506/f5e0055f-663b-6348-2dbe-f2584050ca22.png)

「Finish」を押下。どれが選択されていても良い。
![I2C有効化7.png](https://qiita-image-store.s3.amazonaws.com/0/85506/4b420e82-90aa-9077-649a-cbaa4fb12e1a.png)

「はい」を押下。再起動される。
![I2C有効化8.png](https://qiita-image-store.s3.amazonaws.com/0/85506/b7ff4425-541b-800f-97e6-737f59f9d874.png)

再起動後にI2C用のモジュールが読み込まれていることを確認する。
`$ lsmod | grep i2c`
「i2c_bcm2708」が表示されること。

##I2C用ツールのインストール
`# apt-get -y install i2c-tools`
`# reboot`

##デバイスのアドレス確認
`# i2cdetect -y 1`
![I2Cアドレス表示された.png](https://qiita-image-store.s3.amazonaws.com/0/85506/a2f29c6b-3932-07ac-f5cd-c8dff65bdae7.png)
アドレス(48)が表示されること。


#<i class="fa fa-cube" style="font-size:1em;"></i>Raspberry Pi 2上で温度を読んでみる

ムック読者限定サイトに用意されたプログラム「adt7410.c」をコンパイル・実行してみる。
画面に温度を出力する。5秒間隔で20回。
センサーを指でつまむと温度が上がり、離すと下がる。

`$ mkdir -p ~/bin`
`$ cd ~/bin`
`$ ll adt7410.c`
`$ gcc -o adt7410 adt7410.c -lwiringPi`
`# ./adt7410`

画面出力例）
`t:27.625000      d:0xd00d -> msb:0xd0d00 lsb:0xd0 -> v:0442`
v　：　読み取った値
t　：　温度　(v / 16で計算した結果)

![温度を出力してみる_デジタル.png](https://qiita-image-store.s3.amazonaws.com/0/85506/2769105c-1fae-a432-e437-76dbf8123f0b.png)


#<i class="fa fa-cube" style="font-size:1em;"></i>プログラムの改修内容

[BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラム](https://github.com/ibm-messaging/iot-raspberrypi/releases/tag/1.0.2)を次の通り修正する。
[修正前のソースコードはこちらで参照可能](https://github.com/ibm-messaging/iot-raspberrypi/tree/master/samples/c)

|修正するファイル|新規で追加するファイル|
|:--|:--|
|iotmain.c<br>iot.h<br>jsonator.c<br>Makefile|adt7410.c|

追加・修正内容は以下の通り。

修正内容1

```c:iotmain.c(修正前　61行目)

```

```c:iotmain.c(修正後)
//adt7410.c
float getAdt7410Temp();

```

修正内容2

```c:iotmain.c(修正前　152～153行目)
		JsonMessage json_message = { DEVICE_NAME, getCPUTemp(), sineVal(
				MIN_VALUE, MAX_VALUE, 16, count), GetCPULoad() };
```

```c:iotmain.c(修正後)
		JsonMessage json_message = { DEVICE_NAME, getCPUTemp(), sineVal(
				MIN_VALUE, MAX_VALUE, 16, count), GetCPULoad(), getAdt7410Temp() };
```

修正内容3

```c:iot.h(修正前　22～27行目)
  struct json {
	  char myname[100];
	  float cputemp;
	  float sine;
	  float cpuload;
  };
```

```c:iot.h(修正後)
  struct json {
	  char myname[100];
	  float cputemp;
	  float sine;
	  float cpuload;
	  float adt7410temp;
  };
```

修正内容4

```c:jsonator.c(修正前　51行目)

```

```c:jsonator.c(修正後)
	strcat(jsonReturned, ",");

	strcat(jsonReturned, "\"adt7410temp\":");
	sprintf(buffer, "%.2f", passedrpi.adt7410temp);
	strcat(jsonReturned, buffer);

```

修正内容5

```c:Makefile(修正前　12～14行目)
iot: iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c iot.h jsonReader.c
	export LIBRARY_PATH=$(COMPILELIBDIR):$(LIBRARY_PATH)
	$(CC) iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c cJSON.c jsonReader.c -o $@ -l$(LIBNAME) -lpthread -lssl -lm -L $(COMPILELIBDIR) -I .
```

```c:Makefile(修正後)
iot: iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c iot.h jsonReader.c adt7410.c
	export LIBRARY_PATH=$(COMPILELIBDIR):$(LIBRARY_PATH)
	$(CC) iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c cJSON.c jsonReader.c adt7410.c -o $@ -l$(LIBNAME) -lpthread -lssl -lwiringPi -lm -L $(COMPILELIBDIR) -I .
```

追加内容1　（ムック読者限定サイトに用意されたプログラム「adt7410.c」をベースに作成）

```c:adt7410.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wiringPi.h>

const int DEV_ID   = 0x48; // ADT7410のデバイスID
const int DATA_REG = 0x00; // 温度レジスタ

float getAdt7410Temp();

float getAdt7410Temp() {
  float t = 0; // 温度
  int i = 0;   // カウンタ
  int fd = wiringPiI2CSetup(DEV_ID);
  if (fd < 0) {
    printf("ADT7410 error.\n");
    return EXIT_FAILURE;
  }
  int d = wiringPiI2CReadReg16(fd, DATA_REG); // 温度レジスタから16bit取得
  int msb = (0xFF & d) << 8;   // MSBの値を取得
  int lsb = (0xFF00 & d) >> 8; // LSBの値を取得
  int v = (msb + lsb) >> 3;    // 下位3ビットを除く13ビットが温度データ
  if (v > 4096) {              // データシートの式に従って算出
    t = (v - 8192) /16.0;
  } else {
    t = v / 16.0;
  }
  return t;
}
```

#<i class="fa fa-cube" style="font-size:1em;"></i>プログラムの改修手順
作業はRaspberryPi2にログインして行う。
実行時ユーザは次の通り
$ : pi
\# : root

1. 設定ファイルの退避
`# cd /etc/iotsample-raspberrypi/`
``# cp -p device.cfg device.cfg.`date +%Y%m%d`_1``
※これで、アンインストール(dpkg -P)してもフォルダとバックアップファイルが残るので安心。

2. 必要パッケージのインストール
`# apt-get install dpkg-dev build-essential devscripts`
`# apt-get install libssl-dev`

3. ソースコード一式を入手
`$ cd ~`
`$ git clone https://github.com/ibm-messaging/iot-raspberrypi.git`

4. ソースコード修正・追加
`$ cd ~/iot-raspberrypi/samples/c/`
`$ vi iotmain.c`
`$ vi iot.h`
`$ vi jsonator.c`
`$ vi Makefile`
`$ vi adt7410.c`

5. ビルド
`$ debuild -b`
署名のエラーは無視する。

#<i class="fa fa-cube" style="font-size:1em;"></i>iotサービスの再インストール

1. アンインストール（古いのを）
`# dpkg -P iot`

2. インストール
`# cd /home/pi/iot-raspberrypi/samples/`
`# dpkg -i ./iot_1.0-1_armhf.deb`

3. サービスの確認
`# service iot status`
※起動している(okが表示される)こと。

4. 設定ファイル作成
`# cd /etc/iotsample-raspberrypi/`
``# cp -p device.cfg.`date +%Y%m%d`_1 device.cfg``
※6.でいったん削除されてしまうので、1.で退避したファイルで復元

5. サービスの再起動
`# service iot restart`
※起動している(okが表示される)こと。

6. 起動モードの確認
`# service iot getdeviceid`
※registerd mode で起動している(registerd modeが表示される)こと。

#<i class="fa fa-cube" style="font-size:1em;"></i>Bluemix IoT Foundationサービスで確認
IoT Foundationのダッシュボードで、センサー情報欄にて確認する。
センサーの温度データを受信できた！
![BluemixでADT7410の温度を表示.png](https://qiita-image-store.s3.amazonaws.com/0/85506/468298c3-cf86-ff16-10c7-8c5346cb0b7a.png)

#<i class="fa fa-cube" style="font-size:1em;"></i>所感
あいかわらず「/sys/class/gpio配下を参照する」という流れになっていない。。。




#<i class="fa fa-cube" style="font-size:1em;"></i>環境

[Raspberry Pi 2 Model B](https://www.raspberrypi.org/products/raspberry-pi-2-model-b/)
[Raspbian](https://www.raspberrypi.org/downloads/raspbian/)

#<i class="fa fa-book" style="font-size:1em;"></i>参考
Fritzingダウンロード
http://fritzing.org/download/

Fritzing用のADT7410のパーツ
https://github.com/MozOpenHard/examples/blob/master/i2c-ADT7410/ADT7410.fzz

はんだづけカフェ
http://handazukecafe.com/