weatherPredictor / ArduinoWeatherPred /ArduinoWeatherPred.ino
DhominickJ's picture
Initial Commit for the final application named weather_predictor using SVM
6308dc1
/**
* ESP32 Firebase Sensor Monitoring System
*
* This script collects data from DHT sensor (temperature and humidity)
* and a photoresistor (light intensity), then uploads it to Firebase
* Realtime Database.
*
* Libraries required:
* - WiFiManager by tzapu (https://github.com/tzapu/WiFiManager)
* - Firebase-ESP32 by mobizt (https://github.com/mobizt/Firebase-ESP32)
* - DHT sensor library by Adafruit
*/
#include <WiFiManager.h> // WiFiManager library for easy network configuration
#include <FirebaseESP32.h> // Firebase ESP32 client library
#include <DHT.h> // DHT sensor library
#include <addons/TokenHelper.h> // Firebase token generation helper
#include <addons/RTDBHelper.h> // Firebase RTDB helper
// Firebase credentials - Get these from Firebase Console
#define API_KEY "AIzaSyAJpYEXlwTjMOIAueqqDiti49PKRnsXAns" // Project settings -> General -> Your apps -> Web API Key
#define DATABASE_URL "https://projectstrata-57a90-default-rtdb.asia-southeast1.firebasedatabase.app" // e.g. "https://your-project-id-default-rtdb.firebasedatabase.app/"
// User Email and Password for Firebase Authentication
// Create this user in Firebase Console -> Authentication -> Users
#define USER_EMAIL "device@projectstrata.com"
#define USER_PASSWORD "projectstrata"
// Sensor and button pin definitions
#define DHT_PIN 15 // Digital pin connected to the DHT sensor
#define LDR_PIN 34 // Analog pin connected to the LDR (photoresistor)
#define RESET_BTN_PIN 23 // Digital pin for WiFi reset button
#define DHT_TYPE DHT11 // DHT sensor type (DHT11, DHT22, etc.)
// Data upload interval (milliseconds)
#define UPLOAD_INTERVAL 5000
#define BUTTON_HOLD_TIME 5000
// Firebase objects
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
// DHT sensor
DHT dht(DHT_PIN, DHT_TYPE);
// Global variables
unsigned long lastUploadTime = 0;
unsigned long buttonPressTime = 0;
String deviceId;
bool signupOK = false;
bool resetButtonPressed = false;
bool checkResetButton() {
if (digitalRead(RESET_BTN_PIN) == LOW) {
if (!resetButtonPressed) {
resetButtonPressed = true;
buttonPressTime = millis();
// Serial.println("Hold to reset WiFi");
}
if (resetButtonPressed && (millis() - buttonPressTime >= BUTTON_HOLD_TIME)) {
return true;
}
} else {
if (resetButtonPressed) {
resetButtonPressed = false;
}
}
return false;
}
void setupWiFi() {
WiFiManager wifiManager;
if (checkResetButton()) {
// Serial.println("Resetting WiFi settings");
wifiManager.resetSettings();
}
String apName = "ProjectSTRATA - WiFiSetter";
wifiManager.setConfigPortalTimeout(180);
if (!wifiManager.autoConnect(apName.c_str())) {
Serial.println("Failed to connect");
ESP.restart();
}
// Serial.print("Connected: ");
Serial.println(WiFi.localIP());
deviceId = String((uint32_t)ESP.getEfuseMac(), HEX);
}
void setupFirebase() {
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD;
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
if (Firebase.signUp(&config, &auth, USER_EMAIL, USER_PASSWORD)) {
// Serial.println("Firebase sign up OK");
signupOK = true;
} else {
Serial.printf("Sign up failed: %s\n", config.signer.signupError.message.c_str());
}
Firebase.reconnectWiFi(true);
}
bool readSensorData(float &temperature, float &humidity, int &light) {
// Read temperature
temperature = dht.readTemperature();
if (isnan(temperature)) {
return false;
}
// Read humidity
humidity = dht.readHumidity();
if (isnan(humidity)) {
return false;
}
// Read light
light = analogRead(LDR_PIN);
Serial.printf("Temp: %.1f°C, Humidity: %.1f%%, Light: %d\n",
temperature, humidity, light);
return true;
}
void uploadToFirebase() {
if (!signupOK || !Firebase.ready()) {
// Serial.println("Firebase not ready");
return;
}
float temperature, humidity;
int lightIntensity;
if (!readSensorData(temperature, humidity, lightIntensity)) {
return;
}
unsigned long timestamp = millis();
// Create JSON with minimal memory footprint
FirebaseJson json;
json.add("id", deviceId);
json.add("ts", timestamp);
json.add("temp", temperature);
json.add("hum", humidity);
json.add("light", lightIntensity);
// Path to save data
String path = "/sensor_data/" + deviceId + "/" + String(timestamp);
if (Firebase.setJSON(fbdo, path, json)) {
Serial.println("Data uploaded OK");
} else {
Serial.println("Upload failed: " + fbdo.errorReason());
}
// Update latest data with minimal path length
if (Firebase.setJSON(fbdo, "/latest/" + deviceId, json)) {
Serial.println("Latest data updated");
}
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LDR_PIN, INPUT);
pinMode(RESET_BTN_PIN, INPUT_PULLUP);
setupWiFi();
setupFirebase();
}
void loop() {
// Check for WiFi reset
if (checkResetButton()) {
// Serial.println("WiFi reset requested");
WiFiManager wifiManager;
wifiManager.resetSettings();
ESP.restart();
}
// Upload data at interval
if (millis() - lastUploadTime >= UPLOAD_INTERVAL) {
uploadToFirebase();
lastUploadTime = millis();
}
delay(100);
}