#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Konfigurasi OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Konfigurasi Ultrasonik
#define TRIG_PIN 9
#define ECHO_PIN 10
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(9600);
// Inisialisasi OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
// Inisialisasi Ultrasonik
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
float distance = bacaJarak();
if (distance < 10) {
mataBerkedip();
delay(300);
ekspresiMarah();
} else if (distance >= 10 && distance < 20) {
mataBerkedip();
delay(300);
ekspresiDatar();
} else if (distance >= 20 && distance < 40) {
mataBerkedip();
delay(300);
ekspresiSenang();
} else {
mataBerkedip();
delay(300);
ekspresiSedih();
}
delay(1500);
}
float bacaJarak() {
// Kirim sinyal trigger
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Hitung durasi pulsa
long duration = pulseIn(ECHO_PIN, HIGH);
// Konversi durasi ke jarak dalam cm
float distance = duration * 0.034 / 2;
// Debug jarak
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
return distance;
}
void mataBerkedip() {
// Mata Berkedip (tertutup dengan garis horizontal)
display.clearDisplay();
display.fillRoundRect(20, 38, 40, 4, 2, SSD1306_WHITE); // Mata kiri tertutup
display.fillRoundRect(70, 38, 40, 4, 2, SSD1306_WHITE); // Mata kanan tertutup
display.display();
}
void ekspresiDatar() {
// Ekspresi Datar
display.clearDisplay();
display.fillRoundRect(20, 20, 40, 40, 8, SSD1306_WHITE); // Mata kiri
display.fillRoundRect(70, 20, 40, 40, 8, SSD1306_WHITE); // Mata kanan
display.display();
}
void ekspresiMarah() {
// Ekspresi Marah
display.clearDisplay();
display.fillRoundRect(20, 20, 40, 40, 8, SSD1306_WHITE); // Mata kiri penuh
display.fillRoundRect(70, 20, 40, 40, 8, SSD1306_WHITE); // Mata kanan penuh
display.fillTriangle(20, 20, 60, 20, 60, 40, SSD1306_BLACK); // Potongan kiri: kiri atas ke kanan bawah
display.fillTriangle(70, 20, 70, 40, 110, 20, SSD1306_BLACK); // Potongan kanan: kanan atas ke kiri bawah
display.display();
}
void ekspresiSedih() {
// Ekspresi Sedih
display.clearDisplay();
display.fillRoundRect(20, 20, 40, 40, 8, SSD1306_WHITE); // Mata kiri penuh
display.fillRoundRect(70, 20, 40, 40, 8, SSD1306_WHITE); // Mata kanan penuh
display.fillTriangle(60, 20, 20, 20, 20, 40, SSD1306_BLACK); // Potongan kiri: kanan atas ke kiri bawah
display.fillTriangle(70, 20, 110, 40, 110, 20, SSD1306_BLACK); // Potongan kanan: kiri atas ke kanan bawah
display.display();
}
void ekspresiSenang() {
// Ekspresi Senang
display.clearDisplay();
display.fillRoundRect(20, 20, 40, 40, 8, SSD1306_WHITE); // Mata kiri penuh
display.fillRoundRect(70, 20, 40, 40, 8, SSD1306_WHITE); // Mata kanan penuh
display.fillTriangle(60, 60, 20, 60, 20, 40, SSD1306_BLACK); // Potongan kiri: kanan bawah ke kiri atas
display.fillTriangle(70, 60, 110, 60, 110, 40, SSD1306_BLACK); // Potongan kanan: kiri bawah ke kanan atas
display.display();
}