//ESP32 LIBRARY
// #include <WiFi.h> // untuk mengaktifkan wifi pada ESP32, agar memungkinka perangkat terhubung kejaringan wifi untuk saling berkomunikasi
//FIREBASE LIBRARY
// #include <FirebaseESP32.h> //Dengan menggunakan FirebaseESP32, ESP32 dapat terhubung ke layanan Firebase, platform pengembangan aplikasi mobile dan web dari Google
// #include <HTTPClient.h> // memungkinkan ESP32 untuk membuat permintaan HTTP, misalnya untuk mengirimkan atau menerima data dari server
//DS18B20 LIBRARY
#include <OneWire.h>
#include <DallasTemperature.h>
//HC711 LIBRARY
#include "HX711.h"
//LCD LIBRARY
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//RFID LIBRARY
#include <SPI.h>
#include <MFRC522.h>
//Ultrasonic
#define TRIG_PIN 12 // Pin untuk TRIG
#define ECHO_PIN 14 // Pin untuk ECHO
//RFID
#define SS_PIN 5
#define RST_PIN 2
MFRC522 rfid(SS_PIN, RST_PIN);
String rfidData = "";
//LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
//HX711
HX711 scale;
uint8_t dataPin = 16;
uint8_t clockPin = 4;
//DS18B20
#define ONE_WIRE_BUS 17
// Inisialisasi objek OneWire
OneWire oneWire(ONE_WIRE_BUS);
// Inisialisasi objek DallasTemperature
DallasTemperature sensors(&oneWire);
//FIREBASE
// //Ini mendefinisikan sebuah konstanta makro dengan nama FIREBASE_HOST, yang nilainya adalah URL host untuk Firebase Realtime Database. Host ini menunjukkan di mana basis data Firebase berada
// #define DATABASE_URL "bmiapps-e0d35-default-rtdb.firebaseio.com"
// //Ini mendefinisikan konstanta makro dengan nama FIREBASE_AUTH, yang nilainya adalah token otentikasi (authentication token) untuk mengakses firebase
// #define DATABASE_SECRET "tFCxSzaBV9I9pi1c0mjaMHV7SMZe7DUPR5erlHUX"
// FirebaseData fbdo; //Ini mendeklarasikan objek dari kelas FirebaseData dengan nama fbdo. Kelas FirebaseData adalah bagian dari pustaka FirebaseESP32 yang digunakan untuk berkomunikasi dengan layanan Firebase pada platform ESP32
// /*Define the FirebaseAuth data for authentication data */
// FirebaseAuth auth;
// /* Define the FirebaseConfig data for config data */
// FirebaseConfig config;
//WIFI
// const char* ssid = "cuk"; //nama jaringan wifi SSID yang akan dihubungkan dan digunakan
// const char* password = "1234567890"; //kata sandi untuk mengakses jaringan WiFi yang memiliki SSID "Wokwi-GUEST."
// void wifiConnection() { //Memulai proses koneksi WiFi dengan menggunakan nama jaringan (SSID) dan kata sandi yang sudah ditentukan
// WiFi.begin(ssid, password); // Memulai proses koneksi WiFi dengan menggunakan nama jaringan (SSID) dan kata sandi (password) yang telah ditentukan
// while (WiFi.status() != WL_CONNECTED) { //Sebuah loop while yang akan dijalankan selama perangkat belum terhubung ke jaringan WiFi, memberikan kesempatan sampai koneksi berhasil
// Serial.print("."); //untuk mengirim data ke Serial Monitor
// delay(500); // perangkat menunggu selama 500 milidetik (setengah detik) sebelum melanjutkan eksekusi kode berikutnya
// }
// Serial.println("Wifi Connected"); //Mencetak pesan bahwa perangkat telah terhubung ke WiFi
// Serial.println(WiFi.SSID()); //Mencetak SSID jaringan WiFi yang terhubung
// Serial.println(WiFi.RSSI()); //Mencetak kekuatan sinyal (RSSI) WiFi
// Serial.println(WiFi.macAddress()); //Mencetak alamat MAC perangkat WiFi
// Serial.println(WiFi.localIP()); //Mencetak alamat IP lokal perangkat
// Serial.println(WiFi.gatewayIP()); //Mencetak alamat IP gateway WiFi
// Serial.println(WiFi.dnsIP()); //Mencetak alamat IP server DNS yang digunakan
// }
#define button1 25
#define button2 26
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); // Inisialisasi Serial Monitor
//Button
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
//INISIALISASI WIFI
// wifiConnection();
//INISIALISASI LCD
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Menghidupkan lampu latar
//INISIALISASI ULTRASONIC
pinMode(TRIG_PIN, OUTPUT); // Set TRIG_PIN sebagai OUTPUT
pinMode(ECHO_PIN, INPUT); // Set ECHO_PIN sebagai INPUT
//INISIALISASI RFID
SPI.begin(); // Inisialisasi SPI
rfid.PCD_Init(); // Inisialisasi MFRC522
//INISIALISASI DS18B20
sensors.begin(); // Inisialisasi sensor DS18B20
//INISIALISASI HX711
scale.begin(dataPin, clockPin);
scale.set_scale(0.42);
scale.tare(10);
//SPLASH SCREEN
lcd.setCursor(0, 0); // Set posisi kursor ke kolom 0, baris 0
lcd.print("BMI COY"); // Tulis pesan di baris 0
delay(1000);
lcd.clear();
}
void loop() {
// put your main code here, to run repeatedly:
// ultrasonicRead();
// rfidRead();
// Memeriksa apakah ada kartu yang terdeteksi
if (digitalRead(button1) == false) {
scale.tare(1000);
}
loadcell();
if (Serial.available()) {
String input = Serial.readStringUntil('\n');
input.trim(); // Remove any leading or trailing whitespace
if (isValidFormat(input)) {
// Check if the entered ID matches the expected ID
if (input.equals("12 34 56 78")) { // Replace with your registered e-KTP ID
accessGranted(input);
} else {
accessDenied();
}
} else {
Serial.println("Invalid format. Enter e-KTP ID (format: XX XX XX XX):");
}
}
// if (rfidData == "") {
// //no action
// } else {
// lcd.clear();
// lcd.setCursor(0, 0); // Set posisi kursor ke kolom 0, baris 0
// lcd.print("Id Kamu :"); // Tulis pesan di baris 0
// lcd.setCursor(0, 1); // Set posisi kursor ke kolom 0, baris 1
// lcd.print(rfidData); // Tulis pesan di baris 0
// Serial.print(rfidData);
// //data input sensor
// int height = ultrasonicRead();
// int weight = loadcell();
// int temperature = ds18b20Read();
// //firebase formatting data
// // FirebaseJson json;
// // json.set("height/", height);
// // json.set("weight/", weight);
// // json.set("temp/", temperature);
// // Firebase.updateNode(fbdo, "bmiapps/users/" + String(rfidData), json);
// }
}
int ds18b20Read() {
sensors.requestTemperatures(); // Meminta pembacaan suhu
float temperatureC = sensors.getTempCByIndex(0); // Membaca suhu dalam Celsius
int temperatureCint = temperatureC;
if (temperatureC != DEVICE_DISCONNECTED_C) {
Serial.print("Suhu: ");
Serial.print(temperatureC);
Serial.println(" °C");
return temperatureCint;
} else {
Serial.println("Sensor tidak terhubung!");
return 0;
}
}
int loadcell() {
if (scale.is_ready()) {
Serial.print("Unit: ");
Serial.print(scale.get_units(1) / 1000);
Serial.println("kilogram");
int unitkg = scale.get_units(1) / 1000;
Serial.print("Value: ");
Serial.println(scale.get_value(1));
return unitkg;
} else {
return 0;
}
}
int ultrasonicRead() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// Mengirimkan pulsa 10 mikrodetik
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Menghitung durasi dari ECHO_PIN
long duration = pulseIn(ECHO_PIN, HIGH);
// Menghitung jarak (dalam cm)
// Kecepatan suara = 343 m/s = 0.0343 cm/us
float distance = (duration * 0.0343) / 2;
int distanceint = distance;
// Menampilkan jarak ke Serial Monitor
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
// Delay sebelum pengukuran berikutnya
// delay(1000);
return distanceint;
}
bool isValidFormat(String input) {
// Check if the input matches the format "XX XX XX XX"
if (input.length() == 11 && input.charAt(2) == ' ' && input.charAt(5) == ' ' && input.charAt(8) == ' ') {
for (int i = 0; i < input.length(); i++) {
if (i != 2 && i != 5 && i != 8) {
if (!isDigit(input.charAt(i))) {
return false;
}
}
}
return true;
}
return false;
}
void accessGranted(String input) {
lcd.clear();
lcd.setCursor(0, 0); // Set posisi kursor ke kolom 0, baris 0
lcd.print("Id Kamu :"); // Tulis pesan di baris 0
lcd.setCursor(0, 1); // Set posisi kursor ke kolom 0, baris 1
lcd.print(input); // Tulis pesan di baris 0
Serial.print(input);
//data input sensor
int height = ultrasonicRead();
int weight = loadcell();
int temperature = ds18b20Read();
// Serial.println("Access granted!");
// digitalWrite(BUZZER_PIN, HIGH);
// digitalWrite(GREEN_LED, HIGH);
// digitalWrite(RELAY_PIN, HIGH);
// delay(5000); // Buzzer and LED on for 5 seconds
// digitalWrite(BUZZER_PIN, LOW);
// digitalWrite(GREEN_LED, LOW);
// digitalWrite(RELAY_PIN, LOW);
}
void accessDenied() {
// Serial.println("Access denied!");
// digitalWrite(BUZZER_PIN, HIGH);
// digitalWrite(RED_LED, HIGH);
// delay(5000); // Buzzer and LED on for 5 seconds
// digitalWrite(BUZZER_PIN, LOW);
// digitalWrite(RED_LED, LOW);
}