ESP8266 NodeMCU Firebase : Firease ใช้งานร่วมกับ ESP8266
Firebase คือ Firebase เป็นฐานข้อมูลออนไลน์แบบ NoSQL ทำงานแบบเวลาจริง RealTime DataBase ให้บริการโดย google จึงมั่นใจในความแรงและความมั่นคง ใช้งานได้ทุกที่ทั่วโลกและใช้ฟรี ในตัวอย่างนี้เราจะทดสอบใช้งานฟังก์ชันหลักของ Firebase คือ insert , delete ,update , select โดยใช้ ESP8266 ในการสั่งงานกับ Server
เริ่มต้นสร้างโปรเจก Arduino Firebase และรับ API Key ในการใช้งาน
- คลิกที่ลิงค์นี้ https://firebase.google.com/ แล้วกด Sing In ใช้ด้านมุมบนขวา
- คลิกที่เมนู Go to Console ด้านมุมบนขวา
- คลิกปุ่ม “สร้างโครงการใหม่” แล้วตั้งชื่อโครงการและเลือกประเทศ
- คลิกที่เมนู บัญชีบริการ เลือกเมนู ข้อมูลลับฐานข้อมูล จะเห็นข้อมูลลับ กดปุ่มแสดง เพื่อเปิดดู บันทึกค่านี้ไว้ เพราะจะได้ใช้ในโปรแกรม Arduino
- คลิกที่เมนู Database จะเห็นลิงค์ของฐานข้อมูล บันทึกค่านี้ไว้ เพราะจะได้ใช้ในโปรแกรม Arduino
- กำหนดสิทธิ์การใช้งานเพื่อคนอื่นสามารถดูข้อมูลได้
- ลงไลบารี http://www.arduinoall.net/arduino-tutor/code/firebase.rar หรือ https://github.com/googlesamples/firebase-arduino/archive/master.zip
การใช้งาน Filebase เบื้องต้น
- เก็บข้อมูลแบบ Tree โดยใช้รูปแบบ JSON มีเฉพาะโนดลูกเท่านั้น ที่เก็บข้อมูลได้ โดยเก็บข้อมูลได้ 1 ค่า

- การอ้างอิงข้อมูล path เช่น path แถบสีเขียว คือ /a/b/c/b มีค่า 20 path แถบสีฟ้า /a/c/a มีค่า 50 path แถบสีเหลือง /a/c/b/b มีค่า 30

