#include <WiFi.h>
#include <FirebaseESP32.h>
#include <DHT.h> //menambahkan library
#include "DHTesp.h"
#include <ESP32Servo.h>
#include "ThingsBoard.h"
#include "ThingSpeak.h"
#include <addons/TokenHelper.h>
#define DATABASE_URL "https://hidromonitor-5fd45-default-rtdb.asia-southeast1.firebasedatabase.app/"
#define API_KEY "AIzaSyATXzn_u51-4Wv4Y5J_w-6hQWGqjqjm4MA"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "a78hml8fVaAJaIx0r04m"
#define THINGSBOARD_SERVER "thingsboard.cloud"
//ThingSpeak
const int myChannelNumber = 2233815;
const char* myApiKey = "ICB9HBKI0XVF5WZT";
const char* server = "api.thingspeak.com";
/* 4. Define the user Email and password that alreadey registerd or added in your project */
#define USER_EMAIL "[email protected]"
#define USER_PASSWORD "Wokwi$44d"
DHTesp dhtSensor;
WiFiClient espClient;
ThingsBoard tb(espClient);
//Define FirebaseESP32 data object
FirebaseData firebaseData;
FirebaseJson json;
FirebaseAuth auth;
FirebaseConfig config;
#define DHTpin 18 //koneksi pin DHT22 di pin 2
#define DHTtype DHT22 //membuat variable nama sensor
//Membuat object dht
DHT dht(DHTpin, DHTtype);
//inisialisasi variabel
float humidity, tempC, tempF;
#define buzzerPin 33
#define ledMerah 13
#define ledKuning 12
#define ledHijau 14
#define LDR_PIN 2
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
const char* ntpServer = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = 25200;
const int daylightOffset_sec = 0;
String timeTmp;
int monthToNumber(String month) {
String months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
for (int i = 1; i <= 12; i++) {
if (months[i - 1] == month) {
return i;
}
}
}
void getTime()
{
timeTmp = "";
struct tm* timeinfo;
time_t now;
time(&now);
if (now > 1000000000) {
timeinfo = localtime(&now);
String time = "";
char year[5];
strftime(year, 5, "%Y", timeinfo);
time = time + String(year) + " ";
char month[10];
strftime(month, 10, "%B", timeinfo);
time = time + monthToNumber(month) + "-";
char day[3];
strftime(day, 3, "%d", timeinfo);
time = time + String(day) + "-";
char hour[3];
strftime(hour, 3, "%H", timeinfo);
time = time + String(hour) + ":";
char minute[3];
strftime(minute, 3, "%M", timeinfo);
time = time + String(minute) + ":";
char second[3];
strftime(second, 3, "%S", timeinfo);
time = time + String(second);
timeTmp = time;
}
}
void setup() {
Serial.begin(115200);
pinMode(buzzerPin, OUTPUT);
pinMode(ledMerah, OUTPUT);
pinMode(ledKuning, OUTPUT);
pinMode(ledHijau, OUTPUT);
pinMode(LDR_PIN, INPUT);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(1000);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Serial.printf("Firebase Client v%s\n\n", FIREBASE_CLIENT_VERSION);
/* Assign the api key (required) */
config.api_key = API_KEY;
/* Assign the user sign in credentials */
auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD;
/* Assign the RTDB URL (required) */
config.database_url = DATABASE_URL;
/* Assign the callback function for the long running token generation task */
config.token_status_callback = tokenStatusCallback; // see addons/TokenHelper.h
// Or use legacy authenticate method
// config.database_url = DATABASE_URL;
// config.signer.tokens.legacy_token = "<database secret>";
// To connect without auth in Test Mode, see Authentications/TestMode/TestMode.ino
//////////////////////////////////////////////////////////////////////////////////////////////
// Please make sure the device free Heap is not lower than 80 k for ESP32 and 10 k for ESP8266,
// otherwise the SSL connection will fail.
//////////////////////////////////////////////////////////////////////////////////////////////
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
//Set database read timeout to 1 minute (max 15 minutes)
Firebase.setReadTimeout(firebaseData, 1000 * 60);
//tiny, small, medium, large and unlimited.
//Size and its write timeout e.g. tiny (1s), small (10s), medium (30s) and large (60s).
Firebase.setwriteSizeLimit(firebaseData, "tiny");
Serial.println("------------------------------------");
Serial.println("Connected...");
dht.begin();
tb.connect(THINGSBOARD_SERVER, TOKEN);
ThingSpeak.begin(espClient);
}
void loop() {
int analogValue = analogRead(A0);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
getTime();
humidity = dht.readHumidity(); //baca humidity
tempC = dht.readTemperature(); //baca temperature celcius
tempF = dht.readTemperature(true); //baca temperature fahrenheit
if (timeTmp != "") {
Serial.print("Humidity : ");
Serial.println(humidity);
Serial.print("Temperature Celcius : ");
Serial.println(tempC);
Serial.print("Temperature Fahrenheit : ");
Serial.println(tempF);
json.set("/humidity", humidity);
json.set("/celcius", tempC);
json.set("/fahrenheit", tempF);
json.set("/timestamp", timeTmp);
Firebase.updateNode(firebaseData, ("/data/" + timeTmp), json);
}
tb.sendTelemetryData("humidity", humidity); //perintah kirim data humidity
tb.sendTelemetryData("temp celcius", tempC); //perintah kirim data temperature celcius
tb.sendTelemetryData("temp fahrenheit", tempF); //perintah kirim data temperature fahrenheit
ThingSpeak.setField(1, humidity);
ThingSpeak.setField(2, tempF);
ThingSpeak.setField(3, tempC);
ThingSpeak.writeFields(myChannelNumber, myApiKey);
if (humidity < 40 || humidity > 70) {
tone(buzzerPin, 150);
delay(300);
noTone(buzzerPin);
}
if (lux > 50) {
if (tempC < 40 || tempC > 70) {
digitalWrite(ledHijau, LOW);
digitalWrite(ledKuning, LOW);
digitalWrite(ledMerah, HIGH);
} else if (tempC < 60) {
digitalWrite(ledHijau, LOW);
digitalWrite(ledKuning, HIGH);
digitalWrite(ledMerah, LOW);
} else if (tempC >= 60) {
digitalWrite(ledHijau, HIGH);
digitalWrite(ledKuning, LOW);
digitalWrite(ledMerah, LOW);
}
} else {
if (tempC < 40 || tempC > 60) {
digitalWrite(ledHijau, LOW);
digitalWrite(ledKuning, LOW);
digitalWrite(ledMerah, HIGH);
} else if (tempC < 50) {
digitalWrite(ledHijau, LOW);
digitalWrite(ledKuning, HIGH);
digitalWrite(ledMerah, LOW);
} else if (tempC >= 50) {
digitalWrite(ledHijau, HIGH);
digitalWrite(ledKuning, LOW);
digitalWrite(ledMerah, LOW);
}
}
delay(10000);
}