#はじめに
●サーボモータ(SG90)を購入したので行き先表をESP8266開発ボードで作成してみました。
IFTTTのButton widgetでfirebaseに"1"から"5"の文字を書き込むAppletsを5つ作成します。
スマホのウィジェットでIFTTTを指定し、行き先のボタンを5個設置します。
ボタンを押すとfirebaseにテキストが書き込まれ、ESP8266がテキストを読み込み、指定角度にモータを回転させ、行き先を表示します。
"1":行き先1:角度0
"2":行き先2:角度45
"3":行き先3:角度90
"4":行き先4:角度135
"5":行き先5:角度180
#使用したもの
ESP8266開発ボード(300円)、サーボモータSG90(120円)
SG90のPWMをESP8266のGPIO4に接続する
SG90のVCCをESP8266のVin(5V)に接続する
SG90のGNDをESP8266のGNDに接続する
#環境
●WindowsにArduinoIDEをインストールする
●ArduinoIDEにESP8266のライブラリとFirebaseArduinoのライブラリをインクルードする
●ArduinoIDEを使用し、下記のプログラムをESP8266に書き込む
●firebaseのDatabaseはplace-wordにしています
●iftttでButton widget(this)でfirebaseにテキスト(例"1")をPUTする(that)ようにAppletsを作成する
●スマホ画面のウィジェットで作成したAppletsをスマホ画面に配置する
#スケッチ
●firebaseとWiFi設定は自分のKeyに置き換えてください
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#include<Servo.h>
#define FIREBASE_HOST "XXXXX.firebaseio.com"
#define FIREBASE_AUTH "XXXXXXXXXXXXXXXXXXXXXX"
#define WIFI_SSID "XXXXXXXXXXXXXXX"
#define WIFI_PASSWORD "XXXXXXXXXXXXX"
Servo servo1; //任意のサーボモータークラスを用意。
void setup() {
servo1.attach(4); //4番ピンをサーボモーターの出力ピンとして設定
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.stream("/place/word");
}
void loop() {
if (Firebase.failed()) {
Serial.println("streaming error");
Serial.println(Firebase.error());
ESP.reset();
}
if (Firebase.available()) {
Serial.print("2\r\n");
FirebaseObject event = Firebase.readEvent();
Serial.print("event\r\n");
if (Firebase.success()) {
Serial.print("success\r\n");
String eventType = event.getString("type");
eventType.toLowerCase();
if (eventType == "put") {
String data = event.getString("data");
Serial.print("data: ");
Serial.println(data);
if(data=="1"){
servo1.write(0);
Firebase.setString("place/word", "");
} else if(Firebase.getString("place/word")=="2"){
servo1.write(45);
Firebase.setString("place/word", "");
} else if(Firebase.getString("place/word")=="3"){
servo1.write(90);
Firebase.setString("place/word", "");
} else if(Firebase.getString("place/word")=="4"){
servo1.write(135);
Firebase.setString("place/word", "");
} else if(Firebase.getString("place/word")=="5"){
servo1.write(180);
Firebase.setString("place/word", "");
}
}
}
}
}
#プログラム(行き先をGooglehomeで話すプログラムをラズパイに作成しています)
var firebase = require('firebase');
var iconv = require('iconv-lite');
//firebase config
var config = {
apiKey: "XXXXXXXXXXXXXXXXXXXXXXXXX",
authDomain: "XXXXXXXX.firebaseapp.com",
databaseURL: "https://XXXXXXXX.firebaseio.com",
projectId: "XXXXXXXX",
storageBucket: "XXXXXXXX.appspot.com",
messagingSenderId: "XXXXXXXXXXX"
};
firebase.initializeApp(config);
//jsonからvalueに一致する値取得
const getJsonData = (value, json) => {
for (var word in json) if (value == word) return json[word]
return json["default"]
}
//database更新時
const path = "/place"
const key = "word"
const db = firebase.database()
db.ref(path).on("value", function(changedSnapshot) {
//値取得
let value = changedSnapshot.child(key).val()
if (!value) return
if(value === "1") {
command = 'curl -X POST -d "text=お父さんは行き先1にいます" http://192.168.1.82:8080/google-home-notifier'
} else if(value === "2") {
command = 'curl -X POST -d "text=お父さんは行き先2にいます" http://192.168.1.82:8080/google-home-notifier'
} else if(value === "3") {
command = 'curl -X POST -d "text=お父さんは行き先3にいます" http://192.168.1.82:8080/google-home-notifier'
} else if(value === "4") {
command = 'curl -X POST -d "text=お父さんは行き先4にいます" http://192.168.1.82:8080/google-home-notifier'
} else if(value === "5") {
command = 'curl -X POST -d "text=お父さんは行き先5にいます" http://192.168.1.82:8080/google-home-notifier'
}
var exec = require('child_process').exec;
exec(command, {maxBuffer: 1000*1024}, function(error, stdout, stderr) {
if (error !== null) {
console.log('Exec error: ' + error);
}
});
})
#まとめ
●IFTTTのthisはButton widgetでなく、GPS指定(You enter an area)に変更することも可能です
●Firebase.failedの場合、ESP.resetを入れるとfirebaseを読めるようになりました
●最初、1秒周期でfirebaseデータを読み込んでいましたが、1時間ももたずにメモリ不足で動作しなくなりました。Firebase.streamを使用すると解決しました。
【追記】2019-4-8
最近、動作しなくなったので、調査したところ、firebaseのfingerprintが変更になったそうです。
下記の箇所を修正してください。
「C:¥Users¥ユーザー名¥Documents¥Arduino¥libraries¥firebase-arduino-master¥src¥FirebaseHttpClient.h」に移動します。
static const char kFirebaseFingerprint [] =
"E2 34 53 7A 1E D9 7D B8 C5 02 36 0D B2 77 9E 5E 0F 32 71 17";
【追記】2019-8-16
fingerprintは不定期で変更されるので、最新データを確認お願いします。