- การสร้างข้อมูลแบบ JSON
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["a"] = 54;
root["b"] = 95;
- คำสั่งใช้งานของ Firebase กับ NodeMCU Arduino
void set(String path, JsonVariant value) // update
void setBool(String path, String value)
void setInt(String path, String value)
void setFloat(String path, String value)
void setString(String path, String value)
String push(String path, JsonVariant value) // insert
String pushBool(String path, String value)
String pushInt(String path, String value)
String pushFloat(String path, String value)
String pushString(String path, String value)
FirebaseObject get(String path) // select
bool getBool(String path)
int getInt(String path)
float getFloat(String path)
String getString(String path)
void remove(String path) // delete
void stream(String path)
bool available() // เมื่อมีการเปลี่ยนแปลงข้อมูล ใช้ร่วมกับ stream
bool success() // สถานำดำเนินการสำเร็จ
bool failed() // สถานะดำเนินการไม่สำเร็จ
String error() // เช็ค Error Message
FirebaseObject readEvent() // ใช้ร่วมกับ stream
ทดลองใช้งานทีละฟังก์ชัน
- การเพิ่มข้อมูล Insert : คำสั่ง push เราต้องการเพิ่มค่า 50 ในโหนด C สามารถทำได้ดังนี้
#include
#include
// Config Firebase
#define FIREBASE_HOST "nodemcu-dfc8e.firebaseio.com"
#define FIREBASE_AUTH "sEcvkstjpTArjiq1rHaZly5iYHUfcL9Ym2FcqBMP"
// Config connect WiFi
#define WIFI_SSID "Tenda_3EF910"
#define WIFI_PASSWORD "gift4321"
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
Firebase.push("/a/b/c", 50);
if (Firebase.failed()) {
Serial.print("push /number failed:");
Serial.println(Firebase.error());
return;
}
delay(30000);
}
เพิ่มข้อมูลหลาย ๆ ค่าพร้อมกัน เช่น ให้เพิ่มข้อมูล a=20 b = 50 ในโหนด /a/b/c ทำได้โดย เพิ่มข้อมูลตัวแปรแบบ JSON
#include
#include
// Config Firebase
#define FIREBASE_HOST "nodemcu-dfc8e.firebaseio.com"
#define FIREBASE_AUTH "sEcvkstjpTArjiq1rHaZly5iYHUfcL9Ym2FcqBMP"
// Config connect WiFi
#define WIFI_SSID "Tenda_3EF910"
#define WIFI_PASSWORD "gift4321"
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["a"] = 20;
root["b"] = 50;
Firebase.push("/a/b/c", root);
if (Firebase.failed()) {
Serial.print("push /number failed:");
Serial.println(Firebase.error());
return;
}
delay(30000);
}
- การเปลี่ยนค่าข้อมูล Update : คำสั่ง set ให้อัพเดทค่า LED เป็น 1
#include
#include
// Config Firebase
#define FIREBASE_HOST "nodemcu-dfc8e.firebaseio.com"
#define FIREBASE_AUTH "sEcvkstjpTArjiq1rHaZly5iYHUfcL9Ym2FcqBMP"
// Config connect WiFi
#define WIFI_SSID "Tenda_3EF910"
#define WIFI_PASSWORD "gift4321"
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
//Firebase.set("/a/b/c/a", 999);
Firebase.set("/LED", 1);
if (Firebase.failed()) {
Serial.print("push /number failed:");
Serial.println(Firebase.error());
return;
}
delay(30000);
}
- การอ่านข้อมูล การอ่านค่าข้อมูล Select : คำสั่ง getให้อ่านค่าจาก /LED แล้วนำค่าที่อ่านได้มาเปิด/ปิด LED ที่ขา D4
#include
#include
// Config Firebase
#define FIREBASE_HOST "nodemcu-dfc8e.firebaseio.com"
#define FIREBASE_AUTH "sEcvkstjpTArjiq1rHaZly5iYHUfcL9Ym2FcqBMP"
// Config connect WiFi
#define WIFI_SSID "Tenda_3EF910"
#define WIFI_PASSWORD "gift4321"
int pin_Led = D4;
void setup() {
pinMode(pin_Led, OUTPUT);
Serial.begin(9600);
WiFi.mode(WIFI_STA);
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
//Firebase.getInt("/a/b/c/a", 999);
int ledValue = Firebase.getInt("/LED");
if (Firebase.failed()) {
Serial.println(Firebase.error());
return;
} else {
Serial.print("LED = ");
Serial.println(ledValue);
digitalWrite(pin_Led, ledValue);
}
delay(1000);
}
การอ่านค่าออกมาทั้งหมดแบบ JSON ให้ดึงข้อมูลจาก แถบสีเหลืองออกมาทั้งหมด
ข้อมูลที่ได้จะอยู่ในรูปของ JSON
{
"a" : 50,
"b" : {
"a" : 20,
"b" : 30
}
}
#include
#include
// Config Firebase
#define FIREBASE_HOST "nodemcu-dfc8e.firebaseio.com"
#define FIREBASE_AUTH "sEcvkstjpTArjiq1rHaZly5iYHUfcL9Ym2FcqBMP"
// Config connect WiFi
#define WIFI_SSID "Tenda_3EF910"
#define WIFI_PASSWORD "gift4321"
int pin_Led = D4;
void setup() {
pinMode(pin_Led, OUTPUT);
Serial.begin(9600);
WiFi.mode(WIFI_STA);
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
FirebaseObject data = Firebase.get("/a/c");
// data.getInt("path/path");
int a = data.getInt("a");
int ba = data.getInt("/b/a");
int bb = data.getInt("/b/b");
if (Firebase.failed()) {
Serial.println(Firebase.error());
return;
} else {
Serial.print("A = ");
Serial.println(a);
Serial.print("BA = ");
Serial.println(ba);
Serial.print("BB = ");
Serial.println(bb);
}
delay(10000);
}
***ควรดึงมาเฉพาะค่าที่ต้องการเท่านั้น เพราะใน MCU มีหน่วยความจำน้อย
- การลบข้อมูล การลบข้อมูล Delete : คำสั่ง remove
ให้ลบข้อมูลในแถบสีเหลือง
#include
#include
// Config Firebase
#define FIREBASE_HOST "nodemcu-dfc8e.firebaseio.com"
#define FIREBASE_AUTH "sEcvkstjpTArjiq1rHaZly5iYHUfcL9Ym2FcqBMP"
// Config connect WiFi
#define WIFI_SSID "Tenda_3EF910"
#define WIFI_PASSWORD "gift4321"
int pin_Led = D4;
void setup() {
pinMode(pin_Led, OUTPUT);
Serial.begin(9600);
WiFi.mode(WIFI_STA);
// connect to wifi.
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
Firebase.remove("/a/c/a");
if (Firebase.failed()) {
Serial.println(Firebase.error());
return;
} else {
Serial.println("Delete OK");
}
delay(10000);
}