[3′]会議室使用状況センサーの自作 〜BeeBotte版/ArudinoでESP8266のプログラミング〜

電子工作
スポンサーリンク

※milkcocoa終了に伴い、BaasをBeeBotteに変更する方法について記載しております。

前回、「(2′) BeeBotteの設定」でIoTサーバのセットアップを行いました。
これまでIoTセンサーの製作、IoTサーバのセットアップが完了して、今回は三番目の「IoTデバイスのプログラミング」を行います。

1. 会議室使用状況センサーの実装構想(振り返り)

少し目標を変更して、会議室に自作したIoT人感センサーを設置して、会議室センサーの状態を会社のSharePointに表示させることを目標としました。

  1. マイコンと人感センサーを使って電子工作(IoTデバイス製作)
  2. センサーデータの保管先IoTサーバのセットアップ(BeeBotte編)
  3. IoTデバイスである会議室センサーのプログラム修正(BeeBotte編)←今回はこちらの話
  4. 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のプログラミングを行っていくのですが、初めての場合いくつかインストールしなければいけないものがありますのでまずはここから。(以下が準備できているよという方は飛ばしてください)

  1. Arduino IDE
  2. FT-232RQドライバー
  3. ライブラリーのインストール

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に表示」を掲載していきます。

コメント

  1. […] beebotte aruduionoの製作https://diy.wingbird.com/2019/09/542/ […]

タイトルとURLをコピーしました