Garasje-parkeringsassistent: Parker perfekt hver gang

2 timer Byggetid
Mellomnivå vanskelighet
Ferdigheter
3D-printing
Lodding

Har du en trang garasje der hver centimeter teller? Det er fort gjort å være litt for forsiktig – eller i verste fall – litt for tøff med gasspedalen når man skal parkere.

Start Project

Denne smarte parkeringsassistenten bruker en ultralydsensor for å måle avstanden til bilen din, og gir deg umiddelbar visuell tilbakemelding via en LED-stripe. Grønt betyr «kjør på», gult betyr «forsiktig», og rødt betyr «stopp!».

Dette er et utmerket og praktisk IoT-prosjekt som ikke bare beskytter støtfangeren din, men som også gir deg verdifull erfaring med sensorer og adresserbare LED-lys.

Hjernen

Sensor

Indikator (Valgfritt)

Ekstra

Koblingslogikk (Wiring)

Viktig teknisk merknad om spenning:

HC-SR04 sensoren krever 5V for å fungere optimalt, og den sender ut et 5V ekkosignal. ESP32-brikken opererer imidlertid med 3.3V logikk. For å unngå å skade mikrokontrolleren din, må vi senke spenningen fra sensorens «Echo»-pinne ned til 3.3V før den går inn i ESP32-en. Dette gjør vi enklest med en spenningsdeler (spenningdeler-kalkulatoren vår i Lab-verktøy kan hjelpe deg med å finne nøyaktige motstandsverdier hvis du ikke har 1kΩ og 2kΩ for hånden).

Datanivået for WS2812B krever normalt 5V logikk, men i 90% av tilfellene fungerer 3.3V fra ESP32 utmerket på korte avstander.

KomponentPin på KomponentPin på ESP32Merknad
HC-SR04VCC5V (VIN)Strømforsyning
HC-SR04TrigGPIO 5Sender ut lydpuls
HC-SR04EchoGPIO 18Bruk spenningsdeler! (5V -> 3.3V)
HC-SR04GNDGNDFelles jord
WS2812B5V / +5V (VIN)Forsynes direkte fra USB via VIN
WS2812BDin (Data)GPIO 4Styrer fargene
WS2812BGND / –GNDFelles jord

Kode

For dette prosjektet bruker vi det populære biblioteket FastLED for å styre lysstripen. Sørg for at du har installert dette via Library Manager i Arduino IDE.

#include <FastLED.h>

// --- Konfigurasjon av pinner ---
#define TRIG_PIN 5
#define ECHO_PIN 18
#define LED_PIN 4

// --- Konfigurasjon av LED ---
#define NUM_LEDS 15      // Juster etter hvor mange LEDs du bruker
#define BRIGHTNESS 150   // 0-255 (Hold lavere for å spare strøm)
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB

CRGB leds[NUM_LEDS];

// --- Avstander i centimeter ---
const int distGreen = 200;  // Bilen er oppdaget, men langt unna (> 2m)
const int distYellow = 100; // Bilen nærmer seg (1m - 2m)
const int distRed = 30;     // Perfekt parkert! Stopp! (< 30cm)

void setup() {
  Serial.begin(115200);
  
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(BRIGHTNESS);
  
  // Start med å slå av alle lys
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
}

void loop() {
  long duration;
  int distance;

  // Send ultralydpuls
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Les pulsen tilbake
  duration = pulseIn(ECHO_PIN, HIGH);
  
  // Beregn avstand i cm (Lydens hastighet: 343m/s)
  distance = duration * 0.034 / 2;
  
  Serial.print("Avstand: ");
  Serial.print(distance);
  Serial.println(" cm");

  // Logikk for farger basert på avstand
  if (distance > 300 || distance <= 0) {
    // Utenfor rekkevidde eller feillesing -> Slå av lyset
    fill_solid(leds, NUM_LEDS, CRGB::Black);
  } 
  else if (distance > distGreen) {
    fill_solid(leds, NUM_LEDS, CRGB::Green);
  } 
  else if (distance > distYellow) {
    fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  } 
  else if (distance > distRed) {
    // Nærmer seg farlig sone
    fill_solid(leds, NUM_LEDS, CRGB::OrangeRed);
  } 
  else {
    // STOPP!
    fill_solid(leds, NUM_LEDS, CRGB::Red);
    // Valgfritt: Legg inn en blinkefunksjon her for ekstra advarsel!
  }

  FastLED.show();
  delay(100); // Kort pause for stabilitet
}

