Hi BDX-ian!
Tutorial sebelum ini kita dah belajar tentang Hantar data dari NodeMCU ESP8266 ke Firebase. Jadi untuk tutorial kali ini kita akan belajar nak terima data dari Firebase Realtime Database dengan menggunakan NodeMCU ESP8266.
User akan terima data jarak objek dan formatted time dari Realtime Database setiap 10 saat dan data dipaparkan pada Serial Monitor. NodeMCU ESP8266 pula akan menghantar data jarak dan timestamp ke Realtime Database setiap 5 saat dan data dipaparkan pada Serial Monitor.
Apa itu Firebase?
Firebase adalah database NoSQL yang membolehkan anda menyimpan dan menyelaraskan data antara user lain dalam realtime. Firebase merupakan platform yang dibangunkan oleh Google untuk menghasilkan aplikasi mobile dan web. Ia pada asalnya merupakan sebuah syarikat bebas yang diasaskan pada tahun 2011. Pada tahun 2014, Google memperoleh platform ini untuk membantu developers menghasilkan Real-Time Apps yang lebih baik.
Jika anda belum pernah menggunakan Firebase, anda hendaklah mengikut semua langkah yang terdapat di tutorial: Hantar data dari NodeMCU ESP8266 ke Firebase.
Untuk memulakan tutorial ini, pertama sekali, anda perlu create project baru Firebase dan create Realtime Database untuk projek ini. Kemudian, anda akan memprogramkan ESP8266 untuk menyimpan dan membaca data daripada database.
Komponen
Komponen yang diperlukan
- Ultrasonic Sensor
- NodeMCU ESP8266 dan USB
- Breadboard
- Jumper wire
Litar
Ultrasonic sensor
- VCC → pin Vin ESP8266
- TRIG → pin D7 ESP8266
- ECHO → pin D8 ESP8266
- GND → GND ESP8266
Code
#include "FirebaseESP8266.h" #include <ESP8266WiFi.h> #include <NTPClient.h> #include <WiFiUdp.h>
// Provide the RTDB payload printing info and other helper functions. #include <addons/RTDBHelper.h>
#define WIFI_SSID "Nama WiFi anda" #define WIFI_PASSWORD "Password WiFi anda"
#define DATABASE_URL "Database URL projek anda //<databaseName>.firebaseio.com or <databaseName>.<region>.firebasedatabase.app
WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org");
const int trigPin = 13; const int echoPin = 15;
//Define Firebase Data object FirebaseData fbdo; FirebaseAuth auth;
FirebaseConfig config;
long duration; int distance;
String formattedTime;
unsigned long dataMillis = 0; unsigned long sendDataPrevMillis = 0;
void setup() { Serial.begin(115200); Serial.println(); Serial.println();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(300); } Serial.println(); Serial.print("Connected with IP: "); Serial.println(WiFi.localIP()); Serial.println();
Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);
config.database_url = DATABASE_URL;
config.signer.test_mode = true; timeClient.begin(); timeClient.setTimeOffset(28800);
Firebase.reconnectWiFi(true); Firebase.begin(&config, &auth);
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); }
void loop() { if (millis() - dataMillis > 5000) { dataMillis = millis();
Serial.println("------------------------------------"); Serial.println("Set Timestamp test...");
getTime(); getDistance();
if (millis() - sendDataPrevMillis > 10000) { sendDataPrevMillis = millis();
Serial.println(); Serial.printf("Get distance... %s\n", Firebase.getInt(fbdo, F("/set/distance"), &distance) ? String(distance).c_str() : fbdo.errorReason().c_str()); Serial.printf("Get formatted time... %s\n", Firebase.getString(fbdo, F("/set/timestamp/formatted_time"), &formattedTime) ? String(formattedTime).c_str() : fbdo.errorReason().c_str()); } } }
void getDistance() { digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration / 2) / 29.1;
if (Firebase.setInt(fbdo, "/set/distance", distance)) { Serial.print("Distance: "); Serial.println(distance); }
else { Serial.println("DISTANCE FAILED"); Serial.println("REASON: " + fbdo.errorReason()); Serial.println("------------------------------------"); Serial.println(); return; } }
void getTime() { timeClient.update();
unsigned long epochTime = timeClient.getEpochTime(); if (Firebase.setInt(fbdo, "/set/timestamp/epoch_time", epochTime)) { Serial.print("Epoch Time: "); Serial.println(epochTime); } String formattedTime = timeClient.getFormattedTime(); if (Firebase.setString(fbdo, "/set/timestamp/formatted_time", formattedTime)) { Serial.print("Formatted Time: "); Serial.println(formattedTime); }
int currentHour = timeClient.getHours(); if (Firebase.setString(fbdo, "/set/timestamp/current_hour", String(currentHour))) { Serial.print("Hour: "); Serial.println(currentHour); }
int currentMinute = timeClient.getMinutes(); if (Firebase.setString(fbdo, "/set/timestamp/current_minutes", String(currentMinute))) { Serial.print("Minutes: "); Serial.println(currentMinute); }
int currentSecond = timeClient.getSeconds(); if (Firebase.setString(fbdo, "/set/timestamp/current_seconds", String(currentSecond))) { Serial.print("Seconds: "); Serial.println(currentSecond); }
Serial.println("");
delay(2000); } |
Peringatan
Ganti dan tukar perkara ini ke dalam code anda.
#define WIFI_SSID "Nama WiFi anda" #define WIFI_PASSWORD "Password WiFi anda" #define DATABASE_URL "Database URL projek anda //<databaseName>.firebaseio.com or <databaseName>.<region>.firebasedatabase.app |
Output
- Firebase
Setiap 5 saat, ESP8266 akan hantar data ke database.
- Serial Monitor
Setiap 5 saat, output Serial Monitor memaparkan jarak dan timestamp apabila hantar data ke database.
Setiap 10 saat, output Serial Monitor memaparkan jarak dan formatted time apabila dapat data dari databse.
Jika anda suka dengan perkongsian tutorial dalam blog kami ni, jangan lupa untuk follow Facebook dan Instagram kami, kat situ ada bermacam info dan update terkini yang akan kami kongsikan kepada anda. Itu sahaja untuk tutorial kami. Stay update dan selamat mencuba!