Garasje-parkeringsassistent: Parker perfekt hver gang
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.
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.
| Komponent | Pin på Komponent | Pin på ESP32 | Merknad |
| HC-SR04 | VCC | 5V (VIN) | Strømforsyning |
| HC-SR04 | Trig | GPIO 5 | Sender ut lydpuls |
| HC-SR04 | Echo | GPIO 18 | Bruk spenningsdeler! (5V -> 3.3V) |
| HC-SR04 | GND | GND | Felles jord |
| WS2812B | 5V / + | 5V (VIN) | Forsynes direkte fra USB via VIN |
| WS2812B | Din (Data) | GPIO 4 | Styrer fargene |
| WS2812B | GND / – | GND | Felles 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.00Hvis 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 sensoravlesningerVeien videre (Next Steps)
Når du har prototypen fungerende på pulten, er det på tide å flytte den ut!
- 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.
- Kabelhåndtering: Legg kablene mellom ESP32 og LED-stripen i kabelkanaler for en ren og ryddig look.
- 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