#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define TRIGGER_PIN 12 // Ubah pin sesuai dengan pin yang tersedia di Wokwi
#define ECHO_PIN 13 // Ubah pin sesuai dengan pin yang tersedia di Wokwi
#define SDA D2
#define SCL D1
#define SCREEN_WIDTH 128 // Lebar layar OLED
#define SCREEN_HEIGHT 64 // Tinggi layar OLED
#define OLED_RESET -1
// MPU6050
Adafruit_MPU6050 mpu;
// OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Servo parameters
const int minPulseWidth = 500; // Minimum pulse width
const int maxPulseWidth = 2400; // Maximum pulse width
const int servoFrequency = 50; // Servo frequency
const int servoChannel = 0; // PWM channel for servo
const int servoResolution = 14; // PWM resolution for servo
void setup() {
// Serial
Serial.begin(115200);
// MPU6050
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {
delay(10);
}
}
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_250_DEG);
// OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000);
display.clearDisplay();
}
float getDistance() {
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
unsigned long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void writeServoMicroseconds(int microseconds) {
ledcSetup(servoChannel, servoFrequency, servoResolution);
ledcAttachPin(TRIGGER_PIN, servoChannel);
ledcWrite(servoChannel, map(microseconds, 0, 180, minPulseWidth, maxPulseWidth));
}
void loop() {
// MPU6050
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
float ax = a.acceleration.x;
float ay = a.acceleration.y;
float az = a.acceleration.z;
// Ultrasonic
float distance = getDistance();
// OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("MPU6050:");
display.setCursor(0,10);
display.print(" Ax: ");
display.print(ax);
display.setCursor(0,20);
display.print(" Ay: ");
display.print(ay);
display.setCursor(0,30);
display.print(" Az: ");
display.print(az);
display.setCursor(0,40);
display.print("Ultrasonic:");
display.setCursor(0,50);
display.print(" Distance: ");
display.print(distance);
display.print(" cm");
display.display();
// Servo
int servoAngle = (distance < 200) ? 0 : 180; // Jika jarak di bawah 200 cm, servo terbuka, sebaliknya servo tertutup
writeServoMicroseconds(servoAngle);
delay(100);
}