#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino.h>
#include <HX711.h> // Library untuk membaca load cell
const char* ssid = "Wokwi-GUEST"; // Ganti dengan SSID WiFi yang ingin dihubungkan
const char* password = "";
const char* serverName = "http://192.168.1.3/monitoring_sleep/insert.php";
// Deklarasi pin untuk setiap sensor dan buzzer
#define TRIG_PIN 33 // Pin Trig untuk ultrasonic sensor
#define ECHO_PIN 25 // Pin Echo untuk ultrasonic sensor
#define LDR_PIN 34 // Pin untuk LDR sensor (analog)
#define BUZZER_PIN 12 // Pin untuk buzzer
#define HX711_DT 2 // Pin data HX711
#define HX711_SCK 4 // Pin clock HX711
// Ambang batas untuk kondisi tidur
#define ULTRASONIC_THRESHOLD 100 // Jarak maksimum dalam cm (contoh: <100 cm dianggap tidur)
#define LDR_THRESHOLD 300 // Nilai maksimum cahaya (contoh: <300 berarti gelap)
#define WEIGHT_THRESHOLD 5000 // Berat minimum (gram) untuk mendeteksi keberadaan mahasiswa
// Waktu alarm
#define SLEEP_REMINDER_INTERVAL 10 // Pengingat tidur dalam detik (contoh: setelah 10 detik)
#define WAKEUP_ALARM_INTERVAL 30 // Alarm bangun tidur dalam detik (contoh: setelah 30 detik tidur)
#define REPEATED_ALARM_INTERVAL 5000 // Alarm ulang setiap 5 detik
// Variabel waktu
unsigned long sleepStartTime = 0;
unsigned long lastReminderTime = 0;
unsigned long repeatedAlarmStartTime = 0;
unsigned long repeatedAlarmLastTime = 0;
bool isSleeping = false;
bool isRepeatedAlarmActive = false;
// Objek HX711 untuk load cell
HX711 scale;
void setup() {
Serial.begin(115200);
// Memulai koneksi Wi-Fi
WiFi.begin(ssid, password);
// Tunggu hingga terhubung
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
// Jika terhubung
Serial.println("");
Serial.println("Wi-Fi terhubung!");
Serial.println("Alamat IP: ");
Serial.println(WiFi.localIP());
// Inisialisasi pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Inisialisasi HX711
scale.begin(HX711_DT, HX711_SCK);
// Kalibrasi load cell (pastikan load cell dalam keadaan kosong saat pertama kali dinyalakan)
Serial.println("Tunggu... Kalibrasi load cell");
scale.set_scale(); // Set scale tanpa kalibrasi
scale.tare(); // Menghapus nilai awal (tare)
Serial.println("Kalibrasi selesai!");
Serial.println("Memulai deteksi status mahasiswa...");
}
void loop() {
// Membaca data dari sensor
long distance = getUltrasonicDistance(); // Ultrasonic sensor
int ldrValue = analogRead(LDR_PIN); // LDR sensor
float weight = scale.get_units(5) * 10; // Load cell (gram)
// Tampilkan nilai sensor di Serial Monitor
Serial.print("Ultrasonic Distance (cm): ");
Serial.println(distance);
Serial.print("LDR Sensor (Cahaya): ");
Serial.println(ldrValue);
Serial.print("Load Cell Weight (gram): ");
Serial.println(weight);
// Logika deteksi mahasiswa tidur
if (distance < ULTRASONIC_THRESHOLD && ldrValue > LDR_THRESHOLD && weight > WEIGHT_THRESHOLD) {
if (!isSleeping) {
isSleeping = true;
sleepStartTime = millis(); // Catat waktu mulai tidur
Serial.println("Status: Mahasiswa Mulai Tidur");
send(distance, ldrValue, 0, weight);
}
} else {
if (isSleeping) {
isSleeping = false;
unsigned long sleepDuration = (millis() - sleepStartTime) / 1000; // Hitung durasi tidur (detik)
Serial.print("Status: Mahasiswa Bangun. Durasi Tidur: ");
Serial.print(sleepDuration);
Serial.println(" detik");
sendSleepDuration(sleepDuration);
}
// Alarm pengingat tidur jika tidak memenuhi kondisi tidur
if (millis() - lastReminderTime > SLEEP_REMINDER_INTERVAL * 1000) {
lastReminderTime = millis();
Serial.println("Pengingat: Anda Belum Tidur! Harap istirahat.");
beepBuzzer(2); // Pengingat tidur dengan 2 beep
}
}
// Alarm bangun tidur jika durasi tidur mencapai batas
if (isSleeping) {
unsigned long sleepDuration = (millis() - sleepStartTime) / 1000;
if (sleepDuration >= WAKEUP_ALARM_INTERVAL) {
if (!isRepeatedAlarmActive) {
isRepeatedAlarmActive = true;
repeatedAlarmStartTime = millis();
Serial.println("Alarm: Waktunya Bangun!");
Serial.print(sleepDuration);
Serial.println(" detik");
beepBuzzer(5);
sendSleepDuration(sleepDuration);
} else if (millis() - repeatedAlarmLastTime >= REPEATED_ALARM_INTERVAL) {
// Alarm lanjutan setiap 5 detik
Serial.println("Alarm ulang: Mahasiswa masih tidur!");
beepBuzzer(4);
repeatedAlarmLastTime = millis(); // Reset waktu untuk alarm berikutnya
}
}
}
delay(3000); // Loop setiap 5 detik
}
// Fungsi untuk mendapatkan jarak dari ultrasonic sensor
long getUltrasonicDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
long distance = duration * 0.034 / 2; // Konversi ke cm
return distance;
}
// Fungsi untuk membunyikan beep pada buzzer
void beepBuzzer(int times) {
for (int i = 0; i < times; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(200); // Durasi beep
digitalWrite(BUZZER_PIN, LOW);
delay(200); // Interval antar beep
}
}
void send(int distance, int light, int noise, float weight) {
HTTPClient http;
String url = String(serverName) + "?distance=" + String(distance) + "&light=" + String(light) + "&noise=" + String(noise) + "&weight=" + String(weight);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Server Response:");
Serial.println(response);
} else {
Serial.print("Error in sending GET request: ");
Serial.println(httpResponseCode);
}
http.end();
}
void sendSleepDuration(unsigned long duration) {
HTTPClient http;
String url = String(serverName) + "?sleepDuration=" + String(duration);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Server Response:");
Serial.println(response);
} else {
Serial.print("Error in sending GET request: ");
Serial.println(httpResponseCode);
}
http.end();
}