温度センサー「S-5851A」の計測値をESP8266でAmbientに送信する

秋月電子で販売されている「S-5851A使用2ワイヤデジタル温度センサモジュール」 で計測した温度を「Ambient」に送信してグラフ化してみました。

はじめに

ESP8266のスケッチの書き込み手順などは記載していません。初めて使用する場合は次の記事がおすすめです。

Ambientの登録手順などは記載していません。公式の手順を参考にしてください。

使用する物

  • S-5851A使用2ワイヤデジタル温度センサモジュール (秋月電子)
  • ESPr Developer (スイッチサイエンス, Amazon.co.jp)
  • 抵抗器
    • 10kΩ x 2個
    • 200Ω x 2個 (500Ω以下であれば他の抵抗値でもいい)
  • コンデンサ
    • 0.1μF x 1個
  • ジャンパ線

使用するソフトウェアやWebサービス

「S-5851A使用2ワイヤデジタル温度センサモジュール」について

SII Semiconductor社のS-5851Aという温度センサーがブレッドボードで扱えるように実装されたモジュールです。価格が100円前後とお手頃です。

S-5851の端子がブレッドボードに合うようにピッチ変換されているだけなので、次のような配線を行う必要があり、この記事に例を記載しています。

  • I2C通信のSDA、SCLのプルアップ抵抗
  • S-5851A特有のI2Cアドレス設定用のピンの配線

抵抗器の抵抗値やコンデンサの容量値は下記のデータシートを参考にしました。

「ESPr Developer」について

スイッチサイエンス社が販売しているESP8266(ESP-WROOM-02)の開発用ボードです。

この記事でESP8266と記述している箇所はESPr Developer以外のボードでも同様に参考にしてもらえると思います。

配線する

1. 電源まわりの配線

ESP8266の3.3Vのピンとブレッドボードの+のラインを接続、GNDのピンと-のラインを接続します。S-5851もちょこんと置いておきます。

f:id:jakalada:20170502195240j:plain

2. S-5851Aと電源まわりの配線

S-5851Aのピンを接続します。

f:id:jakalada:20170502200321j:plain

S-5851Aのピンの名称は次のようになっています。

f:id:jakalada:20170401163235j:plain

この時点でのピンごとの接続先は以下です。

S-5851Aのピン 接続先 備考
VDD 3.3VとGND 3.3Vにはジャンパ線を使用して接続。GNDにはコンデンサ(1μF)を使用して接続
VSS GND ジャンパ線を使用して接続
SDA 3.3V 抵抗器(10kΩ)を使用して接続
SCL 3.3V 抵抗器(10kΩ)を使用して接続
AD0 GND 抵抗器(200Ω)を使用して接続
AD1 GND 抵抗器(200Ω)を使用して接続

3. さいごにSDAとSCLの配線

次のようにS-5851AのSDAとSCLピンをESP8266に接続します。

f:id:jakalada:20170502192547j:plain

SDAとSCLピンについて、S-5851AとESP8266のピンの対応は以下です。

S-5851Aのピン ESP8266
SDA IO14
SCL IO15

計測値を読み取ってみる

1. S-5851Aのライブラリをインストール

Arduino IDEにS-5851Aのライブラリをインストールします。

次のリンクから最新版のzipファイルをダウンロードして手動でインストールするか、

Arduino IDEのライブラリマネージャからインストールしてください。次のようにライブラリマネージャから"S5851A"で検索すると見つかります。

f:id:jakalada:20170502215018p:plain

2. スケッチの書き込み

次のスケッチを書き込みます。

#include <S5851A.h>
#include <Wire.h>

// I2Cのアドレスを0x48に設定(AD0とAD1ピンの接続先によって変わる)
S5851A sensor(0x48);

void setup() {
  Serial.begin(9600);
  Wire.begin();

  // S-5851Aのリセット
  if (!sensor.resetByGeneralCall()) {
    // 失敗
    // 配線が間違っているかもしれない
    Serial.println("failed: reset by general call");
    while(1) {
      delay(100);
    };
  }
  delay(100);
}

void loop() {
  // 1秒間隔で温度を出力する
  
  // S-5851Aから温度を読み取り
  if (sensor.update()) {
    // 温度の摂氏の値を出力(例: 26.0)
    double tempC = sensor.getTempC();
    Serial.println(tempC);
  } else {
    // 失敗
    // 配線が間違っているかもしれない
    Serial.println("failed: update");
  }
  delay(1000);
}

3. 動作確認

シリアルモニタに次のように出力されていれば配線にも問題ありません。

f:id:jakalada:20170502220809p:plain

身近にある電子時計などに表示されている室温と比較してみてください。私が自室で使用しているセイコーの時計の表示よりも2℃くらいの高かったです。

Ambientに計測値を送信する

1. チャートを追加する

AmbientのMyチャネルのページで適当なチャネルを作成し、次のような設定でチャートを追加します。

f:id:jakalada:20170502235945p:plain

追加すると次のようなチャートが表示されます。計測値を送信するとここに描画されます。

f:id:jakalada:20170502235956p:plain

2. Ambientのライブラリをインストール

Arduino IDEにAmbientのライブラリをインストールします。

ライブラリのインストール方法は次の記事の途中で詳しく解説されています。

3. スケッチの書き込み

次のスケッチの「SSID」、「パスワード」、「チャネルID」、「ライトキー」を変更してから、ESP8266に書き込んでください。

#include <Wire.h>
#include <ESP8266WiFi.h>
#include <Ambient.h>
#include <S5851A.h>

// ESP8266が接続するWi-Fiアクセスポイントの設定
const char* ssid = "SSID";
const char* password = "パスワード";

// Ambientのチャネル設定
unsigned int channelId = チャネルID;
const char* writeKey = "ライトキー";

S5851A sensor(0x48);

WiFiClient client;

Ambient ambient;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  if (!sensor.resetByGeneralCall()) {
    Serial.println("failed: reset by general call");
    while(1) {
      delay(1);
    };
  }
  delay(100);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
      Serial.println(".");
  }

  Serial.println("Wi-Fi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  ambient.begin(channelId, writeKey, &client);
}

void loop() {
  // 10秒間隔で温度をAmbientに送信
  
  if (sensor.update()) {
    double tempC = sensor.getTempC();
    Serial.println(tempC);

    ambient.set(1, tempC);
    ambient.send();
  } else {
    // 通信失敗
    // 配線が間違っているかもしれない
    Serial.println("failed: update");
  }
  delay(10000);
}

4. 動作確認

1分ほど待ってからAmbientのチャートのページを表示すると次のようにグラフが確認できます。

f:id:jakalada:20170503001151p:plain