For den ultimate «smarthus-følelsen» anbefaler vi ESPHome. Det geniale her er at vi lar ESP32-en håndtere fargeskiftene lokalt (på selve brikken). Det betyr at selv om Wi-Fi-nettverket ditt skulle gå ned, vil parkeringsassistenten fortsatt fungere uten forsinkelser!

Samtidig sendes avstandsdataene til Home Assistant, slik at du kan bruke det i andre automasjoner.

Legg til dette i din ESPHome YAML-konfigurasjon:

# Bytt ut med dine egne ESPHome standardinnstillinger (wifi, ota, etc.) i toppen
esphome:
  name: garasje-parkering
  friendly_name: Parkeringsassistent

esp32:
  board: esp32dev
  framework:
    type: arduino

# Konfigurer WS2812B LED-stripen
light:
  - platform: fastled_clockless
    chipset: WS2812B
    pin: GPIO4
    num_leds: 15
    rgb_order: GRB
    name: "Parkeringsindikator"
    id: parking_light
    restore_mode: ALWAYS_OFF

# Konfigurer HC-SR04 Sensoren
sensor:
  - platform: ultrasonic
    trigger_pin: GPIO5
    echo_pin: GPIO18
    name: "Avstand til bil"
    id: car_distance
    update_interval: 0.1s # Rask oppdatering for umiddelbar respons
    unit_of_measurement: "m" # ESPHome bruker meter som standard
    filters:
      - filter_out: nan
    
    # Lokal automasjon: Endre lysfarge basert på avstand
    on_value_range:
      - below: 0.30 # Nærmere enn 30 cm -> RØDT
        then:
          - light.turn_on:
              id: parking_light
              red: 100%
              green: 0%
              blue: 0%
              brightness: 60%
      - above: 0.30
        below: 1.00 # Mellom 30 cm og 1 meter -> GULT
        then:
          - light.turn_on:
              id: parking_light
              red: 100%
              green: 60%
              blue: 0%
              brightness: 60%
      - above: 1.00

Hvis du foretrekker Python-syntaks fremfor C++, er MicroPython et fantastisk valg for ESP32. Det er raskt å laste opp og veldig lett å feilsøke (for eksempel via Thonny IDE).

Sørg for at du har flashet ESP32-en din med siste MicroPython-firmware før du kjører dette skriptet som main.py. NeoPixel-biblioteket er allerede innebygd i standard MicroPython for ESP32!

import machine
import neopixel
import time

# --- Konfigurasjon av pinner ---
# Bruk pinnene fra koblingsskjemaet
trig_pin = machine.Pin(5, machine.Pin.OUT)
echo_pin = machine.Pin(18, machine.Pin.IN)
led_pin = machine.Pin(4, machine.Pin.OUT)

# --- Konfigurasjon av LED ---
num_leds = 15
np = neopixel.NeoPixel(led_pin, num_leds)

# --- Avstander i centimeter ---
dist_green = 200  # Bilen er > 2 meter unna
dist_yellow = 100 # Bilen er mellom 1 og 2 meter unna
dist_red = 30     # Bilen er < 30 cm unna. Stopp!

def get_distance():
    """Måler avstanden ved hjelp av HC-SR04"""
    # Sikre at trig-pinnen er lav før vi sender puls
    trig_pin.value(0)
    time.sleep_us(2)
    
    # Send en 10 mikrosekunders puls
    trig_pin.value(1)
    time.sleep_us(10)
    trig_pin.value(0)
    
    # Mål tiden det tar for ekkoet å returnere (i mikrosekunder)
    # time_pulse_us returnerer -1 hvis den timer ut
    duration = machine.time_pulse_us(echo_pin, 1, 30000) 
    
    if duration < 0:
        return -1 # Utenfor rekkevidde / feil
        
    # Lydens hastighet er ca 343 m/s, som gir formelen under for cm
    distance = (duration / 2) / 29.1
    return distance

def set_color(r, g, b):
    """Setter fargen på hele LED-stripen"""
    for i in range(num_leds):
        np[i] = (r, g, b)
    np.write()

