DIY парктроник на Arduino UNO и ультразвуковых датчиках HC-SR04
Компоненты и материалы
| Название | Количество |
|---|---|
| Arduino UNO | 1 |
| Ультразвуковой датчик HC-SR04 | 3 |
| Мини-дисплеи уровня заряда (на чипе TM1651) | 2 |
О проекте
Простой парктроник на базе трех ультразвуковых датчиков HC-SR04: левый, центральный, правый. Два мини-дисплея (на чипе TM1651, изначально для индикации заряда батареи) показывают расстояние до препятствий. Максимальная дистанция задается в коде (20 см) — выше неё считается безопасной (дисплеи полные), ниже — индикация пропорциональна расстоянию.

Детали




Принцип работы
Три датчика: Right, Middle, Left. Два дисплея: Right, Left. Центральный датчик влияет на оба дисплея, боковые — только на свои.
- Если есть препятствия справа и по центру — берется ближайшее расстояние для правого дисплея.
- Если центр ближе — оба дисплея показывают его расстояние.
- Если правый ближе — правый дисплей показывает меньшее значение, чем левый.
- Максимальная дистанция (Maxdistance) задается в коде. Выше неё — дисплеи на максимуме (7 уровень). Ниже — уровень 0..7 пропорционально расстоянию.
Примеры на иллюстрациях.




Улучшения
- Добавить датчики для покрытия большей площади.
- Добавить экран с цифровым значением расстояния.
- Заменить на водозащищенные датчики (JSN-SR04).
- Добавить звуковые сигналы.
Код
Parking_sensor_v1.ino (Arduino)
/* Работа с 3 модулями HC-SR04 и 2 дисплеями TM1651
* Парктроник: показывает близость препятствий и сторону
* Зависит от Maxdistance — выше безопасно, ниже меняется пропорционально
* Подробности: www.SurtrTech.com
*/
#include <TM1651.h>
#define CLK 3 // Правый дисплей
#define DIO 2
#define CLK2 5 // Левый дисплей
#define DIO2 4
#define trigPin 6 // Центральный УЗ
#define echoPin 7
#define trigPinR 8 // Правый УЗ
#define echoPinR 9
#define trigPinL 10 // Левый УЗ
#define echoPinL 11
#define Maxdistance 20 // Макс. дистанция 20 см
long duration;
int distance;
TM1651 DisplayR(CLK, DIO);
TM1651 DisplayL(CLK2, DIO2);
void setup() {
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
pinMode(trigPinR, OUTPUT); pinMode(echoPinR, INPUT);
pinMode(trigPinL, OUTPUT); pinMode(echoPinL, INPUT);
DisplayR.init(); DisplayR.set(BRIGHTEST);
DisplayL.init(); DisplayL.set(BRIGHTEST);
}
void loop() {
int distanceM = CDistance(trigPin, echoPin);
int distanceR = CDistance(trigPinR, echoPinR);
int distanceL = CDistance(trigPinL, echoPinL);
int R = min(distanceM, distanceR); // Минимум для правого дисплея
int L = min(distanceM, distanceL); // Минимум для левого
if (R > 0 && R < Maxdistance) {
byte LevelR = map(R, 0, Maxdistance, 0, 7);
DisplayR.displayLevel(LevelR);
}
if (R >= Maxdistance) DisplayR.displayLevel(7);
if (L > 0 && L < Maxdistance) {
byte LevelL = map(L, 0, Maxdistance, 0, 7);
DisplayL.displayLevel(LevelL);
}
if (L >= Maxdistance) DisplayL.displayLevel(7);
delay(50);
}
int CDistance(int trig, int echo) {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = duration * (0.034 / 2);
return distance;
}
Библиотека TM1651 для дисплеев заряда
Сильно упрощает работу: GitHub: fuel_display
Схемы
Производственный процесс
- Радарные датчики: принцип работы и современные применения
- Парктроники: принцип работы, типы и основные применения
- Понимание кислородного (O2) датчика: роль, размещение и признаки отказа
- Mouser Electronics демонстрирует передовые сенсорные технологии на Sensors Expo 2019
- Ambarella приобретает Oculii за $307,5 млн, расширяя радар и сенсорный фьюжн для автономных авто
- Управление светодиодом с PIR-датчиком движения на Raspberry Pi
- Построение низкобюджетного датчика влажности почвы на Raspberry Pi для умного полива
- Создайте домашний монитор температуры на Raspberry Pi с MCP9808, InfluxDB и Grafana
- Интеграция импульсного радара Acconeer A111 с Raspberry Pi: практическое руководство
- Датчик эмоций и ЭЭГ: низкобюджетное железо для детекции эмоций в реальном времени