#include <LiquidCrystal_I2C.h>
#include <TM1637Display.h>
#include <Wire.h>
#include "RTClib.h"
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
#define LED_PIN 13
#define PIN_TRIG 2
#define PIN_ECHO 3
#define TRIGGER_DISTANCE 100 // dalam cm
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
RTC_DS1307 rtc;
TM1637Display display(4, 5); // CLK, DIO
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
lcd.init();
lcd.backlight();
display.setBrightness(0x0f);
Serial.begin(9600);
Wire.begin();
// Set RTC time jika tidak berjalan
if (!rtc.begin()) {
Serial.println("RTC tidak ditemukan!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC tidak berjalan, setting waktu...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Tampilkan nama dan NIM selama 3 detik
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selamat!");
lcd.setCursor(0, 1);
lcd.print("Nama: [Nama]");
delay(3000);
}
void loop() {
// Baca jarak dari sensor ultrasonik
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long duration = pulseIn(PIN_ECHO, HIGH);
int distance = duration * 0.034 / 2;
// Tampilkan jarak pada 7 segmen
display.showNumberDecEx(distance, 0b01000000, true); // Tampilkan hanya angka
delay(1000);
// Baca waktu dari RTC
DateTime now = rtc.now();
// Tampilkan waktu pada LCD baris 0
lcd.setCursor(0, 0);
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
// Tampilkan kondisi LED pada LCD baris 1
if (distance > TRIGGER_DISTANCE || now.second() < 15) {
lcd.setCursor(0, 1);
lcd.print("LED: NYALA");
digitalWrite(LED_PIN, HIGH);
} else {
lcd.setCursor(0, 1);
lcd.print("LED: MATI ");
digitalWrite(LED_PIN, LOW);
}
delay(1000);
}