#define BLYNK_TEMPLATE_ID "TMPL6uT4j671M"
#define BLYNK_TEMPLATE_NAME "ontap3"
#define BLYNK_AUTH_TOKEN "og9pT_3j7YeeYCfJ_I29_kx34n90ZCGX"
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
#include <BlynkSimpleEsp32.h>
#include "ThingSpeak.h"
#include <HTTPClient.h>
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const int myChannelNumber = 2577806;
const char* myApiKey = "P9C0TLUJH2EO7996";
const char* server = "api.thingspeak.com";
const char* FIREBASE_HOST = "https://ontap-1ca91-default-rtdb.asia-southeast1.firebasedatabase.app/";
const char* FIREBASE_AUTH = "cIicVEKmPAp3aVqfQEdPEcBXUXihNqwvyTtrdSTf";
const char* FIREBASE_PATH = "/weather_data.json";
#define LIGHT_SENSOR_PIN 34
WiFiClient client;
const int trigPin = 5;
const int echoPin = 18;
#define SOUND_SPEED 0.034
#define LED_PIN 26
#define LED_PIN1 13
const int servoPin = 23;
Servo servo;
long duration;
float distanceCm;
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(14, DHT22);
float temperature;
float humidity;
float analogValue;
int counter;
int pos = 0;
float prev_temperature = 0;
float prev_humidity = 0;
float prev_distanceCm = 0;
float prev_analogValue = 0;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
void update_firebase_data(float temperature, float humidity, float distanceCm, float analogValue) {
if (temperature != prev_temperature || humidity != prev_humidity || distanceCm != prev_distanceCm || analogValue != prev_analogValue) {
String data = "{\"temperature\":" + String(temperature) + ",\"humidity\":" + String(humidity) + ",\"distanceCm\":" + String(distanceCm) + ",\"analogValue\":" + String(analogValue) +"}";
String url = String(FIREBASE_HOST) + String(FIREBASE_PATH) + "?auth=" + String(FIREBASE_AUTH) ;
HTTPClient http;
http.begin(url);
http.addHeader("Content-Type", "application/json");
int httpCode = http.PUT(data);
if (httpCode > 0) {
Serial.println("Firebase response (PUT): " + http.getString());
prev_temperature = temperature;
prev_humidity = humidity;
prev_distanceCm = distanceCm;
prev_analogValue = analogValue;
} else {
Serial.println("Error updating or fetching data from Firebase: " + String(http.errorToString(httpCode).c_str()));
}
http.end();
}
}
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN1, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
servo.attach(servoPin, 500, 2400);
Blynk.begin(auth, ssid, pass);
timer.setInterval(2000L, sendDHTData);
ThingSpeak.begin(client);
}
BLYNK_WRITE(V3) {
int buttonState = param.asInt();
if (buttonState == 1) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
void led11() {
if (temperature > 40 || humidity > 40) {
for (int i = 0; i < 10; i++) {
digitalWrite(LED_PIN1, HIGH);
delay(250);
digitalWrite(LED_PIN1, LOW);
delay(250);
}
} else {
digitalWrite(LED_PIN1, LOW);
}
}
void servo222() {
if (distanceCm < 20) {
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(15);
}
}
}
void sendDHTData() {
float t = dht.readTemperature();
float h = dht.readHumidity();
float s = analogRead(LIGHT_SENSOR_PIN);
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
Blynk.virtualWrite(V2, distanceCm);
Blynk.virtualWrite(V4, s);
update_firebase_data(t, h, distanceCm, s); // Pass all three values to update_firebase_data
ThingSpeak.setField(1, t);
ThingSpeak.setField(2, h);
ThingSpeak.setField(3, distanceCm);
ThingSpeak.setField(4, s);
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
if (x == 200) {
Serial.println("Data pushed successfully");
} else {
Serial.println("Push error: " + String(x));
}
}
void hienthilcd() {
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("NGUYEN TIEN DAT");
lcd.setCursor(0,1);
lcd.print("21161443");
}
void hienthidht() {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
Serial.println("Data: " + String(counter));
Serial.print("Temperature:\t");
Serial.print(temperature);
Serial.println("C");
Serial.print("Humidity:\t");
Serial.println(humidity);
delay(100);
counter++;
}
void sieuamhc04() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * SOUND_SPEED / 2;
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
delay(100);
}
void loop() {
hienthilcd();
hienthidht();
sieuamhc04();
servo222();
Blynk.run();
timer.run();
led11();
Lightdector();
delay(100);
}
void Lightdector() {
// reads the input on analog pin (value between 0 and 4095)
int analogValue = analogRead(LIGHT_SENSOR_PIN);
Serial.print("Analog Value = ");
Serial.print(analogValue); // the raw analog reading
// We'll have a few threshholds, qualitatively determined
if (analogValue < 40) {
Serial.println(" => Dark");
} else if (analogValue < 800) {
Serial.println(" => Dim");
} else if (analogValue < 2000) {
Serial.println(" => Light");
} else if (analogValue < 3200) {
Serial.println(" => Bright");
} else {
Serial.println(" => Very bright");
}
delay(500);
}