#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MPU6050_light.h>
#include "RTClib.h"
// Inisialisasi objek RTC dan OLED
RTC_DS1307 rtc;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Inisialisasi MPU6050
MPU6050 mpu(Wire);
float accThreshold = 1.5; // Threshold getaran untuk deteksi gempa
// Variabel untuk waktu
int jam, menit, detik, hari, tanggal, bulan, tahun;
char temp[33];
char nama_hari[7][7] = {"Mingg", "Senin", "Sel", "Rabu", "Kamis", "Jumat", "Sabtu"};
// Pin buzzer
#define BUZZER_PIN 25
// Pin untuk sensor ultrasonik
#define TRIG_PIN 26
#define ECHO_PIN 27
// Threshold ketinggian air dalam cm untuk deteksi banjir
float floodThreshold = 20.0; // Sesuaikan dengan kebutuhan
void setup() {
Serial.begin(9600);
// Inisialisasi OLED
Wire.begin(21, 22); // Pin SDA ke D21 dan SCL ke D22 untuk OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Ganti alamat I2C jika perlu
Serial.println(F("SSD1306 allocation failed"));
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Menampilkan teks awal di OLED
display.setCursor(4, 0);
display.print("MOREN");
display.setCursor(2, 10);
display.print("ELEKTRONIKA");
display.display();
delay(2000);
display.clearDisplay();
// Inisialisasi RTC
Wire.begin(32, 33); // Pin SDA ke D32 dan SCL ke D33 untuk RTC
rtc.begin();
// Inisialisasi MPU6050
mpu.begin(); // Inisialisasi MPU6050
mpu.calcGyroOffsets(); // Menghitung offset gyro
pinMode(BUZZER_PIN, OUTPUT); // Set pin buzzer sebagai output
// Inisialisasi sensor ultrasonik
pinMode(TRIG_PIN, OUTPUT); // Set pin trig sebagai output
pinMode(ECHO_PIN, INPUT); // Set pin echo sebagai input
Serial.println("Program siap");
}
void loop() {
DateTime now = rtc.now();
Serial.print(now.hour());
Serial.print(':');
Serial.print(now.minute());
Serial.print(':');
Serial.println(now.second());
delay(1000);
// Mengupdate data dari MPU6050
mpu.update();
// Mengambil akselerasi dalam g
float accX = mpu.getAccX();
float accY = mpu.getAccY();
float accZ = mpu.getAccZ();
// Menghitung total akselerasi
float totalAcceleration = sqrt(accX * accX + accY * accY + accZ * accZ);
// Mengukur jarak dengan sensor ultrasonik
long duration;
float distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
// Menampilkan waktu di OLED
display.clearDisplay(); // Bersihkan layar sebelum menampilkan informasi baru
display.setTextSize(1); // Ukuran teks
display.setTextColor(SSD1306_WHITE);
sprintf(temp, "jam %02d:%02d:%02d WIB", jam, menit, detik);
display.setCursor(0, 0);
display.print(temp);
Serial.println(temp);
sprintf(temp, "%s, %02d-%02d-%d", nama_hari[hari], tanggal, bulan, tahun);
display.setCursor(0, 20); // Mengatur posisi untuk tanggal
display.print(temp);
Serial.println(temp);
// Deteksi gempa jika total akselerasi lebih besar dari threshold
if (totalAcceleration > accThreshold) {
digitalWrite(BUZZER_PIN, HIGH); // Menghidupkan buzzer
display.setCursor(0, 40); // Mengatur posisi untuk pesan gempa
display.println(F("TERJADI GEMPA!"));
display.display(); // Tampilkan semua perubahan di OLED
delay(5000); // Tampilkan pesan selama 5 detik
digitalWrite(BUZZER_PIN, LOW); // Mematikan buzzer
}
// Deteksi banjir jika jarak lebih kecil dari threshold
if (distance < floodThreshold) {
digitalWrite(BUZZER_PIN, HIGH); // Menghidupkan buzzer
display.setCursor(0, 50); // Mengatur posisi untuk pesan banjir
display.println(F("BANJIR TERDETEKSI!"));
display.display(); // Tampilkan semua perubahan di OLED
delay(5000); // Tampilkan pesan selama 1 detik
digitalWrite(BUZZER_PIN, LOW); // Mematikan buzzer
}
display.display(); // Tampilkan semua perubahan di OLED
delay(5000); // Tunggu 1 detik sebelum memperbarui tampilan
}