スキル
・ハードウェアほぼ経験なし。
・開発能力 おおむね0
・サーバ側 Hadoopボチボチ
経緯
2017/10/22に秋葉に技術書典3にぶらりと行ったついでになぜか秋月によりたくなった。
会社でIoTがどうとかという話を色々聞くからだと思う。
Arduino互換で小さくてよさげなヤツを発見
準備
Arduinoインストール
まずは、Arduinoというソフトをダウンロードするらしい。
この時(2017/10/26)のバージョンは1.8.5だった。
ダウンロードしてインストール
ボード情報入手
秋月の説明書によると、次は以下のページを確認しながらESP8266のボード情報を入手するらしい。
このページによるとからダウンロードするらしいが、存在せず。
http://arduino.esp8266.com/package_esp8266com_index.json
以下に見つかった。これをArduinoの設定に追加。
http://arduino.esp8266.com/stable/package_esp8266com_index.json
あとは、ページに従って設定していけばOK。
Lチカ動作確認
手元にLEDを準備してチカチカさせてみる。
void setup() {
// put your setup code here, to run once:
pinMode(16,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(16,HIGH);
delay(500)
digitalWrite(16,LOW);
delay(500)
}
100%になると0.5秒刻みでチカチカし始める。
エルチカ pic.twitter.com/eG6XIyNNbs
— もんた (@___monta___) October 26, 2017
うむ、悪くない。
本番
安くて色々ついてるという理由で準備したセンサー
・BME280搭載 温湿度・気圧センサモジュール
※記載時点でどう読み取るのかさっぱりわかっていません。
BME280
まず、BME280の仕様回りをあさる。
ほほーBOSCHのチップなのか。(名前をきいたことがあるくらいだけど)
http://akizukidenshi.com/download/ds/bosch/BST-BME280_DS001-10.pdf
秋月にも同じようなものの情報が。
http://akizukidenshi.com/catalog/g/gK-09421
よくわからんが、I2C、またはSPIという規格で情報通信するとのこと。さっぱりわからんが、I2Cでいこう。
I2CとBME280の仕様
I2Cの規格は2線で通信するものらしい。
https://ja.wikipedia.org/wiki/I2C
詳細は調べてないけど、サンプルコードを眺める限り、ArduinoはGPIOにつなげば、データを送受信できる。しかもESP8266シリーズの場合、どのPINを使っても設定でどうにかしてくれるらしい(すげー)。
https://macsbug.wordpress.com/2015/10/23/esp8266-%E3%81%A8-i2c/
https://tockn.com/entry/20170309234918
アドレスはSD0のつなぎ方で変わるらしい。
・GND … 0x76
・VDD … 0x77
とりあえずGNDにつなごう。
BME280の接続
・VCC … DC1.71V ~ 3.6V とあるので、Arduinoの3.3V出力を使う
・GND … 俺でもわかるグランドだ。ArduinoのGNDを使う
・SCL … クロック信号。ArduinoのGPIO4を使う
・SDA … データ信号。ArduinoのGPIO5を使う
・CSB … Interfaceの選択。HighでI2Cとのこと。Arduinoの3.3V出力を使う
・SD0 … I2Cのアドレス選択。ArduinoのGNDを使う
この間に起きたトラブル~ボードが替わっている理由~
このあと、手元がくるってショートさせたらしく、秋月で購入したESP8266は昇天しました。 落ち込んでいてもしょうがないので、Amazonで新しいESP8266ボードを探して、翌日届きそうなものを購入しました。 それがこちら。 ESP8266 IOT Board  いやらしいことに、ESP8266はいくつかバージョンがあり、ピン配置が異なるようです。 https://www.elecrow.com/wiki/index.php?title=ESP8266_IOT_Board(Arduino_IDE_or_NodeMCU_Lua_Programming) ...えっ... D0とかD1とか、Arduinoで行くと何に相当するんでしょう... 皆さん気を付けましょうで、注意ポイントなんですが、SCL、SDAはプルアップと言われるやつで、通常Highにしておく必要があるようです。秋月の回路を見ると4.7KΩなので、理由はわかりませんが、同じくらいの抵抗をくっつけておきます。
ArduinoのPIN番号とESP8266 IOT Boardの番号、そしてさらにはSCL、SDAの対応番号がわかりませんが、調べたところ以下のようになるようです。
SCL は 5(D1)
SDA は 4(D2)
https://qiita.com/exabugs/items/9d1b66aa1d22805afbc8
ここまでで、ハードウェアの接続情報が集まりました。
つなげてみたものが以下です。
で、スイッチサイエンスさんのページにBME280の読み取りコードがあったので、そちらを流用。
https://www.switch-science.com/catalog/2236/
ライセンスコードが明記していないので、コードの記載できません。(すいません)
コードを引っ張ってきてベタっと貼り付けてください。
動きます。
おー。ぞろぞろデータが取れている。
これだけだとデータを取捨てることになるので、IoTっぽくNifiで受け取ってみましょう。
このあたりを参考に、Wifi接続をします。
https://qiita.com/azusa9/items/7f78069cb09872cf6cbf
# include <ESP8266WiFi.h>
# define MYSSID "XXXXXXXX";
# define SSIDPASSWORD "YYYYYYYYYYY";
# define NIFISERVERPORT 9000
static const char *NIFISERVERADDR = "192.168.11.8";
void setup() {
~BME280の読み込みコード~
Serial.begin(9600);
WiFiConnect();
}
void WiFiConnect()
{
WiFi.mode(WIFI_STA);
WiFi.printDiag(Serial);
WiFi.begin(SSID, SSIDPASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
WiFi.printDiag(Serial);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop()
{
~BME280の読み込みコード~
WiFiClient client;
if (!client.connect(NIFISERVERADDR, NIFISERVERPORT)) {
Serial.println("Failed to send!");
return;
}else{
client.print(temp_act);
client.print(",");
client.print(press_act);
client.print(",");
client.println(hum_act);
}
client.stop();
delay(1000);
ほとんどがコピペで修正もしていないので、統一感なくてすいません。
サーバ側(NiFi)
Nifi側も設定します。
※すぐにDBが準備できないので、ローカルディスクにまとめて保存します。
TCPを受信するだけ。
Port番号をArduinoに合わせて変更
ここだけ少し工夫した。
MergeContentした際に、改行が入っていなかったため、改行処理を追加。
ついでにArduinoは時刻を持っていないので、最初のカラムに時刻を追加。
あとは一秒ごとに送られてくるデータのマージ。
とりあえずC:\tmp に突っ込む。
で、最終的にC:\tmp\nifiフォルダに出来上がるファイルがこれ。
やったね!