Sigfox Sens'it SDKで簡単IoT組み込み開発(2)

はじめに、[前の投稿](https://qiita.com/ghibi/items/220719f348d522b02a8d)を見て、Sens'it SDKのダウンロード、[GNU Arm Embedded Toolchain (gcc-arm-none-eabi)](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads)と[dfu-util](https://sourceforge.net/projects/dfu-util/)のインストールをしておいてください。
ここ(2)からは、Sens'itを開発PCと接続し、Sens'itのUpgrade及びFirmwareの開発、書込み、動作確認方法を説明します。
#Sens'it Upgrade
開発するファームウェアをSens'it上で動かすためには***必ずUpgradeが必要です***。これをせず、ファームウェアの書込みを行うと、Sens'itのメモリを壊してしまい、2度と元に戻らないみたいです。
大まかな流れは以下の通りです。
1. Sens'itとPCを付属のUSBケーブルで接続
2. Sens'itをブートローダーモードにする
3. PCのTerminalから"make upgrade"を叩く
上記2.3.についてですが、
###Sens'itをブートローダーモードにする
Sens'itのボタン操作でブートローダーモードにしますが、ボタンは若干押しにくいので、ペンのようなものでやられることをお奨めします。
1. Sens'itの全面中央にあるボタンを4回連続で押します。<br> ->Sesn'itのUSBコネクタ部分のLEDが**白点滅**します
2. すかさず、中央ボタンを長押しします。<br> ->中央ボタンのところとUSBコネクタ部分のLEDが、準にゆっくり**白点灯**します。
成功したときは、下の写真のようになっているはずです。①→②の順に点灯します。
![sens'it boot loader mode.JPG](https://qiita-image-store.s3.amazonaws.com/0/172313/828fd9fc-764f-7f7e-809e-aa779b0e0ec2.jpeg)
###PCのTerminalからmake upgrade
前の投稿の[Sens'it SDKダウンロード](https://qiita.com/ghibi/items/220719f348d522b02a8d#sensit-sdk%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)でダウンロードしたZIPファイルを解凍したディレクトリ（Makefileのあるところ）に移動し、Terminalで

```
> sudo make upgrade
```
コマンドを入力してください。
成功した場合は、LEDが**<font color='green'>緑点灯</font>**します。既にupgrade済みの場合は**<font color='blue'>青点灯</font>**します。
#C言語ソース編集
ここでようやく、ソースコードを編集し、独自のファームウェアを開発します。
まずは、Sens'it SDKの***src***フォルダにある***main.c***ファイルを見てみます。

```c
#include "sensit_api.h"
#include "click.h"
#include "battery.h"

int main()
{
    /* Start of variables declaration */

    u8 click;

    /* End of variables declaration */


    /* Start of initialization */

    /* Enable button */
    SENSIT_API_button_init(TRUE);

    /* Check the battery level at initialization */
    BATTERY_check(BATT_INIT_LEVEL);

    /* End of initialization */

    while (TRUE)
    {
        /* Start of application execution loop */

        if (WhoWakeMe == SRC_BUTTON)
        {
            /* The button was pressed, start count click */
            click = CLICK_count();
            if (click == 4)
            {
                /* Reset the device with a quadruple click */
                SENSIT_API_reset();
            }
        }


        /* Add your applicative code here */


        /* Put the device in deep sleep mode */
        SENSIT_API_sleep(MAX_SLEEP_DURATION);

        /* Check the battery level is not too low */
        BATTERY_check(BATT_LOW_LEVEL);

        /* End of application execution loop */
    }
}

```
初期化の後、whileループが回っている感じで、Arduinoでの開発イメージに近いですね。
ここで```/*Add your application code here*/```と書かれているところに自身のコードを埋め込んでいくことになりそうです。
ちなみに、```SENSIT_API_sleep(MAX_SLEEP_DURATION);```では、スリープ時間を指定せず、とにかく、ずーっと寝てろってことです。もし、定期的にセンサデータを取得し送信したければ、ここの引数に実際のスリープ時間（秒）を入れることになります。
あとは、```if (WhoWakeMe == SRC_BUTTON)```のところですが、ずーっと寝ているSens'itを起こしてあげるトリガを決めています。この場合はSRC_BUTTONなので、「ボタンが押されたら起きましょう」ということになります。その後、CLICK_count()でボタンが押された回数を取得して、「4回」なら、APIをリセットします。この4回というのが、先に書いたブートローダーモードのボタン4回押してねという話につながりそうです。
大体のテンプレートの意味が分かったところで、```/*Add your application code here*/```のところにカスタムコードを書いていきます。
###温度・湿度・照度のデータを取得するプログラム
今回は、温度・湿度・照度のデータを取得し、Sigfoxネットワークに送信するプログラムを作ってみます。
####Sigfoxデータ送信
Sigfoxの場合、最大12バイトのペイロードを送るというルールがあるので、それ以下のサイズの送信データ配列とセンサー情報を取得する関数、そして、Sigfox送信用の関数を使います。

```c
        /* Add your applicative code here */
		u8 payload[10];
		u8 customer_response[8];
		get_temp_humid_light(payload);

		SENSIT_API_send_sfx_frame(SFX_RC3,RED,payload,10,customer_response,3,FALSE);

        /* Put the device in deep sleep mode */
        //SENSIT_API_sleep(MAX_SLEEP_DURATION);
		SENSIT_API_sleep(300);
```
ここで、**SENSIT_API_send_sfx_frame()**関数がデータ送信用のAPIです。日本では第1引数を**SFX_RC3**としておいてください。第2引数は送信時に点滅させるLEDの色、第3、第4引数に送信するデータ配列とその長さを指定。第5引数以降は、下り受信時の話なので、とりあえずは、上記のままで結構です。
その後、**SENSIT_API_sleep(300)**で、300秒間（5分間）寝てもらいます。つまり、5分後に戻ってきます。
Sens'it SDKのAPIドキュメントは、SDKダウンロード先の***doc\doxygen\index.html***にありますので、見てみてください。
####温度・湿度・照度取得
get_temp_humid_lightという関数を作ってみます。

```c
void get_temp_humid_light(u8* payload)
{
	/* 温度センサーアクティブ */
	SENSIT_API_temp_sensor_mode_active();
	/* 照度センサーアクティブ */
	SENSIT_API_light_sensor_mode_active(LIGHT_SENSOR_SETTING_GAINx1);

	SENSIT_API_sleep(20);

	/* 温度・湿度取得 */
	s16 temp = 0;
	u16 humid = 0;
	SENSIT_API_temp_sensor_measure(&temp, &humid);

	union {
		float v;
		u8 c[4];
	} t;
	t.v = ((float)temp) / 8.0;

	union {
		u16 v;
		u8 c[2];
	} h;
	h.v = humid / 2;

	/* 照度取得 */
	u16 light_ch0 = 0;
	u16 light_ch1 = 0;	
	SENSIT_API_light_sensor_measure(&light_ch0, &light_ch1);

	union {
		u16 v;
		u8 c[2];
	} l0;
	l0.v = light_ch0;

	union {
		u16 v;
		u8 c[2];
	} l1;
	l1.v = light_ch1;

	payload[0] = t.c[0];
	payload[1] = t.c[1];
	payload[2] = t.c[2];
	payload[3] = t.c[3];
	payload[4] = h.c[0];
	payload[5] = h.c[1];
	payload[6] = l0.c[0];
	payload[7] = l0.c[1];
	payload[8] = l1.c[0];
	payload[9] = l1.c[1];

	/* 温度センサースリープ */
	SENSIT_API_temp_sensor_mode_sleep();

	/* 照度センサースリープ */
	SENSIT_API_light_sensor_mode_sleep();

	return;
}
```
(コードをわかりやすくするため、エラー時は、何もせずにFALSEを返しています。)
大まかな流れは、
1. 各センサーをアクティブにする<br>SENSIT_API_temp_sensor_mode_active:温湿度センサー<br>SENSIT_API_light_sensor_mode_active:照度センサーアクティブ
2. センサーデータ取得<br>SENSIT_API_temp_sensor_measure:温度・湿度<br>SENSIT_API_light_sensor_measure:照度
3. センサーをスリープにする<br>SENSIT_API_temp_sensor_mode_sleep:温湿度センサー<br>SENSIT_API_light_sensor_mode_sleep:照度センサー
あとは、ペイロード用のデータ配列に入れておきます。

これで、完成です。Sens'itに書き込んでみます。
#コンパイル
その前に、コンパイルしないといけないので、必要に応じMakefileを編集し、```make```コマンドを叩いておきます。
#Sens'itへの書込み
書込みの際は、毎回、ブートローダーモードにしないといけません。
上にも書いていますが、念のため、もう一度書いておきます。
1. Sens'itの全面中央にあるボタンを4回連続で押します。<br> ->Sesn'itのUSBコネクタ部分のLEDが**白点滅**します
2. すかさず、中央ボタンを長押しします。<br> ->中央ボタンのところとUSBコネクタ部分のLEDが、準にゆっくり**白点灯**します。
あとは、

```
> sudo make prog
```
コマンドを叩けば、Sens'itにファームウェアが書き込まれます。

以上！
しばらくすると、LEDが赤色に点滅し、データが送信されていることが確認できます。

次回は、Sigfoxクラウドでデータが受信できたかを確認する方法を説明します。

[>Sigfox Sens'it SDKで簡単IoT組み込み開発(3)](https://qiita.com/ghibi/items/899c90f64f9a78d75aef)