概要
ESP8266系のボードと体重計をつなげて、体重計に乗ったら自動的にtwitterに投稿する仕組みを構築しました。
正直なところ、以下の2個の記事をまとめただけです。(先人に感謝) qiita.com
- ESP8266だと例示の赤外線リモコン受信モジュールPL-IRM0101の 5Vが給電しづらい
- twitter連携との組み合わせが分からない
みたいな方の一助になれば幸いです。
Tweeting from ESP8266. my weight: 63.80 kg
— 絵麻さんを養って幸せな家庭を築く (@izm) July 17, 2016
作った後はUSB-ACアダプタで適当にボードごと放置しておけば良いので、PC接続しなくても良くなり、WithThingsみたいな使用感を得られます♪
用意するもの
体重計(2100円)
上記記事にあるように、赤外線式で表示を飛ばしてくれる物が良いです。僕は同様にHashy SALUTEを買いました。2000円程度です。
ボード(700円)
ESP8266搭載の適当なブレイクアウトボードを購入します。VCCから3.3Vが出ている物が良いです。
僕はnodemcu v1.0互換のLolin v3を使いました。700円程度で買えます(届くまで時間かかるかも)(これはUSBシリアルがCH340になっててドライバのインストールが楽なのが好みです)
CH340のドライバはこちらです。 http://www.microcontrols.org/arduino-uno-clone-ch340-ch341-chipset-usb-drivers/
類似のボードだとAmazonでこんな風に売ってます。(動作未検証)
赤外線リモコン受信モジュール(100円)
赤外線リモコン受信モジュール PL-IRM1261-C438 akizukidenshi.com
この赤外線リモコン受信モジュールは5V以外にも、3.3Vでも動くのでおすすめです。
TwitterアカウントやThingSpeakアカウントやwifi
これはお任せします。注意点として、Twitterのメインアカウントを連携すると 皆さまに自分の体重を大公開する ことになるので、別アカウントにしておく方が無難です…
こうなりますorz
Tweeting from ESP8266. my weight: 63.80 kg
— 絵麻さんを養って幸せな家庭を築く (@izm) July 17, 2016
作成手順
ボードセットアップ
まずはnodemcu v1.0をArduinoで書けるように開発環境をセットアップする必要があります。 Arduino IDE1.6.9をインストールして、ボードマネージャで以下のURLを入れてESP8266系を追加します。
- File→環境設定→追加のボードマネージャに入れてください。 http://arduino.esp8266.com/stable/package_esp8266com_index.json
- ツール→ボード→ボードマネージャでespと入れて追加(2.30でいいと思います)
こんな感じでNodeMCU 1.0 ( ESP-12EModule).を選びます。
動作テストに
int count=0; void setup() { Serial.begin(115200); Serial.println("Hello world!"); // prints hello with ending line break } void loop() // run over and over again { Serial.println(count); count++; delay(1000); }
みたいなコードを書いて、書き込み(アップロード)してシリアルモニタで開いて文字が表示されるか見てみます。(文字化けするときはボーレートを確認してみてください)
この辺りは以下のサイトが詳しいです。
体重計読み取りテスト
NodeMCUのピン配置はこんな感じです。 ブレッドボードにNodeMCUとPL-IRM1261-C438を配置して PL-IRM1261-C438の正面から見て
- 一番左はVCCなので3Vの印字と合わせて刺す
- 中央はGNDなのでGまたはGNDの印字と合わせて刺す
- 一番右は信号なので D2 の印字に刺す
と3本だけ結線します。(こんな感じ)
同様にesp8266搭載のnodemcu v1.0でも動きますね。
— 絵麻さんを養って幸せな家庭を築く (@izm) July 17, 2016
先のスケッチのpin番号を2からD2にするくらいです。 pic.twitter.com/yKy6t3XCfP
以下テストプログラムで、これを書き込んだ後にシリアルモニタを開き、体重計の信号が受信できそうな場所に置きます。 実際に体重計に乗って、体重が出力されることを確認します。
#define PIN D2 #define TIMEOUT_US 30000 int read_bits(uint32_t *bh, uint32_t *bl) { int count = 0; uint64_t ret = 0; while (true) { unsigned long pulse = pulseIn(PIN, HIGH, TIMEOUT_US); if (pulse == 0) break; uint32_t bit = pulse < 750 ? 1 : 0; if (count < 32) { bitWrite(*bh, 31 - count, bit); } else if (count < 64) { bitWrite(*bl, 63 - count, bit); } ++count; } return count; } void setup() { pinMode(PIN, INPUT); Serial.begin(115200); } void loop() { uint32_t bh = 0; uint32_t bl = 0; int count = read_bits(&bh, &bl); if (count == 39) { Serial.println(bh & 0xFFFF); } }
wifi接続、ツイッター投稿
手順としてはこのままです。
ESP-WROOM-02(ESP8266)からTwitter投稿 - Qiita
さっきの体重を測る部分と連携して、体重をツイートするコード例は以下の通りです。 ssidとpasswordとthingtweetAPIKeyは自分の環境に合わせて書き換えてください
#include <ESP8266WiFi.h> #define PIN D2 const char* ssid = "Your SSID";//書き換えてください const char* password = "Your password";//書き換えてください char thingSpeakAddress[] = "api.thingspeak.com"; String thingtweetAPIKey = "ADDJNDKAHDK";//書き換えてください WiFiClient client; #define TIMEOUT_US 30000 int read_bits(uint32_t *bh, uint32_t *bl) { int count = 0; uint64_t ret = 0; while (true) { unsigned long pulse = pulseIn(PIN, HIGH, TIMEOUT_US); if (pulse == 0) break; uint32_t bit = pulse < 750 ? 1 : 0; if (count < 32) { bitWrite(*bh, 31 - count, bit); } else if (count < 64) { bitWrite(*bl, 63 - count, bit); } ++count; } return count; } void setup() { pinMode(PIN, INPUT); pinMode(LED, OUTPUT); Serial.begin(115200); Serial.println("Booting..."); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while(WiFi.waitForConnectResult() != WL_CONNECTED){ Serial.println("Connection Failed. Rebooting..."); delay(5000); ESP.restart(); } Serial.println("Connected to wifi"); } void updateTwitterStatus(String tsData) { if (client.connect(thingSpeakAddress, 80)) { Serial.println("Connected to ThingSpeak."); Serial.println("Posting: " + tsData); // Create HTTP POST Data tsData = "api_key="+thingtweetAPIKey+"&status="+tsData; client.print("POST /apps/thingtweet/1/statuses/update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(tsData.length()); client.print("\n\n"); client.print(tsData); client.stop(); } else { Serial.println("Connection failed."); } } void loop() { uint32_t bh = 0; uint32_t bl = 0; int count = read_bits(&bh, &bl); if (count == 39) { int num=bh & 0xFFFF; float weight= (float)num/10; String twStr = "Tweeting from ESP8266. my weight: " + String(weight)+" kg"; updateTwitterStatus(twStr); Serial.println(num); delay(30000); } }
これを書き込んでしまえば、あとは体重計に乗って15秒くらい経って下りるだけで、勝手に連携したツイッターに体重を書き込んでくれます。 レコーディングダイエットや、twitter apiを使った可視化などにも使えそうですね。
Tweeting from ESP8266. my weight: 63.80 kg
— 絵麻さんを養って幸せな家庭を築く (@izm) July 17, 2016
補足
NodeMCU系のボードが手元にあったので試しましたが、技適問題があるのでご利用は自己責任でお願いします。 また、他のESP8266系でも実現できると思うので、是非おためしくださいませ。