Умный парковочный ассистент для гаража с RGB-индикацией на Arduino Nano
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino Nano R3 | 1 |
| Ультразвуковой датчик HC-SR04 | 1 |
| WS2812B LED-лента 1 м (30 LED, IP30, 5 В) | 1 |
| Конденсатор 1000 мкФ (подавление пульсаций) | 1 |
| Диод 1N4148 (быстрый, защита от обратного питания) | 1 |
| Резистор 470 Ом (на линию данных LED) | 1 |
Инструменты
- 3D-принтер (корпус), паяльник
О проекте
Парковочный сенсор для гаража: адресуемая RGB-лента показывает расстояние до стоп-положения. Видео в действии: смотреть.
Корпус спроектирован под акриловый полукруглый профиль 1/2" (длина 20 7/16") — служит линзой и соединяет хвостовидные элементы. Можно купить (~$0.66/фут) или напечатать линзы из прозрачного филамента (4 сегмента на сторону).
Этапы сборки
- Подготовка ленты: режем WS2812B на два отрезка по 15 LED. Паяем провода в начале каждого (стрелки на ленте указывают от места пайки).
- Сборка рельсов: внешний рельс + два внутренних сегмента на сторону, корпус посередине.
- Монтаж лент: заводим провода в корпус, клеим ленты на скотч. Ленты заканчиваются за 1/2" до края внешнего рельса.
- Установка линз: вставляем акрил/печатные линзы до упора — фиксируют хвостовиды. Для печати — 4 сегмента на сторону.
- Крепление на базу: МДФ 1/2" × 2" × 45 1/8". Мелкие плоские/потайные саморезы (круглые головки мешают USB-разъёму для перепрошивки).
- Электрика: конденсатор у питания (от скачков), резистор 470 Ом на сигнальный провод (пин 7), диод 1N4148 на V+ Arduino (защита от обратного тока при подключении USB без питания). Диод и резистор в паяной точке с термоусадкой. Отверстие в корпусе для провода питания (рекомендую 2×0.75 мм²).
- Установка Arduino: винт 2.5 мм в квадратные отверстия. Крайние неиспользуемые пины Arduino можно снять для удобства.
- Ультразвуковой датчик HC-SR04: на крышке, винты 2.5 мм. Провода направьте к центру — не должны мешать стенкам.
- Крышка: винты 3 мм.
- Прошивка: обновите библиотеки
FastLEDиQuickStats. Настройтеstartdistance(начало детектирования) иstopdistance(парковка) в сантиметрах (диапазон датчика 3–400 см). - Питание от света гаража: в розетку автомата вкрутите адаптер с гнездом, подайте 5 В на блок. Панель будет работать только пока горит свет гаража (экономия).



Код (Arduino)
/* Garage Parking Sensor - Bob Torrence */
#include <FastLED.h>
#include <QuickStats.h>
QuickStats stats;
#define LED_PIN 7
#define NUM_LEDS 15
const int trigPin = 9;
const int echoPin = 10;
CRGB leds[NUM_LEDS];
float duration, durationarray[15];
int distance;
int stopdistance = 115; // стоп-позиция (см)
int startdistance = 400; // начало сканирования (см)
int increment = ((startdistance - stopdistance) / 15);
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
Serial.begin(9600);
}
void loop() {
// Медианный фильтр 15 замеров
for (int i = 0; i <= 14; i++) {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
durationarray[i] = pulseIn(echoPin, HIGH);
distance = durationarray[i] * 0.034 / 2;
Serial.print(distance); Serial.print(" ");
}
duration = stats.median(durationarray, 15);
distance = duration * 0.034 / 2;
Serial.print("Distance: "); Serial.println(distance);
// Логика индикации: красный = стоп, жёлтый = приближение, зелёный = далеко
if (distance < stopdistance) {
fill_solid(leds, NUM_LEDS, CRGB(255, 0, 0)); // все красные
} else if (distance < stopdistance + increment) {
leds[0] = CRGB(255, 255, 0); fill_solid(leds+1, 14, CRGB::Black);
} else if (distance < stopdistance + increment*2) {
leds[0] = leds[1] = CRGB(255, 255, 0); fill_solid(leds+2, 13, CRGB::Black);
} else if (distance < stopdistance + increment*3) {
leds[0] = leds[1] = leds[2] = CRGB(255, 255, 0); fill_solid(leds+3, 12, CRGB::Black);
} else if (distance < stopdistance + increment*4) {
fill_solid(leds, 4, CRGB(0, 255, 0)); fill_solid(leds+4, 11, CRGB::Black);
} else if (distance < stopdistance + increment*5) {
fill_solid(leds, 5, CRGB(0, 255, 0)); fill_solid(leds+5, 10, CRGB::Black);
} else if (distance < stopdistance + increment*6) {
fill_solid(leds, 6, CRGB(0, 255, 0)); fill_solid(leds+6, 9, CRGB::Black);
} else if (distance < stopdistance + increment*7) {
fill_solid(leds, 7, CRGB(0, 255, 0)); fill_solid(leds+7, 8, CRGB::Black);
} else if (distance < stopdistance + increment*8) {
fill_solid(leds, 8, CRGB(0, 255, 0)); fill_solid(leds+8, 7, CRGB::Black);
} else if (distance < stopdistance + increment*9) {
fill_solid(leds, 9, CRGB(0, 255, 0)); fill_solid(leds+9, 6, CRGB::Black);
} else if (distance < stopdistance + increment*10) {
fill_solid(leds, 10, CRGB(0, 255, 0)); fill_solid(leds+10, 5, CRGB::Black);
} else if (distance < stopdistance + increment*11) {
fill_solid(leds, 11, CRGB(0, 255, 0)); fill_solid(leds+11, 4, CRGB::Black);
} else if (distance < stopdistance + increment*12) {
fill_solid(leds, 12, CRGB(0, 255, 0)); fill_solid(leds+12, 3, CRGB::Black);
} else if (distance < stopdistance + increment*13) {
fill_solid(leds, 13, CRGB(0, 255, 0)); fill_solid(leds+13, 2, CRGB::Black);
} else if (distance < stopdistance + increment*14) {
leds[14] = CRGB(0, 255, 0); fill_solid(leds, 14, CRGB(0, 255, 0));
} else {
fill_solid(leds, NUM_LEDS, CRGB(0, 255, 0)); // все зелёные
}
FastLED.show();
delay(50);
}
3D-модели и схемы
STL-файлы корпуса и линз — в разделе Custom parts. Схема (Fritzing) — в Schematics (обновлена 21.04.19: исправлено направление диода).
Производственный процесс
- TinyML-детектор языка на Arduino Nano 33 BLE Sense с Edge Impulse
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Создание рулетки на 37 светодиодов с Arduino Nano
- Мини-аркада на ATtiny85: Snake — ручная OLED-консоль своими руками
- Портативный дальномер на Arduino Nano: HC-SR04, питание 18650, 3D-корпус
- Сборка аудиореактивной настольной лампы на Arduino Nano
- Персональный помощник здоровья (PHA): Умное IoT-решение для сообщества
- Медное гальваническое покрытие: умная система на Arduino UNO
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10