diff --git a/microcontroller/sketch_apr22a/sketch_apr22a.ino b/microcontroller/sketch_apr22a/sketch_apr22a.ino
index 9e27697..a8f1bf6 100644
--- a/microcontroller/sketch_apr22a/sketch_apr22a.ino
+++ b/microcontroller/sketch_apr22a/sketch_apr22a.ino
@@ -53,8 +53,17 @@ bool pengujian = true;
float kadarGasVoltase;
String status = "Menunggu";
JSONVar dataPengujian;
+JSONVar dataPengujianDebug;
+JSONVar dataPengujianAwal;
JSONVar pengaturan;
+unsigned long tickOld = 0;
+unsigned long tickNow = 0;
+int tickDiffSecond;
+int tickCount;
+int insertDuration = 1;
+int hourPeriod = 0;
+
const char index_html[] PROGMEM = R"rawliteral(
@@ -170,6 +179,10 @@ void generateServer() {
request->send(200, "text/html", index_html);
});
+ server.on("/debug", HTTP_GET, [](AsyncWebServerRequest *request){
+ request->send(200, "application/json", JSON.stringify(dataPengujianDebug));
+ });
+
server.on("/", HTTP_POST, [](AsyncWebServerRequest *request) {
int params = request->params();
for(int i = 0; i < params; i++){
@@ -288,6 +301,8 @@ void setup(){
void loop(){
dns.processNextRequest();
+ tickNow = millis();
+ tickDiffSecond = (tickNow - tickOld) / 1000;
if (WiFi.status() == WL_CONNECTED) {
getPengaturan();
@@ -307,37 +322,32 @@ void loop(){
Serial.println("Mesin Siap!");
// menampilkan aku siap jika alat belum dirunning
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("Aku siap!");
- delay(1000);
+ int cursorPositions[][2] = {{0, 0}, {7, 0}, {0, 1}, {7, 1}};
+ for (int i = 0; i < 4; i++) {
+ float order = i + 1;
- lcd.clear();
- lcd.setCursor(7, 0);
- lcd.print("Aku siap!");
- delay(1000);
-
- lcd.clear();
- lcd.setCursor(0, 1);
- lcd.print("Aku siap!");
- delay(1000);
-
- lcd.clear();
- lcd.setCursor(7, 1);
- lcd.print("Aku siap!");
- delay(1000);
+ if (tickDiffSecond == (order / 4.0 * 4)) {
+ lcd.clear();
+ lcd.setCursor(cursorPositions[i][0], cursorPositions[i][1]);
+ }
+ }
}
} else {
Serial.println("Gagal terhubung ke " + WIFI_SSID);
+
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gagal terhubung");
lcd.setCursor(0, 1);
lcd.print("ke " + WIFI_SSID + "!");
-
- delay(1000);
}
+
+ if (tickDiffSecond >= 4) {
+ tickOld = tickNow;
+ }
+
+ delay(1000);
}
void runFermentasi() {
@@ -345,18 +355,6 @@ void runFermentasi() {
float kadarGas = getKadarGas();
kadarGasVoltase = kadarGas / 4095.0 * 3.3;
persentaseKadarGas = getPersentaseKadarGas(kadarGasVoltase);
-
- // menampilkan kadar gas pada LCD
- lcd.clear();
- lcd.setCursor(0, 0);
- lcd.print("G : ");
- lcd.print(persentaseKadarGas, 1);
- lcd.print(" %");
- lcd.setCursor(0,1);
- lcd.print("H : ");
- lcd.print(status);
-
- delay(2000);
// membaca nilai suhu dan kelembaban
suhu = dht.readTemperature();
@@ -369,8 +367,18 @@ void runFermentasi() {
if (isnan(kelembaban)) {
kelembaban = 0;
}
-
- if (suhu != 25.5 && kelembaban != 25.5) {
+
+ if (tickDiffSecond == 0) {
+ // menampilkan kadar gas pada LCD
+ lcd.clear();
+ lcd.setCursor(0, 0);
+ lcd.print("G : ");
+ lcd.print(persentaseKadarGas, 1);
+ lcd.print(" %");
+ lcd.setCursor(0,1);
+ lcd.print("H : ");
+ lcd.print(status);
+ } else if (tickDiffSecond == 2) {
// menampilkan suhu dan kelembaban pada LCD
lcd.clear();
lcd.setCursor(0, 0);
@@ -381,10 +389,14 @@ void runFermentasi() {
lcd.print("K : ");
lcd.print(kelembaban, 1);
lcd.print(" %");
+ }
+ if (suhu != 25.5 && kelembaban != 25.5) {
bool otomatis = (bool) pengaturan[0]["auto"];
int suhuMin = (int) pengaturan[0]["suhu_min"];
int suhuMax = (int) pengaturan[0]["suhu_max"];
+ bool buzzerOn = (bool) pengaturan[0]["buzzer_on"];
+ int buzzerTimer = (int) pengaturan[0]["buzzer_timer"];
// pilihan user menghidupkan kontrol otomatis atau manual
if (otomatis) {
@@ -409,51 +421,74 @@ void runFermentasi() {
digitalWrite(FANPIN, fanOn ? LOW : HIGH);
}
+ // menghidupkan dan mematikan buzzer berdasarkan state
+ digitalWrite(BUZZERPIN, buzzerOn ? HIGH : LOW);
+
+ // hitung mundur mematikan buzzer otomatis
+ if (buzzerOn) {
+ if (tickCount > 0) {
+ tickCount -= 1;
+
+ if (tickCount == 0) {
+ JSONVar req;
+ req["buzzer_on"] = false;
+
+ String json = JSON.stringify(req);
+
+ db.from("pengaturan").eq("id", "1").doUpdate(json);
+ }
+ } else {
+ tickCount = buzzerTimer;
+ }
+ } else {
+ tickCount = 0;
+ }
+
// menentukan data masuk ke pengujian atau tidak berdasarkan jarak jam
- long unsigned epochTimeNow = timeClient.getEpochTime();
- getDataPengujian();
+ if (tickDiffSecond >= 4) {
+ long unsigned epochTimeNow = timeClient.getEpochTime();
- if (dataPengujian.length() > 0) {
- JSONVar dataPengujianTerakhir = dataPengujian[dataPengujian.length() - 1];
- int created_time = dataPengujianTerakhir["created_time"];
+ getDataPengujian();
- int epochTimeDiff = epochTimeNow - created_time;
- int jam = epochTimeDiff / 3600; // 1 jam = 3600 detik;
-
- if (jam >= 1) {
+ if (dataPengujian.length() > 0) {
+ JSONVar dataPengujianTerakhir = dataPengujian[dataPengujian.length() - 1];
+ int created_time = dataPengujianTerakhir["created_time"];
+
+ int epochTimeDiff = epochTimeNow - created_time;
+ int jam = epochTimeDiff / 3600; // 1 jam = 3600 detik;
+
+ if (jam >= insertDuration) {
+ pengujian = true;
+ } else {
+ pengujian = false;
+ }
+ } else {
pengujian = true;
- } else {
- pengujian = false;
}
- } else {
- pengujian = true;
- }
- getDebugging();
+ getDebugging();
- String dataHistoriJson = db.from("histori_fermentasi").select("*").order("created_at", "desc", true).limit(1).doSelect();
- JSONVar dataHistori = JSON.parse(dataHistoriJson);
- bool statusHistoriTerakhir = dataHistori[0]["selesai"];
+ String dataHistoriJson = db.from("histori_fermentasi").select("*").order("created_at", "desc", true).limit(1).doSelect();
+ JSONVar dataHistori = JSON.parse(dataHistoriJson);
+ bool statusHistoriTerakhir = dataHistori[0]["selesai"];
+ int waktuAkhirHistori = dataHistori[0]["waktu_akhir"];
+ int waktuAwal = dataPengujianAwal["created_time"];
- if (statusHistoriTerakhir == false) {
- digitalWrite(BUZZERPIN, HIGH);
+ if (waktuAwal <= waktuAkhirHistori) {
+ bool historiTerakhirBerhasil = (bool) dataHistori[0]["berhasil"];
- bool historiTerakhirBerhasil = (bool) dataHistori[0]["berhasil"];
-
- if (historiTerakhirBerhasil) {
- status = "Matang";
+ if (historiTerakhirBerhasil) {
+ status = "Matang";
+ } else {
+ status = "Gagal";
+ }
} else {
- status = "Gagal";
+ cekKematangan();
}
- } else {
- digitalWrite(BUZZERPIN, LOW);
+
insertKondisiTapai();
- cekKematangan();
}
-
- delay(2000);
- lcd.clear();
}
}
@@ -462,6 +497,25 @@ void getDebugging() {
Serial.println("Persentase Kadar Gas : " + String(persentaseKadarGas) + " %");
Serial.println("Suhu : " + String(suhu) + " C");
Serial.println("Kelembaban : " + String(kelembaban) + " %");
+
+ int lamaJam = tickDiffSecond / 3600;
+
+ JSONVar req;
+ req["kadar_gas"] = persentaseKadarGas;
+ req["suhu"] = suhu;
+ req["kelembaban"] = kelembaban;
+ req["jam_ke"] = hourPeriod;
+
+ if (dataPengujianDebug.length() <= 0) {
+ dataPengujianDebug[0] = req;
+ hourPeriod += insertDuration;
+ }
+
+ if (lamaJam >= insertDuration) {
+ hourPeriod += insertDuration;
+
+ dataPengujianDebug[dataPengujianDebug.length()] = req;
+ }
}
// mendapatkana nilai rata-rata kadar gas dari 100 data sampel yang diambil
@@ -590,7 +644,6 @@ void insertKondisiTapai() {
}
int getLamaJamFermentasi() {
- JSONVar dataPengujianAwal = dataPengujian[0];
int epochTimeAwal = (int) dataPengujianAwal["created_time"];
int epochTimeSekarang = timeClient.getEpochTime();
@@ -601,20 +654,23 @@ int getLamaJamFermentasi() {
}
void insertHistory(bool berhasil = true) {
- String dataAwalJson = db.from("kondisi_tapai").select("*").order("created_time", "asc", true).limit(1).doSelect();
- String dataAkhirJson = db.from("kondisi_tapai").select("*").order("created_time", "desc", true).limit(1).doSelect();
-
- JSONVar dataAwal = JSON.parse(dataAwalJson);
- JSONVar dataAkhir = JSON.parse(dataAkhirJson);
+ JSONVar dataAwal = dataPengujian[0];
+ JSONVar dataAkhir = dataPengujian[dataPengujian.length() - 1];
JSONVar req;
req["berhasil"] = berhasil;
- req["waktu_awal"] = (int) dataAwal[0]["created_time"];
- req["waktu_akhir"] = (int) dataAkhir[0]["created_time"];
+ req["waktu_awal"] = (int) dataAwal["created_time"];
+ req["waktu_akhir"] = (int) dataAkhir["created_time"];
String json = JSON.stringify(req);
+ JSONVar sett;
+ req["buzzer_on"] = true;
+
+ String jsonSett = JSON.stringify(sett);
+
db.insert("histori_fermentasi", json, false);
+ db.from("pengaturan").eq("id", "1").doUpdate(jsonSett);
callUser(berhasil);
pengujian = true;
@@ -628,7 +684,7 @@ void cekKematangan() {
// if (lamaJam > 24) {
if (dataPengujian.length() > 0) {
- if (persentaseKadarGas >= 5.28 || lamaJam >= 72) {
+ if ((persentaseKadarGas >= 5.28 || lamaJam >= 72) && status == "Menunggu") {
status = "Matang";
pengujian = true;
insertKondisiTapai();
@@ -649,8 +705,10 @@ void cekKegagalan() {
if (lamaJam >= 18) {
// jika kadar gas tidak naik secara signifikan
// if (persentaseKadarGas > (regresiKadarGas + nilaiPertiga) || persentaseKadarGas < (regresiKadarGas - nilaiPertiga)) {
- if (persentaseKadarGas < (regresiKadarGas - nilaiPertiga)) {
+ if ((persentaseKadarGas < (regresiKadarGas - nilaiPertiga)) && status == "Menunggu") {
status = "Gagal";
+ pengujian = true;
+ insertKondisiTapai();
insertHistory(false);
}
}
@@ -661,4 +719,5 @@ void getDataPengujian() {
String json = db.from("kondisi_tapai").select("*").order("created_time", "asc", true).doSelect();
// String json = db.from("kondisi_tapai").select("*").eq("pengujian", "TRUE").order("created_time", "asc", true).doSelect();
dataPengujian = JSON.parse(json);
+ dataPengujianAwal = dataPengujian[0];
}
\ No newline at end of file
diff --git a/microcontroller/sketch_apr22a/v2.ino b/microcontroller/sketch_apr22a/v2.ino
index e69de29..bf9719a 100644
--- a/microcontroller/sketch_apr22a/v2.ino
+++ b/microcontroller/sketch_apr22a/v2.ino
@@ -0,0 +1,664 @@
+// #include
+// #include
+// #include
+// #include
+// #include
+// #include
+// #include
+// #include
+// #include
+// // #include
+// #include
+// #include
+// #include
+// #include "LittleFS.h"
+
+// #define BOARD "ESP-32"
+// #define MQPIN 34
+// #define DHTPIN 2
+// #define LAMPPIN 26
+// #define FANPIN 25
+// #define BUZZERPIN 23
+
+// #define SUPABASE_URL "https://oxmfbobxmqldgthethlz.supabase.co"
+// #define SUPABASE_ANON_KEY "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im94bWZib2J4bXFsZGd0aGV0aGx6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MDgwNjQ1NDksImV4cCI6MjAyMzY0MDU0OX0.pTDI9CsiN8wthOWhHjM1dONrRP_Hd7BcbwfKgeKGhtU"
+
+// // #define WIFI_SSID "Vivo Y21c"
+// // #define WIFI_PASS "12346789"
+
+// // #define SMTP_HOST "sandbox.smtp.mailtrap.io"
+// // #define SMTP_PORT 2525
+// // #define AUTHOR_EMAIL "16d58b0c89cba1"
+// // #define AUTHOR_PASSWORD "f077a3dc3e2f84"
+
+// LiquidCrystal_I2C lcd(0x27, 16, 2);
+// DHT dht(DHTPIN, 22);
+// Supabase db;
+// WiFiUDP ntpUDP;
+// NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600 * 7, 60000); // GMT +7
+// // SMTPSession smtp;
+// AsyncWebServer server(80);
+// DNSServer dns;
+
+// String WIFI_SSID;
+// String WIFI_PASS;
+
+// const char* ssidPath = "/ssid.txt";
+// const char* passPath = "/pass.txt";
+
+// float suhu;
+// float kelembaban;
+// float persentaseKadarGas;
+// bool pengujian = true;
+// float kadarGasVoltase;
+// String status = "Menunggu";
+// JSONVar dataPengujian;
+// JSONVar pengaturan;
+
+// const char index_html[] PROGMEM = R"rawliteral(
+//
+//
+// Fermonitor Wi-Fi Manager
+//
+//
+//
+//
+//
+//
+// )rawliteral";
+
+// // void smtpCallback(SMTP_Status status);
+
+// void initLittleFS() {
+// if (!LittleFS.begin(true)) {
+// Serial.println("An error has occurred while mounting LittleFS");
+// }
+// Serial.println("LittleFS mounted successfully");
+// }
+
+// String readFile(const char * path){
+// File file = LittleFS.open(path);
+// if(!file || file.isDirectory()){
+// return String();
+// }
+
+// String fileContent;
+// while(file.available()){
+// fileContent = file.readStringUntil('\n');
+// break;
+// }
+// return fileContent;
+// }
+
+// void writeFile(const char * path, const char * message){
+// File file = LittleFS.open(path, FILE_WRITE);
+
+// if(file.print(message)){
+// Serial.println("- file written");
+// } else {
+// Serial.println("- write failed");
+// }
+// }
+
+// void generateServer() {
+// WiFi.softAP("Fermonitor V1", NULL);
+// IPAddress IP = WiFi.softAPIP();
+
+// server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
+// request->send(200, "text/html", index_html);
+// });
+
+// server.on("/", HTTP_POST, [](AsyncWebServerRequest *request) {
+// int params = request->params();
+// for(int i = 0; i < params; i++){
+// AsyncWebParameter* p = request->getParam(i);
+// if(p->isPost()){
+// if (p->name() == "ssid") {
+// WIFI_SSID = p->value().c_str();
+// writeFile(ssidPath, WIFI_SSID.c_str());
+// }
+// if (p->name() == "pass") {
+// WIFI_PASS = p->value().c_str();
+// writeFile(passPath, WIFI_PASS.c_str());
+// }
+// }
+// }
+// request->send(200, "text/plain", "Berhasil. Pengaturan WiFi berhasil di simpan, sistem akan melakukan restart.");
+
+// delay(3000);
+// ESP.restart();
+// });
+
+// server.begin();
+// }
+
+// class CaptiveRequestHandler : public AsyncWebHandler {
+// public:
+// CaptiveRequestHandler() {}
+// virtual ~CaptiveRequestHandler() {}
+
+// bool canHandle(AsyncWebServerRequest *request){
+// //request->addInterestingHeader("ANY");
+// return true;
+// }
+
+// void handleRequest(AsyncWebServerRequest *request) {
+// request->send(200, "text/html", index_html);
+// }
+// };
+
+// void setup(){
+// status = "Menunggu";
+
+// pinMode(MQPIN, INPUT);
+// pinMode(LAMPPIN, OUTPUT);
+// pinMode(FANPIN, OUTPUT);
+// pinMode(BUZZERPIN, OUTPUT);
+
+// digitalWrite(LAMPPIN, HIGH);
+// digitalWrite(FANPIN, HIGH);
+// digitalWrite(BUZZERPIN, LOW);
+
+// Serial.begin(115200);
+
+// // inisialisasi filesystem
+// initLittleFS();
+
+// WIFI_SSID = readFile(ssidPath);
+// WIFI_PASS = readFile(passPath);
+
+// Serial.println(WIFI_SSID);
+// Serial.println(WIFI_PASS);
+
+// // inisialisasi LCD
+// lcd.init();
+// lcd.backlight();
+// lcd.clear();
+
+// // inisialisasi DHT22
+// dht.begin();
+
+// // inisialisasi WiFi
+// WiFi.begin(WIFI_SSID, WIFI_PASS);
+
+// int i = 0;
+// int duration = 20;
+
+// Serial.println("Memuat.......");
+
+// while (i < duration) {
+// int loading = i / ((float) duration) * 100;
+
+// Serial.println("Memuat: " + String(loading) + "%");
+
+// lcd.setCursor(0, 0);
+// // lcd.print("SSID : " + String(WIFI_SSID));
+// // lcd.setCursor(0, 1);
+// lcd.print("Memuat : " + String(loading) + "%");
+
+// delay(1000);
+// i += 1;
+// }
+
+// // inisialisasi web server wifi manager
+// generateServer();
+
+// if (WiFi.status() == WL_CONNECTED) {
+// // inisialisasi mail client
+// // MailClient.networkReconnect(true);
+// // smtp.debug(0);
+// // smtp.callback(smtpCallback);
+
+// // inisialisasi waktu
+// timeClient.begin();
+
+// // inisialisasi supabase
+// db.begin(SUPABASE_URL, SUPABASE_ANON_KEY);
+
+// getDataPengujian();
+
+// }
+
+// // inisialisasi dns server
+// dns.start(53, "*", WiFi.softAPIP());
+// server.addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER);
+// }
+
+// void loop(){
+// dns.processNextRequest();
+
+// if (WiFi.status() == WL_CONNECTED) {
+// getPengaturan();
+// timeClient.update();
+
+// // mengambil data status mesin
+// bool running = (bool) pengaturan[0]["running"];
+
+// if (running) {
+// runFermentasi();
+// } else {
+// digitalWrite(LAMPPIN, HIGH);
+// digitalWrite(FANPIN, HIGH);
+// digitalWrite(BUZZERPIN, LOW);
+// status = "Menunggu";
+
+// Serial.println("Mesin Siap!");
+
+// // menampilkan aku siap jika alat belum dirunning
+// lcd.clear();
+// lcd.setCursor(0, 0);
+// lcd.print("Aku siap!");
+// delay(1000);
+
+// lcd.clear();
+// lcd.setCursor(7, 0);
+// lcd.print("Aku siap!");
+// delay(1000);
+
+// lcd.clear();
+// lcd.setCursor(0, 1);
+// lcd.print("Aku siap!");
+// delay(1000);
+
+// lcd.clear();
+// lcd.setCursor(7, 1);
+// lcd.print("Aku siap!");
+// delay(1000);
+// }
+// } else {
+// Serial.println("Gagal terhubung ke " + WIFI_SSID);
+
+// lcd.clear();
+// lcd.setCursor(0, 0);
+// lcd.print("Gagal terhubung");
+// lcd.setCursor(0, 1);
+// lcd.print("ke " + WIFI_SSID + "!");
+
+// delay(1000);
+// }
+// }
+
+// void runFermentasi() {
+// // mendapatkan nilai kadar gas
+// float kadarGas = getKadarGas();
+// kadarGasVoltase = kadarGas / 4095.0 * 3.3;
+// persentaseKadarGas = getPersentaseKadarGas(kadarGasVoltase);
+
+// // menampilkan kadar gas pada LCD
+// lcd.clear();
+// lcd.setCursor(0, 0);
+// lcd.print("G : ");
+// lcd.print(persentaseKadarGas, 1);
+// lcd.print(" %");
+// lcd.setCursor(0,1);
+// lcd.print("H : ");
+// lcd.print(status);
+
+// delay(2000);
+
+// // membaca nilai suhu dan kelembaban
+// suhu = dht.readTemperature();
+// kelembaban = dht.readHumidity();
+
+// if (isnan(suhu)) {
+// suhu = 0;
+// }
+
+// if (isnan(kelembaban)) {
+// kelembaban = 0;
+// }
+
+// if (suhu != 25.5 && kelembaban != 25.5) {
+// // menampilkan suhu dan kelembaban pada LCD
+// lcd.clear();
+// lcd.setCursor(0, 0);
+// lcd.print("S : ");
+// lcd.print(suhu, 1);
+// lcd.print(" C");
+// lcd.setCursor(0, 1);
+// lcd.print("K : ");
+// lcd.print(kelembaban, 1);
+// lcd.print(" %");
+
+// bool otomatis = (bool) pengaturan[0]["auto"];
+// int suhuMin = (int) pengaturan[0]["suhu_min"];
+// int suhuMax = (int) pengaturan[0]["suhu_max"];
+
+// // pilihan user menghidupkan kontrol otomatis atau manual
+// if (otomatis) {
+// // menyalakan lampu jika suhu di bawah suhu minimal
+// if (suhu <= suhuMin) {
+// digitalWrite(LAMPPIN, LOW);
+// } else {
+// digitalWrite(LAMPPIN, HIGH);
+// }
+
+// // menyalakan kipas jika suhu di atas suhu maximal
+// if (suhu >= suhuMax) {
+// digitalWrite(FANPIN, LOW);
+// } else {
+// digitalWrite(FANPIN, HIGH);
+// }
+// } else {
+// bool lampOn = (bool) pengaturan[0]["lamp_on"];
+// bool fanOn = (bool) pengaturan[0]["fan_on"];
+
+// digitalWrite(LAMPPIN, lampOn ? LOW : HIGH);
+// digitalWrite(FANPIN, fanOn ? LOW : HIGH);
+// }
+
+// // menentukan data masuk ke pengujian atau tidak berdasarkan jarak jam
+// long unsigned epochTimeNow = timeClient.getEpochTime();
+
+// getDataPengujian();
+
+// if (dataPengujian.length() > 0) {
+// JSONVar dataPengujianTerakhir = dataPengujian[dataPengujian.length() - 1];
+// int created_time = dataPengujianTerakhir["created_time"];
+
+// int epochTimeDiff = epochTimeNow - created_time;
+// int jam = epochTimeDiff / 3600; // 1 jam = 3600 detik;
+
+// if (jam >= 1) {
+// pengujian = true;
+// } else {
+// pengujian = false;
+// }
+// } else {
+// pengujian = true;
+// }
+
+// getDebugging();
+
+// String dataHistoriJson = db.from("histori_fermentasi").select("*").order("created_at", "desc", true).limit(1).doSelect();
+// JSONVar dataHistori = JSON.parse(dataHistoriJson);
+// bool statusHistoriTerakhir = dataHistori[0]["selesai"];
+
+// if (statusHistoriTerakhir == false) {
+// digitalWrite(BUZZERPIN, HIGH);
+
+// bool historiTerakhirBerhasil = (bool) dataHistori[0]["berhasil"];
+
+// if (historiTerakhirBerhasil) {
+// status = "Matang";
+// } else {
+// status = "Gagal";
+// }
+// } else {
+// digitalWrite(BUZZERPIN, LOW);
+// insertKondisiTapai();
+// cekKematangan();
+// }
+
+// delay(2000);
+// lcd.clear();
+// }
+// }
+
+// void getDebugging() {
+// Serial.println("Voltase Kadar Gas : " + String(kadarGasVoltase));
+// Serial.println("Persentase Kadar Gas : " + String(persentaseKadarGas) + " %");
+// Serial.println("Suhu : " + String(suhu) + " C");
+// Serial.println("Kelembaban : " + String(kelembaban) + " %");
+// }
+
+// // mendapatkana nilai rata-rata kadar gas dari 100 data sampel yang diambil
+// float getKadarGas() {
+// int total = 100;
+// int valueTotal = 0;
+
+// for (int i = 0; i < total; i++) {
+// int value = analogRead(MQPIN);
+// valueTotal = valueTotal + value;
+// }
+
+// float valueAvg = valueTotal / total;
+
+// return valueAvg;
+// }
+
+// // konversi tegangan ke persen berdasarkan rumus yang telah ditentukan
+// float getPersentaseKadarGas(float voltase) {
+// float persentase = 0.0448 * voltase - 0.0058;
+// float hasil = constrain(persentase * 100, 0, 100);
+
+// // float persentase = 0.2043 * pow(voltase, 2.0) + 0.0611 * voltase - 0.0249;
+// // float hasil = constrain(persentase * 100, 0, 100);
+
+// return hasil;
+// }
+
+// void getPengaturan() {
+// String dataJson = db.from("pengaturan").select("*").limit(1).doSelect();
+// JSONVar data = JSON.parse(dataJson);
+// pengaturan = data;
+// }
+
+// void callUser(bool matang = true) {
+// String web_url = pengaturan[0]["web_url"];
+
+// String text;
+// if (matang == true) {
+// text = "Fermentasi tapai berhasil dan sudah matang. ";
+// } else {
+// text = "Fermentasi tapai gagal. ";
+// }
+
+// text = text + "Lihat selengkapnya di " + web_url + ".";
+
+// Callmebot.telegramCall(pengaturan[0]["telepon"], text, "id-ID-Standard-B");
+// Serial.println(Callmebot.debug());
+// sendEmail(text);
+// }
+
+// void sendEmail(String text) {
+// // Session_Config config;
+// // config.server.host_name = SMTP_HOST;
+// // config.server.port = SMTP_PORT;
+// // config.login.email = AUTHOR_EMAIL;
+// // config.login.password = AUTHOR_PASSWORD;
+// // config.login.user_domain = "";
+// // config.time.ntp_server = F("pool.ntp.org,time.nist.gov");
+// // config.time.gmt_offset = 7;
+// // config.time.day_light_offset = 0;
+
+// // SMTP_Message message;
+// // String emailRecipient = pengaturan[0]["email"];
+// // message.sender.name = F("Fermonitor");
+// // message.sender.email = "fermonitor@official.com";
+// // message.subject = "Status Fermentasi Tapai";
+// // message.addRecipient(emailRecipient, emailRecipient);
+
+// // message.text.content = text.c_str();
+// // message.text.charSet = "us-ascii";
+// // message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
+
+// // message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_low;
+// // message.response.notify = esp_mail_smtp_notify_success | esp_mail_smtp_notify_failure | esp_mail_smtp_notify_delay;
+
+// // if (!smtp.connect(&config)){
+// // ESP_MAIL_PRINTF("Connection error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());
+// // return;
+// // }
+
+// // if (!smtp.isLoggedIn()){
+// // Serial.println("Gagal login akun email");
+// // }
+
+// // else{
+// // if (smtp.isAuthenticated()) {
+// // Serial.println("Berhasil login email");
+// // } else {
+// // Serial.println("Terhubung ke email tanpa otorisasi");
+// // }
+// // }
+
+
+// // if (!MailClient.sendMail(&smtp, &message)) {
+// // ESP_MAIL_PRINTF("Error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());
+// // }
+// }
+
+// // void smtpCallback(SMTP_Status status){
+// // // hapus memory email jika berhasil terkirim
+// // if (status.success()){
+// // smtp.sendingResult.clear();
+// // }
+// // }
+
+// // menyimpan kondisi tapai pada database
+// void insertKondisiTapai() {
+// JSONVar req;
+
+// req["suhu"] = (float) suhu;
+// req["kelembaban"] = (float) kelembaban;
+// req["kadar_gas"] = (float) persentaseKadarGas;
+// // req["pengujian"] = (bool) pengujian;
+// req["created_time"] = (int) timeClient.getEpochTime();
+
+// String json = JSON.stringify(req);
+// db.from("realtime_data").eq("id", "1").doUpdate(json);
+// // db.insert("kondisi_tapai", json, false);
+
+// if (pengujian == true) {
+// db.insert("kondisi_tapai", json, false);
+// getDataPengujian();
+// cekKegagalan();
+// }
+// }
+
+// int getLamaJamFermentasi() {
+// JSONVar dataPengujianAwal = dataPengujian[0];
+// int epochTimeAwal = (int) dataPengujianAwal["created_time"];
+// int epochTimeSekarang = timeClient.getEpochTime();
+
+// int epochTimeDiff = epochTimeSekarang - epochTimeAwal;
+// int lamaJam = epochTimeDiff / 3600;
+
+// return lamaJam;
+// }
+
+// void insertHistory(bool berhasil = true) {
+// String dataAwalJson = db.from("kondisi_tapai").select("*").order("created_time", "asc", true).limit(1).doSelect();
+// String dataAkhirJson = db.from("kondisi_tapai").select("*").order("created_time", "desc", true).limit(1).doSelect();
+
+// JSONVar dataAwal = JSON.parse(dataAwalJson);
+// JSONVar dataAkhir = JSON.parse(dataAkhirJson);
+
+// JSONVar req;
+// req["berhasil"] = berhasil;
+// req["waktu_awal"] = (int) dataAwal[0]["created_time"];
+// req["waktu_akhir"] = (int) dataAkhir[0]["created_time"];
+
+// String json = JSON.stringify(req);
+
+// db.insert("histori_fermentasi", json, false);
+// callUser(berhasil);
+
+// pengujian = true;
+// }
+
+// // melakukan cek kematangan
+// void cekKematangan() {
+// int lamaJam = getLamaJamFermentasi();
+
+// // jika sudah lebih dari 24 jam
+// // if (lamaJam > 24) {
+
+// if (dataPengujian.length() > 0) {
+// if (persentaseKadarGas >= 5.28 || lamaJam >= 72) {
+// status = "Matang";
+// pengujian = true;
+// insertKondisiTapai();
+// insertHistory(true);
+// }
+// }
+// }
+
+// // mengecek kegagalan
+// void cekKegagalan() {
+// int lamaJam = getLamaJamFermentasi();
+
+// // = -0,000006 * (x * x) + (0,0013 * x) + 0,002;
+// float regresiKadarGas = -0.000006 * pow(lamaJam, 2.0) + 0.0013 * lamaJam + 0.002;
+// regresiKadarGas = regresiKadarGas * 100;
+// float nilaiPertiga = regresiKadarGas / 3.0;
+
+// if (lamaJam >= 18) {
+// // jika kadar gas tidak naik secara signifikan
+// // if (persentaseKadarGas > (regresiKadarGas + nilaiPertiga) || persentaseKadarGas < (regresiKadarGas - nilaiPertiga)) {
+// if (persentaseKadarGas < (regresiKadarGas - nilaiPertiga)) {
+// status = "Gagal";
+// insertHistory(false);
+// }
+// }
+// }
+
+// // mengambil data pengujian
+// void getDataPengujian() {
+// String json = db.from("kondisi_tapai").select("*").order("created_time", "asc", true).doSelect();
+// // String json = db.from("kondisi_tapai").select("*").eq("pengujian", "TRUE").order("created_time", "asc", true).doSelect();
+// dataPengujian = JSON.parse(json);
+// }
\ No newline at end of file