エンジニアリング

ESP-WROOMを使用してお家IoTを実現するために温度と湿度をセンサーから取得してMQTTでpublishする

スクリーンショット 2017-06-25 13.16.24

いやーへたれエンジニアの家がですね、築45年超えていることもあり、夏は暑く、冬は寒いのです・・・・

最近イライラが頂点に達したので温度湿度センサーから温度と湿度を取得して ある温度と湿度を超えたらエアコンをつけるようなIoTシステムを開発することにしました

第1回:温度と湿度を飛ばす

今回の材料は以下の通り

・ESP-WROOM-02(ESP-8266)

おすすめは秋月のこっち

・DHT22/AM2302 デジタル温度センサーモジュール

配線

こんな感じで配線しておきました

IMG_4162 IMG_4164 IMG_4163

ポイントは温度センサーのところに10kΩの抵抗ぶち込むことと、deepsleepという仕組みで電池を長持ちさせたいので IO16とRSTを抵抗でつないでおくこと!

Arduinoのセッティング

この手のもの作る時はお手軽なArduinoを使いたい!
そのためこのESP-WROOMマイコンをArduinoで動かせるようにするための設定を行なう

ESP8266コアを追加してプログラミング出来るようにする

スクリーンショット 2017-06-25 13.45.48

Arduinoの設定に http://arduino.esp8266.com/stable/package_esp8266com_index.json を追加

ツール>ボード>ボードマネージャー> Generic ESP 8266 Module

pubsubclientをインストールしてArduinoでMQTTを使えるようにする

Arduinoのライブラリの管理で設定

時刻を使えるようにしたいから TimeとNTPライブラリをインストール

https://github.com/PaulStoffregen/Time

https://github.com/exabugs/sketchLibraryNTP

MQTT Brokerを作成する

今回のMQTTBrokerはAmazonのCloudMQTT(無料プラン)を登録して使用する

送信用スケッチ

こんな感じで書いてみました

[c]
//温湿度センサー用インポート
#include
#include
//ESP WROOM用インポート
#include
//時刻合わせ
#include
//MQTTに飛ばすためのインポート
#include
// 温湿度センサーを接続するピン
#define SENSOR_PIN 12
// 温湿度センサーの種類
#define DHTTYPE DHT22 // DHT 22 (AM2302)
// 温湿度センサーのインスタンス
DHT dht(SENSOR_PIN, DHTTYPE, 30);

const char* ssid = “”;
const char* password = “”;
const char* mqttServer = “”;
const char* mqttDeviceId = “”;
const char* mqttUser = “”;
const char* mqttPassword = “”;
const char* mqttTopic = “”;
const int mqtt_port = XXXXXX;
const unsigned long updateIntervalMicros = XXXXXX *1000*1000;
WiFiClientSecure espClient;
PubSubClient client(espClient);
unsigned long lastUpdateMillis = 0;
float value = 0;

void setup() {
// 温湿度センサーを初期化
dht.begin();
WiFi.mode(WIFI_STA);
Serial.begin(115200);
// WiFi接続
setupWifi();
//時計 初期化
ntp_begin(2390);

client.setServer(mqttServer, mqtt_port);

// MQTTサーバーへ接続
reconnect();

//delay(5000);

// MQTTサーバーへ投稿をアップデート
update();

// MQTTサーバーから切断
client.disconnect();
Serial.println(“Sleep…”);

// deep sleepで電力省エネ化
ESP.deepSleep(updateIntervalMicros);

}

void setupWifi() {

delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print(“Connecting to “);
Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}

Serial.println(“”);
Serial.println(“WiFi connected”);
Serial.println(“IP address: “);
Serial.println(WiFi.localIP());
}

void reconnect() {
// Loop until we’re reconnected
while (!client.connected()) {
Serial.print(“Attempting MQTT connection…”);
// Attempt to connect
if (client.connect(mqttDeviceId, mqttUser, mqttPassword)) {
Serial.println(“connected”);
} else {
Serial.print(“failed, rc=”);
Serial.print(client.state());
Serial.println(” try again in 5 seconds”);
// Wait 5 seconds before retrying
delay(5000);
}
}
}

void update() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// センサーから値を取得できたか判定
if (isnan(humidity) || isnan(temperature)) {
Serial.println(“sensor error.”);
return;
}
Serial.print(temperature);
//value = temperature;

//時間記憶周り
time_t n = now();
time_t t;
char s[20];
const char* format = “%04d-%02d-%02d %02d:%02d:%02d”;
// JST
t = localtime(n, 9);
sprintf(s, format, year(t), month(t), day(t), hour(t), minute(t), second(t));
//Serial.print(“JST : “);
//Serial.println(s);

String payload = “{\”myName\”:\””;
payload += mqttDeviceId;
payload += “\”,\”temperature\”:”;
payload += temperature;
payload += “\”,\”humidity\”:”;
payload += humidity;
payload += “\”,\”time\”:”;
payload += s;
payload += “}”;
Serial.print(“Publish message: “);
Serial.println(payload);
client.publish(mqttTopic, (char*) payload.c_str());
}

void loop() {
}

[/c]

MQTTに情報が飛んできたのか確認する

CloudMQTTにログインして WebSocketから確認する

スクリーンショット 2017-06-25 14.01.09

無事subscribeしているところを確認! いったん飛ばすところまでは出来ましたね!

最後に

次回は、温度と湿度を元に温度判定をするところを作ります!