· 6 months ago · Apr 10, 2025, 11:35 AM
1#include <Arduino.h>
2#if defined(ESP32)
3 #include <WiFi.h>
4#elif defined(ESP8266)
5 #include <ESP8266WiFi.h>
6#endif
7#include <Firebase_ESP_Client.h>
8#include <Wire.h>
9#include <Adafruit_Sensor.h>
10#include <Adafruit_BME280.h>
11
12// Menyediakan info tentang proses pembuatan token.
13#include "addons/TokenHelper.h"
14
15// Menyediakan info pencetakan muatan dari database dan fungsi bantuan lainnya
16#include "addons/RTDBHelper.h"
17
18// Masukkan info untuk masuk ke jaringan internet
19#define WIFI_SSID "ISIKAN_NAMA_ACCESS_POINT"
20#define WIFI_PASSWORD "ISIKAN_KATA_SANDI_ACCESS_POINT"
21
22// Masukkan Project API Key dari Firebase
23#define API_KEY "ISIKAN_PROJECT_API_KEY_DARI_FIREBASE"
24
25// Masukkan alamat email dan kata sandi untuk mengakses Firebase
26#define USER_EMAIL "ISIKAN_EMAIL_UNTUK_LOGIN"
27#define USER_PASSWORD "ISIKAN_KATA_SANDI_UNTUK_LOGIN"
28
29// Masukkan alamat (URL) dari Real Time Database (RTDB)
30#define DATABASE_URL "ISIKAN ALAMAT (URL) DARI DATABASE"
31
32// Mendeklarasikan objek-objek dari Firebase
33FirebaseData fbdo;
34FirebaseAuth auth;
35FirebaseConfig config;
36
37// Variabel untuk menyimpan USER UID dari Firebase
38String uid;
39
40// Berbagai variable untuk menyimpan direktori (path) dari database
41String databasePath;
42String tempPath;
43String humPath;
44String presPath;
45
46// Mendeklarasikan sensor BME280 dan parameter pengukuran
47Adafruit_BME280 bme; // Menggunakan koneksi I2C
48float temperature;
49float humidity;
50float pressure;
51
52// Mendeklarasikan variable pewaktu (untuk mengirim data setiap 3 menit)
53unsigned long sendDataPrevMillis = 0;
54unsigned long timerDelay = 180000;
55
56// Fungsi untuk mengecek koneksi sensor BME280
57void initBME()
58{
59 if (!bme.begin(0x76))
60 {
61 Serial.println("Could not find a valid BME280 sensor, check wiring!");
62 while (1);
63 }
64}
65
66// Fungsi untuk koneksi ke WiFi
67void initWiFi()
68{
69 WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
70 Serial.print("Connecting to WiFi ..");
71 while (WiFi.status() != WL_CONNECTED)
72 {
73 Serial.print('.');
74 delay(1000);
75 }
76 Serial.println(WiFi.localIP());
77 Serial.println();
78}
79
80// Fungsi untuk menulis nilai pecahan (float) ke database
81void sendFloat(String path, float value)
82{
83 if (Firebase.RTDB.setFloat(&fbdo, path.c_str(), value))
84 {
85 Serial.print("Writing value: ");
86 Serial.print (value);
87 Serial.print(" on the following path: ");
88 Serial.println(path);
89 Serial.println("PASSED");
90 Serial.println("PATH: " + fbdo.dataPath());
91 Serial.println("TYPE: " + fbdo.dataType());
92 }
93 else
94 {
95 Serial.println("FAILED");
96 Serial.println("REASON: " + fbdo.errorReason());
97 }
98}
99
100void setup()
101{
102 Serial.begin(115200);
103
104 // Inisialisasi sensor BME280
105 initBME();
106
107 // Inisialisasi WiFi
108 initWiFi();
109
110 // Memasukkan API KEY dari Firebase
111 config.api_key = API_KEY;
112
113 // Memasukkan info login ke Firebase
114 auth.user.email = USER_EMAIL;
115 auth.user.password = USER_PASSWORD;
116
117 // Memasukkan alamat (URL) dari database
118 config.database_url = DATABASE_URL;
119
120 Firebase.reconnectWiFi(true);
121 fbdo.setResponseSize(4096);
122
123 // Menjalankan fungsi pemanggil bila pembuatan token berjalan lama
124 config.token_status_callback = tokenStatusCallback; //mengakses addons/TokenHelper.h
125
126 // Mendeklarasikan jumlah pengulangan maksimal untuk pembuatan token
127 config.max_token_generation_retry = 5;
128
129 // Menjalankan proses otentikasi di Firebase
130 Firebase.begin(&config, &auth);
131
132 // Mendapatkan USER UID setelah beberapa saat
133 Serial.println("Getting User UID");
134 while ((auth.token.uid) == "")
135 {
136 Serial.print('.');
137 delay(1000);
138 }
139
140 // Menampilkan USER UID dari Firebase
141 uid = auth.token.uid.c_str();
142 Serial.print("User UID: ");
143 Serial.print(uid);
144
145 // Mengatur direktori untuk database
146 databasePath = "/UsersData/" + uid;
147 // Mendefinisikan direktori untuk hasil pembacaan sensor
148 // --> UsersData/<user_uid>/sensor/temperature
149 tempPath = databasePath + "/sensor/temperature";
150 // --> UsersData/<user_uid>/sensor/humidity
151 humPath = databasePath + "/sensor/humidity";
152 // --> UsersData/<user_uid>/sensor/pressure
153 presPath = databasePath + "/sensor/pressure";
154}
155
156void loop()
157{
158 // Mengirimkan hasil pembacaan sensor ke database
159 if (Firebase.ready() && (millis() - sendDataPrevMillis > timerDelay || sendDataPrevMillis == 0))
160 {
161 sendDataPrevMillis = millis();
162
163 // Mengambil hasil pembacaan yang terbaru
164 temperature = bme.readTemperature();
165 humidity = bme.readHumidity();
166 pressure = bme.readPressure()/100.0F;
167
168 // Mengirimkan hasil pembacaan ke database
169 sendFloat(tempPath, temperature);
170 sendFloat(humPath, humidity);
171 sendFloat(presPath, pressure);
172 }
173}