Hi!
I need to read data from the Firebase real time database which connected with ESP8266.ESP8266 nodemcu fetching time data form the Firebase database by using DS3231RTC module. but after the execution of code;there's a message showing path is not exist in serial time monitor when it fetching data from the database.Here is my full code.Hope I will find a better solution to fix this issue.
#include <ESP8266WiFi.h>
#include <RTClib.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <Firebase_ESP_Client.h>
#include <UrlEncode.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_PWMServoDriver.h>
const int buzzerPin = 15; // D8
const int irSensorPin = 2; // D4
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
const char *ssid = " 56651";
const char *password = "------ ";
#define FIREBASE_HOST "----------------.firebasedatabase.app"
#define FIREBASE_API_KEY "-----------------------------"
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long sendDataPrevMillis = 0;
int alarmHours[3] = {0};
int alarmMinutes[3] = {0};
bool isDispensed[3] = {false};
bool signupOK = false;
// RTC_DS3231<TwoWire> Rtc(Wire);
RTC_DS3231 rtc;
const int servoOpenPosition = 30;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
String phoneNumber = "+------------";
String apiKey = "-----------";
void displayDateTime(const DateTime &dt);
void checkAndDispensePills(const DateTime &now);
void dispensePills(int slot);
void sendMessage(String message);
void setup()
{
Serial.begin(115200);
Wire.begin();
pinMode(buzzerPin, OUTPUT);
pinMode(irSensorPin, INPUT);
if (!rtc.begin())
{
Serial.println("Couldn't find RTC");
}
lcd.init();
lcd.backlight();
pwm.begin();
pwm.setPWMFreq(60);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Database URL: " + String(FIREBASE_HOST));
Serial.println("API Key: " + String(FIREBASE_API_KEY));
config.api_key = FIREBASE_API_KEY;
config.database_url = FIREBASE_HOST;
if (Firebase.signUp(&config, &auth, "", ""))
{
Serial.println("ok");
signupOK = true;
}
else
{
Serial.printf("%s\n", config.signer.signupError.message.c_str());
}
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
if (Firebase.ready())
{
Serial.println("Firebase is ready!");
}
else
{
Serial.println("Failed to initialize Firebase");
}
Firebase.reconnectWiFi(true);
if (!Firebase.RTDB.beginStream(&fbdo, "/times"))
{
Serial.println("Failed to begin stream: " + fbdo.errorReason());
}
}
void loop()
{
DateTime now = rtc.now();
displayDateTime(now);
// Check for updates at a less frequent interval or upon specific triggers
static unsigned long lastFirebaseUpdate = 0;
unsigned long currentMillis = millis();
if (currentMillis - lastFirebaseUpdate > 60000)
{ // Update every 60 seconds
for (int i = 0; i < 3; i++)
{
if (Firebase.RTDB.readStream(&fbdo))
{
if (fbdo.streamAvailable())
{
int time1_hour = fbdo.intData()["time1"]["hour"];
int time1_minute = fbdo.intData()["time1"]["minute"];
int time2_hour = fbdo.intData()["time2"]["hour"];
int time2_minute = fbdo.intData()["time2"]["minute"];
int time3_hour = fbdo.intData()["time3"]["hour"];
int time3_minute = fbdo.intData()["time3"]["minute"];
alarmHours[0] = time1_hour;
alarmMinutes[0] = time1_minute;
alarmHours[1] = time2_hour;
alarmMinutes[1] = time2_minute;
alarmHours[2] = time3_hour;
alarmMinutes[2] = time3_minute;
lcd.print("Time1: " + String(time1_hour) + ":" + String(time1_minute));
lcd.print("Time2: " + String(time2_hour) + ":" + String(time2_minute));
lcd.print("Time3: " + String(time3_hour) + ":" + String(time3_minute));
}
}
if (!Firebase.RTDB.getString(&fbdo, "/alarmMinutes/" + String(i)))
{
Serial.println("Failed to fetch alarm hours: " + fbdo.errorReason());
}
if (!Firebase.RTDB.getString(&fbdo, "/alarmMinutes/" + String(i)))
{
Serial.println("Failed to fetch alarm minutes: " + fbdo.errorReason());
}
}
lastFirebaseUpdate = currentMillis;
}
checkAndDispensePills(now);
// Read the state of the IR sensor and check for transition from HIGH to LOW
int sensorState = digitalRead(irSensorPin);
static int lastSensorState = HIGH; // Assuming pull-up resistor in the circuit
if (sensorState == LOW && lastSensorState == HIGH)
{
sendMessage("Pills dispensed");
delay(1000); // Simple debounce delay
}
lastSensorState = sensorState;
}
void displayDateTime(const DateTime &dt)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Date:");
lcd.print(dt.year());
lcd.print("-");
lcd.print(dt.month());
lcd.print("-");
lcd.print(dt.day());
lcd.setCursor(0, 1);
lcd.print("Time:");
lcd.print(dt.hour());
lcd.print(":");
lcd.print(dt.minute());
lcd.print(":");
lcd.print(dt.second());
}
void checkAndDispensePills(const DateTime &now)
{
for (int i = 0; i < 3; i++)
{
if (now.hour() == alarmHours[i] && now.minute() == alarmMinutes[i] && !isDispensed[i])
{
digitalWrite(buzzerPin, HIGH);
lcd.setCursor(0, 0);
lcd.print("Hello!");
lcd.setCursor(0, 1);
lcd.print("Dispensing pills");
delay(3000);
digitalWrite(buzzerPin, LOW);
dispensePills(i);
isDispensed[i] = true;
break;
}
}
}
void dispensePills(int slot)
{
pwm.setPWM(slot, 0, servoOpenPosition);
delay(5000);
pwm.setPWM(slot, 0, 0);
}
void sendMessage(String message)
{
String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
WiFiClient client;
HTTPClient http;
http.begin(client, url);
int httpResponseCode = http.GET();
if (httpResponseCode == 200)
{
Serial.println("Message sent successfully");
}
else
{
Serial.print("Error sending the message, HTTP response code: ");
Serial.println(httpResponseCode);
}
http.end();
}