// Ultrasonic Distance Sensor Arduino Uno
// Code oleh Bhagaskara Rafael XI-10!
// Dilarang keras mencuri code ini! 😡
// library
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// bikin lcd object
LiquidCrystal_I2C lcd(0x27, 16, 2);
// pin-pin
const int TRIG = 7;
const int ECHO = 8;
const int BUZZER = 10;
const int LED[] = {2,3,4,5,6,9}; // merah,ijo,biru,kuning,oren,ungu
// nada lagu mario (frekuensi, durasi)
const int MARIO_MELODY[][2] = {
{2637,125},{2637,125},{0,125},{2637,125},{0,167},{2093,125},{2637,125},
{0,125},{3136,125},{0,375},{1568,125},{0,375},{2093,125},{0,250},{1568,125},
{0,250},{2093,125},{0,125},{3136,125},{0,125},{2637,125},{0,125},{2093,125},
{0,125},{2637,125},{0,125},{3136,125},{0,375},{1568,125},{0,375},{2093,125},
};
// karakter LCD kustom
byte CHAR_SMILE[8] = {
0b00000, 0b00000, 0b01010, 0b00000, 0b10001, 0b01110, 0b00000, 0b00000
};
byte CHAR_ALERT[8] = {
0b00100, 0b01110, 0b01110, 0b01110, 0b01110, 0b00000, 0b00100, 0b00000
};
byte CHAR_SKULL[8] = {
0b00000, 0b01110, 0b10101, 0b11011, 0b01110, 0b01110, 0b00000, 0b00000
};
byte CHAR_HEART[8] = {
0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000
};
byte BAR_1[8] = {
0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000
};
byte BAR_2[8] = {
0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000, 0b11000
};
byte BAR_3[8] = {
0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100
};
byte BAR_FULL[8] = {
0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111
};
// variabel global
long durasi;
int jarak;
bool efekMenyala = false;
// mainkan nada dengan variasi
void mainkanNada(int frek1, int frek2, int durasi) {
int waktuPerNada = durasi / 4;
tone(BUZZER, frek1, waktuPerNada);
delay(waktuPerNada);
tone(BUZZER, frek2, waktuPerNada);
delay(waktuPerNada);
tone(BUZZER, frek1, waktuPerNada);
delay(waktuPerNada);
tone(BUZZER, frek2, waktuPerNada);
delay(waktuPerNada);
}
// efek LED yang
void ledMadness() {
// nyalain LED random
for(int i=0; i<6; i++) {
digitalWrite(LED[random(6)], HIGH);
}
delay(50);
// matiin semua
for(int i=0; i<6; i++) {
digitalWrite(LED[i], LOW);
}
delay(50);
}
// mainkan lagu mario
void mainkanMario() {
for(int nada = 0; nada < sizeof(MARIO_MELODY)/sizeof(MARIO_MELODY[0]); nada++) {
if(MARIO_MELODY[nada][0] == 0) {
delay(MARIO_MELODY[nada][1]);
} else {
tone(BUZZER, MARIO_MELODY[nada][0], MARIO_MELODY[nada][1]);
delay(MARIO_MELODY[nada][1]);
}
// efek LED selama lagu
digitalWrite(LED[random(6)], HIGH);
delay(10);
digitalWrite(LED[random(6)], LOW);
}
}
// animasi startup
void startupGila() {
// pembukaan
for(int i=0; i<3; i++) {
// flash semua LED
for(int j=0; j<6; j++) digitalWrite(LED[j], HIGH);
tone(BUZZER, 2000, 100);
delay(100);
for(int j=0; j<6; j++) digitalWrite(LED[j], LOW);
tone(BUZZER, 1000, 100);
delay(100);
}
// animasi LCD
const char* teksGila[] = {
"ULTRASONIC", "DIST SENSOR", "MADE WITH <3", "BY BHAGAS XI-10!"
};
// tampilkan teks dengan efek
for(byte i=0; i<4; i++) {
lcd.clear();
lcd.setCursor(0,0);
// animasi karakter spesial
for(int j=0; j<16; j++) {
lcd.write(random(4)); // tampilkan random karakter kustom
mainkanNada(1000 + random(1000), 2000 + random(1000), 100);
ledMadness();
}
// tampilkan teks
lcd.clear();
lcd.setCursor(0,0);
lcd.print(teksGila[i]);
for(int j=0; j<16; j++) {
lcd.setCursor(j,1);
lcd.write(byte(random(4)));
tone(BUZZER, 1000 + (j*100), 50);
ledMadness();
}
delay(300);
}
// loading bar
lcd.clear();
lcd.print("SYSTEM LOADING!");
lcd.setCursor(0,1);
for(int i=0; i<16; i++) {
// animasi loading dengan 4 karakter bar
for(byte j=0; j<4; j++) {
lcd.setCursor(i,1);
lcd.write(j+4); // gunakan karakter bar (4-7)
tone(BUZZER, 2000 + (j*200), 30);
ledMadness();
delay(30);
}
}
delay(500);
lcd.clear();
// mainkan lagu mario
lcd.print("* ??? *");
mainkanMario();
// ready to rock!
lcd.clear();
lcd.print("READY TO ROCK!");
lcd.setCursor(0,1);
lcd.print("================");
// efek LED final
for(int i=0; i<6; i++) {
for(int j=0; j<6; j++) {
digitalWrite(LED[j], HIGH);
tone(BUZZER, 1000 + (j*200), 50);
delay(50);
digitalWrite(LED[j], LOW);
}
}
lcd.clear();
}
// update progress bar yang
void updateBar(int jarak) {
lcd.setCursor(0,1);
int bars = map(jarak, 0, 400, 0, 16);
for(int i=0; i<16; i++) {
if(i < bars) {
// animasi bar yang berubah-ubah
if(efekMenyala) {
lcd.write(byte(4 + (i % 4))); // gunakan 4 tipe bar berbeda
} else {
lcd.write(byte(7)); // bar penuh
}
} else {
lcd.print(" ");
}
}
efekMenyala = !efekMenyala; // toggle efek
}
// update LED & sound GILA
void updateOutput(int jarak) {
// matiin semua LED
for(int i=0; i<6; i++) digitalWrite(LED[i], LOW);
// set LED & sound berdasarkan jarak
if(jarak <= 50) {
digitalWrite(LED[0], HIGH); // merah
mainkanNada(2000, 2500, 100);
}
else if(jarak <= 100) {
digitalWrite(LED[1], HIGH); // ijo
mainkanNada(1800, 2300, 100);
}
else if(jarak <= 200) {
digitalWrite(LED[2], HIGH); // biru
mainkanNada(1600, 2100, 100);
}
else if(jarak <= 300) {
digitalWrite(LED[3], HIGH); // kuning
mainkanNada(1400, 1900, 100);
}
else if(jarak <= 350) {
digitalWrite(LED[4], HIGH); // oren
mainkanNada(1200, 1700, 100);
}
else {
digitalWrite(LED[5], HIGH); // ungu
mainkanNada(1000, 1500, 100);
}
}
void setup() {
// mulai serial
Serial.begin(9600);
// banner serial mantap
Serial.println("╔═══════════════════════════════════════════╗");
Serial.println("║ ULTRASONIC DISTANCE SENSOR ║");
Serial.println("║ Created with <3 by Bhagaskara Rafael ║");
Serial.println("║-------------------------------------------║");
Serial.println("║ 🟥 0-50cm | 🟨 201-300cm ║");
Serial.println("║ 🟩 51-100cm | 🟧 301-350cm ║");
Serial.println("║ 🟦 101-200cm| 🟪 >350cm ║");
Serial.println("╚═══════════════════════════════════════════╝");
// setup pin
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUZZER, OUTPUT);
for(int i=0; i<6; i++) pinMode(LED[i], OUTPUT);
// setup LCD
lcd.init();
lcd.backlight();
// bikin karakter custom
lcd.createChar(0, CHAR_SMILE);
lcd.createChar(1, CHAR_ALERT);
lcd.createChar(2, CHAR_SKULL);
lcd.createChar(3, CHAR_HEART);
lcd.createChar(4, BAR_1);
lcd.createChar(5, BAR_2);
lcd.createChar(6, BAR_3);
lcd.createChar(7, BAR_FULL);
// jalanin startup
startupGila();
}
void loop() {
// baca sensor
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
durasi = pulseIn(ECHO, HIGH);
jarak = durasi * 0.034 / 2;
// update LCD
lcd.setCursor(0,0);
// tambah karakter custom buat indikator
if(jarak <= 50) {
lcd.write(byte(2)); // skull
} else if(jarak > 350) {
lcd.write(byte(0)); // smile
} else {
lcd.write(byte(1)); // alert
}
lcd.print(" Jarak:");
lcd.print(jarak);
lcd.print("cm ");
lcd.write(byte(3)); // heart
// update progress bar
updateBar(jarak);
// update output
updateOutput(jarak);
// update serial dengan style
Serial.print("║ 📏 Jarak Terdeteksi: ");
Serial.print(jarak);
Serial.println(" cm ║");
delay(100);
}