Nefryアドベントカレンダーの20日が空いているので、
今回のアドベントカレンダーの知見を使って実際にアプリケーションを作った例を公開します。
オフライン温度計
NefryBT 1.1.3で、wifiを起動しないオフラインモードが実装されました。
また、ディスプレイにWiFi情報を表示しない設定もスケッチ側で可能になりました。
それを踏まえて、オフラインでディスプレイに温度・湿度を表示するデバイスを作ってみましょう。
作成手順
1. 温湿度センサの接続
NefryBTのA0
端子にGrove温湿度センサを接続します。
センサーは安価でお手軽なDHT11を用います。▼スイッチサイエンスさんの販売サイト
2. DHTセンサライブラリの導入
ArduinoIDEのライブラリマネージャから DHT sensor library by Adafruit
をインストールします。
'DHT'で検索すると出てきます。
3. 日本語フォントライブラリの導入
日本語フォントを導入します。まずは次のファイルをダウンロードします。
misakiUTF16_1.04.zip
ArduinoIDEの**.ZIP形式のライブラリのインクルード**でインストールします。
4. スケッチを書く
ArduinoIDEでスケッチを書いてNefryBTに流し込みましょう。
#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);
}
完成
温度湿度をでかでかと表示しつつ、状態を日本語でエモーショナルに表現しています。
あとオフラインモードの起動は本当に爆速です。
温度計をちゃんと動画で録ってなかったので。#NefryBT pic.twitter.com/ssm4MSnAGR
— えむにわ (@m2wasabi) 2017年12月20日
以前の記事でロゴ書き換えたままでしたw
さいごに
ディスプレイを活用するとセンサーの情報をダイレクトに表示させることができます。(このサンプルは通信してないのでIoTとは言えませんがw)
それによってアプリケーションをきちんとしたものに見せることが可能になります。
きちんと作りこむことで思わず持ち歩きたくなるデバイスを作ってみるのも楽しいです。