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

icon-calendar 2017/7/2 エンジニアリング, ライフハック

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

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

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

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

今回の材料は以下の通り

・ESP-WROOM-02(ESP-8266)

おすすめは秋月のこっち

http://akizukidenshi.com/catalog/g/gK-09758

・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(無料プラン)を登録して使用する

送信用スケッチ

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

//温湿度センサー用インポート
#include <DHT.h>
#include <DHT_U.h>
//ESP WROOM用インポート
#include <ESP8266WiFi.h>
//時刻合わせ
#include <NTP.h>
//MQTTに飛ばすためのインポート
#include <PubSubClient.h>
// 温湿度センサーを接続するピン
#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() {
}

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

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

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

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

最後に

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

コメント

コメントを書く

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)