#include <Arduino.h>
#include <WiFi.h>
#include <Firebase_ESP_Client.h>
// Include the official helper files (do not redefine tokenStatusCallback)
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
// Wi-Fi credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Firebase credentials
#define API_KEY "AIzaSyDm8RLIB53hnxfX6UQ7ik7AOT9Uv_bFjWw"
#define DATABASE_URL "modelprediction-1a0f6-default-rtdb.firebaseio.com/" // Must start with https://
// Firebase objects
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
const int LED_PIN = 16; // GPIO16
bool signupOK = false;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
// Connect to Wi-Fi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println("\nConnected to WiFi");
Serial.println("IP Address: " + WiFi.localIP().toString());
// Firebase configuration
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
config.token_status_callback = tokenStatusCallback; // Use the one from TokenHelper.h
// Sign up (anonymous)
if (Firebase.signUp(&config, &auth, "", "")) {
Serial.println("Firebase signup OK");
signupOK = true;
} else {
Serial.printf("Firebase signup failed: %s\n", config.signer.signupError.message.c_str());
}
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop() {
if (Firebase.ready() && signupOK) {
if (Firebase.RTDB.getBool(&fbdo, "/LedState")) {
bool ledState = fbdo.boolData();
digitalWrite(LED_PIN, ledState ? HIGH : LOW);
Serial.printf("LED State from Firebase: %s\n", ledState ? "ON" : "OFF");
} else {
Serial.println("Failed to get LED state: " + fbdo.errorReason());
}
delay(2000);
}
}
--------------------------------------------------------------------------
import numpy as np
from sklearn.linear_model import LinearRegression
# Sample data
X = np.array([[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]) # Time (hours)
y = np.array([20.0, 21.5, 23.0, 24.5, 26.0, 27.5, 29.0, 30.5, 32.0, 33.5]) # Temperature (°C)
# Train linear regression model
model = LinearRegression()
model.fit(X, y)
# Extract model parameters
slope = model.coef_[0]
intercept = model.intercept_
# Print parameters for use in Android app
print(f"Slope (m): {slope}")
print(f"Intercept (b): {intercept}")
# Example prediction
test_time = 10
predicted_temp = model.predict([[test_time]])[0]
print(f"Predicted temperature at time {test_time} hours: {predicted_temp:.2f}°C")
-----------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<EditText
android:id="@+id/timeInput"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Enter time (hours)"
android:inputType="numberDecimal"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintWidth_percent="0.8" />
<Button
android:id="@+id/predictButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Predict"
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/timeInput"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/predictionTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Prediction: N/A"
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/predictButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
------------------------------------------------------------------
package com.example.ledfirebaseapp;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class MainActivity extends AppCompatActivity {
private EditText timeInput;
private Button predictButton;
private TextView predictionTextView;
private DatabaseReference databaseReference;
private boolean ledState = false;
private static final double SLOPE = 1.5; // From Python model
private static final double INTERCEPT = 20.0; // From Python model
private static final double TEMP_THRESHOLD = 28.0; // LED ON if temp > 28°C
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize UI components
timeInput = (EditText) findViewById(R.id.timeInput);
predictButton = (Button) findViewById(R.id.predictButton);
predictionTextView = (TextView) findViewById(R.id.predictionTextView);
// Initialize Firebase Database
databaseReference = FirebaseDatabase.getInstance().getReference("LedState");
// Set initial LED state
databaseReference.setValue(ledState);
// Button click listener for prediction
predictButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String inputText = timeInput.getText().toString();
if (inputText.isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter a time value", Toast.LENGTH_SHORT).show();
return;
}
try {
// Parse input time
double time = Double.parseDouble(inputText);
// Calculate prediction using linear regression: y = mx + b
double predictedTemp = SLOPE * time + INTERCEPT;
// Update LED state based on prediction
ledState = predictedTemp > TEMP_THRESHOLD;
databaseReference.setValue(ledState)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
predictionTextView.setText(String.format("Predicted Temperature: %.2f°C\nLED: %s",
predictedTemp, ledState ? "ON" : "OFF"));
Toast.makeText(MainActivity.this, "Prediction and LED state updated", Toast.LENGTH_SHORT).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Toast.makeText(MainActivity.this, "Failed to update LED state: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
});
} catch (NumberFormatException e) {
Toast.makeText(MainActivity.this, "Invalid input: Please enter a valid number", Toast.LENGTH_SHORT).show();
}
}
});
}
}