Arduino
IoT
NefryBT
NefryDay 20

NefryBTを使った日本語が出る温湿度計のレシピ

Nefryアドベントカレンダーの20日が空いているので、
今回のアドベントカレンダーの知見を使って実際にアプリケーションを作った例を公開します。

オフライン温度計

NefryBT 1.1.3で、wifiを起動しないオフラインモードが実装されました。
また、ディスプレイにWiFi情報を表示しない設定もスケッチ側で可能になりました。

それを踏まえて、オフラインでディスプレイに温度・湿度を表示するデバイスを作ってみましょう。

さむい!

作成手順

1. 温湿度センサの接続

NefryBTのA0端子にGrove温湿度センサを接続します。
センサーは安価でお手軽なDHT11を用います。▼スイッチサイエンスさんの販売サイト

DHT11.PNG

2. DHTセンサライブラリの導入

ArduinoIDEのライブラリマネージャから DHT sensor library by Adafruit をインストールします。
'DHT'で検索すると出てきます。

libinst.PNG

3. 日本語フォントライブラリの導入

日本語フォントを導入します。まずは次のファイルをダウンロードします。
misakiUTF16_1.04.zip

ArduinoIDEの.ZIP形式のライブラリのインクルードでインストールします。

参考記事:NefryBTで日本語表示させてみる | Qiita

4. スケッチを書く

ArduinoIDEでスケッチを書いてNefryBTに流し込みましょう。

temp_meter_jp.ino
#include <stdio.h>
#include <Nefry.h>
#include <NefryDisplay.h>
#include <NefrySetting.h>
#include <misakiUTF16.h>
#include "DHT.h"

#define DHTPIN A0
#define DHTTYPE DHT11

DHT dht( DHTPIN, DHTTYPE );

void setting(){
  Nefry.disableWifi();  // WiFi無効にすると高速起動する
  Nefry.disableDisplayStatus();  // ステータス表示無効にしてディスプレイを自由に使う
}
NefrySetting nefrySetting(setting);

/**
 * 美咲フォント表示ライブラリ
 **/
void misakiPrint(int x, int y, char * pUTF8) {
  int n=0;
  byte buf[20][8];  //160x8ドットのバナー表示パターン
  while(*pUTF8)
    pUTF8 = getFontData(&buf[n++][0], pUTF8);  // フォントデータの取得

  // 文字の描画
  for (byte i=0; i < 8; i++) {
    for (byte j=0; j < n; j++) {
      for (byte k=0; k<8;k++) {
        if(bitRead(buf[j][i],7-k)) {
          NefryDisplay.setPixel(x + 8*j + k , y + i);
        }
      }
    }
  }
}

int iter = 0;  // 本当に動いてるかどうかを知りたいので計測回数をカウント

void displayTempInfo() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  char buffer[50];
  if( isnan(t) || isnan(h) )
  {
    NefryDisplay.drawString(0,0, "Failed to read from DHT" );
  }
  else
  {
    NefryDisplay.setFont(ArialMT_Plain_24);
    sprintf(buffer,"しつど:",h);
    misakiPrint(0, 0, buffer);
    sprintf(buffer,"%.2f %%",h);
    NefryDisplay.drawString(32, 0, buffer);
    sprintf(buffer,"温度:");
    misakiPrint(0, 30, buffer);
    sprintf(buffer,"%.2f *C",t);
    NefryDisplay.drawString(32, 30, buffer);


    if(t < 10.0){
      sprintf(buffer,"こごえしぬ!");
    }else if(t < 18.0) {
      sprintf(buffer,"さむい!");
    } else if(t < 26.0){
      sprintf(buffer,"かいてき");
    } else if(t < 36.0){
      sprintf(buffer,"あつい!");
    }else {
      sprintf(buffer,"わからん");
    }
    misakiPrint(50, 55, buffer);

    NefryDisplay.setFont(ArialMT_Plain_10);
    sprintf(buffer,"%d",iter);
    NefryDisplay.drawString(100, 52, buffer);
    iter++;
  }
}

void setup() {
  dht.begin();
}

void loop() {
  NefryDisplay.clear();
  displayTempInfo();
  NefryDisplay.display();
  delay(5000);  
}

完成

温度湿度をでかでかと表示しつつ、状態を日本語でエモーショナルに表現しています。
あとオフラインモードの起動は本当に爆速です。

以前の記事でロゴ書き換えたままでしたw

さいごに

ディスプレイを活用するとセンサーの情報をダイレクトに表示させることができます。(このサンプルは通信してないのでIoTとは言えませんがw)
それによってアプリケーションをきちんとしたものに見せることが可能になります。

きちんと作りこむことで思わず持ち歩きたくなるデバイスを作ってみるのも楽しいです。