※milkcocoa終了に伴い、BaasをBeeBotteに変更する方法について記載しております。
前回、「(2′) BeeBotteの設定」でIoTサーバのセットアップを行いました。
これまでIoTセンサーの製作、IoTサーバのセットアップが完了して、今回は三番目の「IoTデバイスのプログラミング」を行います。
1. 会議室使用状況センサーの実装構想(振り返り)
少し目標を変更して、会議室に自作したIoT人感センサーを設置して、会議室センサーの状態を会社のSharePointに表示させることを目標としました。
- マイコンと人感センサーを使って電子工作(IoTデバイス製作)
- センサーデータの保管先IoTサーバのセットアップ(BeeBotte編)
- IoTデバイスである会議室センサーのプログラム修正(BeeBotte編)←今回はこちらの話
- JavaScriptで簡単なページを作成して、IoTサーバの情報を取得しSharePointで表示
2. IoTデバイスのプログラミングに向けて下準備
ここの内容は前回掲載したmilkcocoa版の「(3)ArduinoでESP8266のプログラミング」とほぼ同じですが、一応改めて記載しておきます。
① 仕組みとフローチャート
下図の動作内容にもありますが、概要は以下の通り。
- 「センサーONの状態が10秒以上」and「前回IoTサーバへOFFを記録」or「ON状態が1時間以上」の場合: IoTサーバへONを書き込み
- 「センサーOFFの状態が60秒以上」and「前回IoTサーバへONを記録」or「OFF状態が1時間以上」の場合: IoTサーバへOFFを書き込み
② インストールするもの
では、いよいよESP8266のプログラミングを行っていくのですが、初めての場合いくつかインストールしなければいけないものがありますのでまずはここから。(以下が準備できているよという方は飛ばしてください)
- Arduino IDE
- FT-232RQドライバー
- ライブラリーのインストール
milkcocoa版ではSDKのインストールが必要でしたが、今回はArduinoIDE内で取得できるライブラリだけで構成されています。
1. Arduino IDEのインストール
ESP8266は、Arduino IDEでプログラミングを行って行きます。
Arduino.ccのサイトからArduino IDEをダウンロードしてインストールします。
2. FT-232RQドライバーのインストール
PCからESP8266への接続にはFT-232RQを使ってファームウェアの書き込みを行いますので、FTDI社からドライバーをインストールします。
3. ライブラリーのインストール
インストールしたArduinoIDEを起動し、メニューからスケッチ→ライブラリーをインクルード→ライブラリーを管理を開く。ライブラリーマネージャで以下2つのライブラリーを検索して、インストールします。
- PubSubClient
- ArduinoJson
3. スケッチング(プログラミング)
前回「(2′) BeeBotteの設定」でBaaSであるBeeBotteをセットアップしましたが、今回以下3点の情報が本プログラム内で記述していきますので、控えておきます。
- Channel name
- Token
- Resource name
以下、コードのマーカされた部分をご自身の環境に合わせて値を置き換えてください。
// Board Manager 2.3.0
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// WiFi AP Settings
const char ssid[] = "Your WiFi SSID name"; // Replace with your SSID name
const char pass[] = "SSID Password"; // Set your SSID password
// BeeBotte Settings
#define bbt "mqtt.beebotte.com" // Domain name of Beebotte MQTT service
#define Token "token:token_lcNgbRYVi3Qy9YWj" // Set your channel token here ("token:"+Token name)
#define Channel "RoomStaus" // Replace with your channel name
#define CoResource "CR_A" //Replace with your resource name(Conference room name)
#define Write true
// Room settings
#define ROOM_NAME CoResource
#define USE 1
#define VACANT 2
// sensor Pin settings
int SensorPin = 14;
int WifiStatPin = 4;
int SensorStatPin = 5;
// Flag settings
char initial_flg = 0;
char ON_Cnt_Check = 5; // センサーONが6カウントされるとBaaSへ書き込み(0-5)
char OFF_Cnt_Check = 29; // センサーOFFが30カウントされるとBaaSへ書き込み(0-29)
int Alive_Check = 30*60; // Sensor_ONまたはOFFの状態が続く場合、1時間ごとに実行(deley1sの他、処理で1s使用)
int Sensor_ON_Flg = 0;
int Sensor_OFF_Flg = 0;
char SensorStatFlg = 0;
char* stat ="";
WiFiClient WFclient;
PubSubClient client(bbt, 1883, WFclient);
const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
char id[17];
const char* generateID()
{
randomSeed(analogRead(0));
int i = 0;
for(i = 0; i < sizeof(id) - 1; i++) {
id[i] = chars[random(sizeof(chars))];
}
id[sizeof(id) -1] = '\0';
return id;
}
// publishes data to the specified resource
void publish(const char* resource, char* data, bool persist)
{
StaticJsonDocument<128> jsonOutBuffer;
jsonOutBuffer["channel"] = Channel;
jsonOutBuffer["resource"] = resource;
jsonOutBuffer["data"] = data;
if (persist) {
jsonOutBuffer["write"] = true;
}
// Now print the JSON into a char buffer
char buffer[128];
serializeJson(jsonOutBuffer, buffer, sizeof(buffer));
// Create the topic to publish to
char topic[64];
sprintf(topic, "%s/%s", Channel, resource);
// Now publish the char buffer to Beebotte
client.publish(topic, buffer);
Serial.print("publish: ");
Serial.println(buffer);
}
void setup() {
// for status check
Serial.begin(74880);
delay(50);
// ESP8266 IO Pin set
pinMode(SensorPin, INPUT);
pinMode(WifiStatPin, OUTPUT);
pinMode(SensorStatPin, OUTPUT);
digitalWrite(WifiStatPin, LOW);
digitalWrite(SensorStatPin, LOW);
// WiFi connecting
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
delay(1000);
// for status check
Serial.println("Attempting to WiFi Connect...");
digitalWrite(WifiStatPin, HIGH);
while (WiFi.status() != WL_CONNECTED) {
// for status check
Serial.print(".");
digitalWrite(WifiStatPin, LOW);
delay(300);
digitalWrite(WifiStatPin, HIGH);
delay(1000);
}
// for status check
Serial.println("WiFi Connected!");
}
// reconnects to Beebotte server
boolean reconnect() {
Serial.println("Attempting to Beebotte connect");
while (!client.connected()) {
client.connect(generateID(), Token, "");
Serial.print(".");
delay(1000);
}
Serial.println("Connected to Beebotte");
publish(CoResource, "UpLink", Write);
Serial.println("UpLink");
return client.connected();
}
void loop() {
// Attempt to reconnect
if (!client.connected()) {
reconnect();
Serial.println("reconnect");
} else {
// Uplode of Sensor Stats via MQTT
SensorStats();
}
delay(1000);
client.loop();
}
void SensorStats() {
// Get sensor status
int SensorStat = digitalRead(SensorPin);
// for status check
Serial.print("Pin out: ");
Serial.println(SensorStat);
if (SensorStat == 1) {
digitalWrite(WifiStatPin, LOW);
digitalWrite(SensorStatPin, HIGH);
if ((Sensor_ON_Flg > ON_Cnt_Check && SensorStatFlg != USE) || Sensor_ON_Flg > Alive_Check) {
send_BeeBotte(USE); // in use
SensorStatFlg = USE;
} else {
if(Sensor_ON_Flg > ON_Cnt_Check){
Sensor_OFF_Flg = 0;
}
Sensor_ON_Flg += 1;
}
} else {
digitalWrite(SensorStatPin, LOW);
digitalWrite(WifiStatPin, HIGH);
if ((Sensor_OFF_Flg > OFF_Cnt_Check && SensorStatFlg != VACANT) || Sensor_OFF_Flg > Alive_Check) {
send_BeeBotte(VACANT); // vacant
SensorStatFlg = VACANT;
} else {
if(Sensor_OFF_Flg > OFF_Cnt_Check){
Sensor_ON_Flg = 0;
}
Sensor_OFF_Flg += 1;
}
}
}
void send_BeeBotte(char Room_Stat){
// for status check
Serial.print("ON_flg: ");
Serial.println(Sensor_ON_Flg);
Serial.print("OFF_flg: ");
Serial.println(Sensor_OFF_Flg);
Sensor_ON_Flg = 0;
Sensor_OFF_Flg = 0;
switch (Room_Stat) {
case USE:
stat = "IN USE";
// for status check
Serial.println("Stat: in use");
break;
case VACANT:
stat = "Vacant";
// for status check
Serial.println("Stat: Vacant");
break;
}
publish(CoResource, stat, Write);
}
結構簡単にmilkcocoaからBeeBotteへ移植できました。
4. 次回は、センサー状態を表示するサイトを修正します
冒頭の「1.実装構想」でも記載した通り、サイボウズガルーンからSharePointで閲覧できるように修正しました。ガルーン版でも大した差はないので、少しの修正だけで済みそうです。
次回は最終回で「(4′)BeeBotte版人感センサーの状況をSharePointに表示」を掲載していきます。
コメント
[…] beebotte aruduionoの製作https://diy.wingbird.com/2019/09/542/ […]