# --- Hovedløkke ---
while True:
    avstand = get_distance()
    
    # Debugging - printes til konsollen (REPL)
    print(f"Avstand: {avstand:.1f} cm")
    
    if avstand < 0 or avstand > 300:
        # Feillesing eller utenfor rekkevidde - slå av lys
        set_color(0, 0, 0)
    elif avstand > dist_green:
        # Grønt lys
        set_color(0, 255, 0)
    elif avstand > dist_yellow:
        # Gult/oransje lys
        set_color(255, 150, 0)
    elif avstand > dist_red:
        # Rødt advarselslys
        set_color(255, 50, 0)
    else:
        # Perfekt parkert - Rødt lys!
        set_color(255, 0, 0)
        
    time.sleep(0.1) # Kort pause for å unngå ustabile sensoravlesninger

Veien videre (Next Steps)

Når du har prototypen fungerende på pulten, er det på tide å flytte den ut!

  1. 3D-print et deksel: Sensoren bør festes i nøyaktig støtfangerhøyde på garasjeveggen. Hvis du har en 3D-printer, finnes det mange flotte design for HC-SR04 på Thingiverse.
  2. Kabelhåndtering: Legg kablene mellom ESP32 og LED-stripen i kabelkanaler for en ren og ryddig look.
  3. Smart oppgradering: Gjør koden mer avansert ved å implementere en timeout. Hvis avstanden forblir uendret på under 30 cm i mer enn 5 minutter, kan du slå av LED-stripen slik at den ikke står og lyser rødt hele natten.

Home Assistant Automasjon: Sikkerhetsvarsel

Slik setter vi opp en automasjon i Home Assistant som fungerer som en digital «vaktmester» for garasjeporten din. Denne automasjonen sjekker avstanden når garasjeporten begynner å lukke seg. Hvis bilen står for langt ute, får du umiddelbart et varsel på telefonen slik at du kan stoppe porten før den treffer støtfangeren.

For å legge inn denne, går du til Innstillinger -> Automasjoner og scener -> Opprett automasjon -> Rediger i YAML i Home Assistant.

Kopier og lim inn koden nedenfor. (Husk å bytte ut cover.garasjeport og notify.mobile_app_din_telefon med de faktiske navnene på enhetene dine i Home Assistant).

alias: "Garasje: Advarsel om dårlig parkering"
description: "Sender push-varsel hvis porten lukkes og bilen stikker for langt ut."
mode: single

trigger:
  - platform: state
    entity_id: cover.garasjeport
    to: "closing" # Utløses i det porten begynner å gå ned

condition:
  # Sjekker to ting: Er det en bil der, og står den for langt unna sensoren?
  - condition: numeric_state
    entity_id: sensor.avstand_til_bil # Dette navnet genereres automatisk fra ESPHome
    above: 0.35 # Bilen står mer enn 35 cm fra veggen (for langt ut)
    below: 1.50 # Bilen er nærmere enn 1,5 meter (bekrefter at bilen faktisk er i garasjen)

action:
  - service: notify.mobile_app_din_telefon
    data:
      title: "⚠️ Advarsel: Garasjeport"
      message: "Bilen er ikke parkert dypt nok! Stopp porten for å unngå kollisjon. Sensoren måler {{ states('sensor.avstand_til_bil') }} meter."

Slik fungerer logikken:

  • Trigger (Når): Automasjonen lytter etter at tilstanden til garasjeporten endres til «closing».
  • Condition (Betingelse): Her bruker vi en numeric_state. Vi sjekker at avstanden er over 35 cm (noe som betyr at bilen ikke er helt inne i den grønne/røde sonen vi definerte i koden), men under 1,5 meter. Vi setter en øvre grense for å unngå at du får et varsel hvis garasjen er helt tom når porten lukkes.
  • Action (Handling): Sender varselet. Vi har også lagt inn en liten bonus-funksjon i meldingen: {{ states('sensor.avstand_til_bil') }} henter ut den nøyaktige avstanden i sanntid og inkluderer den i varselet du får på skjermen!

💡 Feilsøkingstips: Hvis du opplever at automasjonen ikke trigger nøyaktig når porten går ned, kan du sjekke loggboken i Home Assistant for å se nøyaktig hvilke statuser (f.eks. «closed», «closing», «open») garasjeport-motoren din faktisk rapporterer.

Neste trinn for den avanserte byggeren

Dette varselet er kjempebra, men det krever fortsatt at du er rask nok til å trykke på stopp-knappen manuelt hvis du får varselet.

Siden du allerede bruker en ESP32 i dette prosjektet, har du mange ledige GPIO-pinner. Kunne du tenke deg å utvide Kjernekomponenter-listen med et 5V Relé, slik at ESP32-en automatisk kan kutte strømmen til garasjeportmotoren (eller trigge stopp-kontakten) hvis bilen står i veien?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *