Berikan donasi untuk mendukung pengembangan konten Arduino berkualitas yang lebih baik

Sistem Gerbang Mobil Otomatis dengan Arduino

Bikin gerbang otomatis ala mall atau perumahan menggunakan sensor ultrasonik, servo motor, dan traffic light LED.

Komponen yang Dibutuhkan Untuk Proyek Ini

4 item

Di bawah ini Anda akan menemukan semua komponen yang diperlukan untuk menyelesaikan tutorial Arduino ini. Setiap komponen mencakup tautan afiliasi ke berbagai marketplace tempat Anda dapat membelinya.

Arduino Uno

Arduino Uno

Mikrokontroler

Mikrokontroler utama untuk mengendalikan seluruh sistem.

Rp 58.980
Harga terbaik di Shopee
Sensor Ultrasonik HC-SR04

Sensor Ultrasonik HC-SR04

Sensor

Untuk mendeteksi keberadaan mobil di depan gerbang.

Rp 9.500
Harga terbaik di Shopee
Servo Motor SG90

Servo Motor SG90

Aktuator

Untuk menggerakkan palang atau gerbang secara otomatis.

Rp 12.600
Harga terbaik di Tokopedia
Kabel Jumper Male-to-Male

Kabel Jumper Male-to-Male

Kabel

Untuk menyambung komponen di breadboard.

Rp 9.980
Harga terbaik di Shopee

Kode Sumber

CarGateSystem.ino
cpp
185 lines
5113 characters
#include <Servo.h>

// ---------- DEFINISI PIN DAN KONSTANTA ----------
#define TRIG_PIN 9
#define ECHO_PIN 10
#define LED_GREEN 8
#define LED_YELLOW 7
#define LED_RED 6
#define SERVO_PIN 5

// Konstanta untuk Servo
// Nilai ini mungkin perlu dikalibrasi untuk servo spesifik Anda
#define SERVO_MIN_PULSE 544  // Lebar pulsa untuk 0 derajat (dalam mikrosekon)
#define SERVO_MAX_PULSE 2400 // Lebar pulsa untuk 180 derajat (dalam mikrosekon)

// Posisi gerbang dalam derajat
#define GATE_CLOSED_DEG 15   // Posisi gerbang tertutup
#define GATE_OPEN_DEG 120    // Posisi gerbang terbuka

// Durasi pergerakan servo
#define GATE_MOVE_DURATION 500 // Durasi total untuk membuka/menutup (0.5 detik)

// ---------- INISIALISASI OBJEK DAN VARIABEL ----------
Servo gateServo;

// Variabel untuk sistem
bool carDetected = false;
bool gateOpen = false;
unsigned long gateOpenTime = 0;
bool waitingToClose = false;

// States untuk LED
enum LEDState {
  RED_LIGHT,
  YELLOW_OPENING,
  GREEN_LIGHT,
  YELLOW_CLOSING
};

LEDState currentLEDState = RED_LIGHT;

// ---------- FUNGSI UTAMA ----------

void setup() {
  // Inisialisasi pin
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  
  // Inisialisasi servo dengan rentang pulsa kustom
  gateServo.attach(SERVO_PIN, SERVO_MIN_PULSE, SERVO_MAX_PULSE);
  
  // Kondisi awal
  // Konversi posisi derajat ke mikrosekon
  int initialPulse = map(GATE_CLOSED_DEG, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE);
  gateServo.writeMicroseconds(initialPulse); // Set gerbang ke posisi tertutup
  setLED(RED_LIGHT);  // LED merah menyala
  
  // Inisialisasi Serial untuk debugging
  Serial.begin(9600);
  Serial.println("Sistem Gerbang Parkir Siap!");
  Serial.println("Status: Gerbang Tertutup - LED Merah");
}

void loop() {
  // Baca jarak dari sensor HC-SR04
  long distance = readDistance();
  
  // Logika deteksi mobil
  if (distance <= 10 && distance > 0) {
    carDetected = true;
    
    // Jika gerbang tertutup dan ada mobil terdeteksi
    if (!gateOpen && currentLEDState == RED_LIGHT) {
      Serial.println("Mobil terdeteksi! Membuka gerbang...");
      openGate();
    }
  } else {
    carDetected = false;
  }
  
  // Logika penutupan gerbang
  if (gateOpen && !carDetected) {
    if (!waitingToClose) {
      waitingToClose = true;
      gateOpenTime = millis();
      Serial.println("Area kosong. Menunggu 3 detik untuk menutup...");
    }
    
    // Tutup gerbang setelah 1 detik tidak ada mobil
    if (millis() - gateOpenTime >= 1000) {
      Serial.println("Menutup gerbang...");
      closeGate();
      waitingToClose = false;
    }
  } else if (carDetected && waitingToClose) {
    // Reset timer jika mobil terdeteksi lagi saat menunggu
    waitingToClose = false;
    Serial.println("Mobil terdeteksi lagi. Penutupan dibatalkan.");
  }
  
  delay(100);
}

// ---------- FUNGSI PENDUKUNG ----------

/**
 * @brief Menggerakkan servo secara halus dari posisi awal ke akhir dalam durasi tertentu.
 * @param startDeg Posisi awal dalam derajat.
 * @param endDeg Posisi akhir dalam derajat.
 * @param duration Durasi pergerakan dalam milidetik.
 */
void smoothServoMove(int startDeg, int endDeg, int duration) {
  // Konversi posisi derajat ke mikrosekon
  int startPulse = map(startDeg, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE);
  int endPulse = map(endDeg, 0, 180, SERVO_MIN_PULSE, SERVO_MAX_PULSE);
  
  unsigned long startTime = millis();
  
  while (millis() - startTime < duration) {
    // Hitung progres pergerakan (nilai dari 0.0 sampai 1.0)
    float progress = (float)(millis() - startTime) / duration;
    
    // Hitung posisi pulsa saat ini berdasarkan progres
    int currentPulse = startPulse + (progress * (endPulse - startPulse));
    
    // Kirim perintah ke servo
    gateServo.writeMicroseconds(currentPulse);
    
    delay(10); // Jeda kecil untuk loop, agar tidak membebani prosesor
  }
  
  // Pastikan servo berada di posisi akhir
  gateServo.writeMicroseconds(endPulse);
}

void openGate() {
  setLED(YELLOW_OPENING);
  smoothServoMove(GATE_CLOSED_DEG, GATE_OPEN_DEG, GATE_MOVE_DURATION);
  setLED(GREEN_LIGHT);
  gateOpen = true;
  Serial.println("Gerbang terbuka!");
}

void closeGate() {
  setLED(YELLOW_CLOSING);
  smoothServoMove(GATE_OPEN_DEG, GATE_CLOSED_DEG, GATE_MOVE_DURATION);
  setLED(RED_LIGHT);
  gateOpen = false;
  Serial.println("Gerbang tertutup!");
}

long readDistance() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  
  long duration = pulseIn(ECHO_PIN, HIGH);
  return duration * 0.034 / 2;
}

void setLED(LEDState state) {
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_GREEN, LOW);
  
  switch(state) {
    case RED_LIGHT:
      digitalWrite(LED_RED, HIGH);
      break;
    case YELLOW_OPENING:
    case YELLOW_CLOSING:
      digitalWrite(LED_YELLOW, HIGH);
      break;
    case GREEN_LIGHT:
      digitalWrite(LED_GREEN, HIGH);
      break;
  }
  currentLEDState = state;
}

Skema/Diagram Rangkaian

Petunjuk Langkah demi Langkah

Siapkan Komponen

Siapkan Arduino Uno, sensor ultrasonik HC-SR04, servo motor SG90, LED merah-kuning-hijau, resistor 220Ω, breadboard, dan kabel jumper.

Hubungkan Sensor Ultrasonik

Sambungkan pin VCC sensor ke 5V Arduino, GND ke GND, Trig ke pin 9, dan Echo ke pin 10.

Hubungkan Servo Motor

Sambungkan kabel coklat servo ke GND, merah ke 5V, dan oranye ke pin 5 pada Arduino.

Hubungkan LED Traffic Light

Sambungkan LED merah ke pin 8, kuning ke pin 7, hijau ke pin 6, masing-masing lewat resistor 220Ω, lalu sambung ke GND.

Hubungkan Daya

Gunakan kabel USB untuk menghubungkan Arduino ke laptop untuk daya dan pemrograman.

Unggah Kode ke Arduino

Buka Arduino IDE, salin kode sistem gerbang mobil, dan unggah ke Arduino Uno.

Uji Sistem

Nyalakan Arduino, dekatkan benda ke sensor ultrasonik. Lampu akan menyala sesuai jarak, lalu gerbang terbuka secara otomatis.

Video Hasil