部屋の温度をツイートする Arduino (外出先から制御)
(2017/03/02 00:13:36)
作り方 1ページ目 (全 1 ページ)

作品の簡単な説明

Arduino をインターネットに接続する方法の一つは WiFi モジュール ESP-WROOM-02 を利用することです。こちらのページで紹介されている IFTTT を利用することで、温度センサで測定した値を Twitter に投稿できます。更に Qoosky Cloud Controller を利用することで、外出先からでも好きなタイミングで処理を開始できます。

Uploaded Image

必要なパーツ

以下のパーツが必要になります。電源はすべて PC から USB 経由で供給します。

Uploaded Image

回路図

ESP-WROOM-02 は 3.3V で動作するため、Arduino の 3.3V ピンを電源とします。Arduino の D2 および D3 ピンで制御することにします。同様に、LM61CIZ の動作電圧範囲には 3.3V が含まれるため Arduino の 3.3V ピンを電源としています。出力電圧は A0 ピンで A/D 変換して利用します。

Uploaded Image

http://schematics.com/project/arduino-esp8266-tweet-temperature-49104/

制御プログラム

以下のライブラリをインストールして利用します。それぞれ IFTTT および Qoosky を利用するために必要になります。

setup 関数内で、自宅のルータの SSID およびパスワードで WiFi 接続を確立した後、認証トークンをもとに Qoosky とのコネクションを張ります。loop 関数内では、Qoosky コントローラでボタン 8 が押され次第、温度を測定して IFTTT との認証およびツイートを行います。

ツイート時には、httpClient と ESP-WROOM-02 を共用しているため Qoosky との通信は一旦切断されますが、90 秒以内に再接続されます。IFTTT との連携を考えずに Qoosky コントローラだけの利用を考える場合はこのような問題は発生しません。

Uploaded Image

#include <HttpClient_ESP8266_AT.h>
#include <Qoosky_ESP8266_AT.h>

const byte rxPin = 2;
const byte txPin = 3;

SoftwareSerial softwareSerial(rxPin, txPin);
HttpClient_ESP8266_AT httpClient(softwareSerial);
Qoosky_ESP8266_AT qoosky(softwareSerial);

void setup() {
  Serial.begin(9600); // PC との通信
  softwareSerial.begin(115200); // ESP-WROOM-02 との通信

  while(true) {
    if(httpClient.statusAT()) { Serial.println(F("AT status OK")); break; }
    else Serial.println(F("AT status NOT OK"));
    delay(1000);
  }
  while(true) { // 書き換えてください↓
    if(httpClient.connectAP(F("YOUR_SSID"), F("PASSWORD"))) { Serial.println(F("Successfully connected to an AP")); break; }
    else Serial.println(F("Failed to connected to an AP. retrying..."));
    delay(1000);
  }
  while(true) {
    if(httpClient.statusWiFi()) { Serial.println(F("WiFi status OK")); break; }
    else Serial.println(F("WiFi status NOT OK"));
    delay(1000);
  }
  while(true) { // 書き換えてください↓
    if(qoosky.connectQoosky(F("XXXX-XXXX-XXXX-XXXX"))) { Serial.println(F("Successfully connected to Qoosky.")); break; }
    else Serial.println(F("Failed to connect to Qoosky, retrying..."));
    delay(1000);
  }
}

void loop() {
  int key = qoosky.popPushedKey();
  if(key) {
    Serial.println("Received: " + String(key) + " (tweet if key is '8')");
    if(key == 8) { // コントローラの 8 番ボタンが押されたら tweet します。

      // 温度 ////////////////////

      // LM61CIZ の出力電圧を A/D 変換します。
      int lm61ciz_ad = analogRead(A0);

      // Arduino の A/D 変換の分解能は 10 bit です。電圧値 [mV] で表現した場合の値を計算します。
      // https://www.arduino.cc/en/Reference/Map
      int lm61ciz_v = map(lm61ciz_ad, 0, 1023, 0, 5000);

      // LM61CIZ のデータシートによると -30 度 から +100 度の範囲が線形に
      // +300mV から +1600mV の電圧として出力されることが分かります。
      // 温度は以下の計算で得られます。
      int lm61ciz_t = map(lm61ciz_v, 300, 1600, -30, 100);

      while(true) {
        // httpClient と併用しているため Qoosky との通信は一旦切断されます。90 秒以内に再接続されます。
        httpClient.post(F("maker.ifttt.com"), // 書き換えてください↓
                        F("/trigger/xxxxxxxx/with/key/XXXXXXXXXXXXXXXXXXXXX"),
                        "{\"value1\":\"" + String(lm61ciz_t) + "\"}",
                        F("application/json"));
        if(httpClient.responseStatusCode() >= 0) {
          Serial.println(F("tweet SUCCESS"));
          break;
        }
        else Serial.println(F("tweet FAILURE, retrying..."));
      }
    }
  }
  else Serial.println(F("No pushed key."));
  delay(100);
}