Привет, друзья! В прошлый раз мы создали небольшой проект, в котором RGB-светодиод менял цвет в зависимости от расстояния до объекта. Если вы пропустили эту статью, обязательно ознакомьтесь
Это было классно, но, как говорится, хочется чего-то большего, правда? Ведь эта система так напоминает парктроник! Так почему бы не пойти дальше и не превратить наш простой датчик в полноценное устройство, которое будет полезно в реальных ситуациях? Давайте немного усовершенствуем наш проект до уровня настоящего мини-парктроника!
Что будем делать?
Возьмем наш предыдущий проект и добавим ему новой функциональности (пины переделаем, так уж вышло):
- Добавим дополнительную световую индикацию (желтый и оранжевый)
- Станем отображать расстояние (в сантиметрах) до объекта на ЖК-дисплее.
- Будем издавать звуковые сигналы с помощью пьезо-пищалки в зависимости от расстояния.
Что нам понадобится:
- Arduino Uno (или другая плата Arduino).
- HC-SR04 (ультразвуковой датчик).
- ЖК-дисплей 16x2.
- Потенциометр (я использую B100K, но лучше использовать B10K).
- RGB-светодиод Xinda с общим катодом.
- Пьезо-пищалка (зуммер).
- Резисторы (всего 4 штуки: 3 по 220 Ом для RGB светодиода и 1 для питания дисплея).
- Провода.
- Макетная плата.
Некоторые из вас спрашивали, зачем нужны резисторы. Они необходимы для ограничения тока, который поступает к светодиодам и другим компонентам. Это защищает от перегрева и возможного повреждения. Используем резисторы на 220 Ом для стабилизации работы светодиодов и продления срока службы всех деталей.
Подключение.
На этот раз подключение будет немного сложнее чем в прошлый раз 😁
Ультразвуковой датчик HC-SR04:
VCC → 5V на Arduino
GND → GND
Trig → Пин 3
Echo → Пин 2
ЖК-дисплей (подключение в 4-битном режиме):
VSS → GND
VDD → 5V
V0 → Контраст (через потенциометр)
RS → Пин 7
RW → GND
E → Пин 8
D4, D5, D6, D7 → Пины 9, 10, 11, 12
A → 5V через резистор 220 Ом
K → GND
RGB-светодиод Xinda:
Общий катод → GND
Красный → Пин 4 через резистор 220 Ом
Зеленый → Пин 5 через резистор 220 Ом
Синий → Пин 6 через резистор 220 Ом
Пьезо-пищалка:
Один контакт → GND
Другой контакт → Пин 13
Потенциометр:
Средний контакт → V0
Левый контакт → GND
Правый контакт → 5V
Программирование.
Готовый скетч на GitHub:
В коде добавлены комментарии, чтобы было понятно что и для чего там написано:
#include <LiquidCrystal.h> // Подключаем стандартную библиотеку для LCD-дисплея
// Инициализация LCD-дисплея (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// Пины для HC-SR04
const int trigPin = 3;
const int echoPin = 2;
// Пины для RGB светодиода
const int redPin = 4;
const int greenPin = 5;
const int bluePin = 6;
// Пин для пьезо-пищалки
const int buzzerPin = 13;
// Переменные для хранения времени и расстояния
long duration;
int distance;
void setup() {
// Настройка пинов для HC-SR04
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Настройка пинов для RGB светодиода
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
// Настройка пина для пьезо-пищалки
pinMode(buzzerPin, OUTPUT);
// Инициализация LCD-дисплея 16x2
lcd.begin(16, 2);
lcd.print("Dist:"); // Печатаем начальный текст
}
void loop() {
// Генерация ультразвукового импульса
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Чтение импульса Echo и расчет расстояния
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Расчет расстояния в сантиметрах
// Отображение расстояния на LCD-дисплее
lcd.setCursor(6, 0); // Устанавливаем курсор после "Dist:"
lcd.print(" "); // Очищаем предыдущие цифры
lcd.setCursor(6, 0); // Снова устанавливаем курсор
lcd.print(distance); // Печатаем новое значение
// Логика изменения цвета RGB светодиода и звуковых сигналов
if (distance > 100) {
// Если препятствий нет (дальше 100 см) — синий цвет, звук выключен
setColor(255, 0, 0); // Синий
noTone(buzzerPin); // Отключаем звук
} else if (distance > 50 && distance <= 100) {
// Препятствие далеко (50–100 см) — зеленый цвет, один короткий сигнал
setColor(0, 255, 0); // Зеленый
playBeep(1);
} else if (distance > 30 && distance <= 50) {
// Препятствие приближается (30–50 см) — желтый цвет, два коротких сигнала
setColor(0, 200, 200); // Желтый
playBeep(2);
} else if (distance > 20 && distance <= 30) {
// Препятствие близко (20–30 см) — оранжевый цвет, три коротких сигнала
setColor(0, 100, 255); // Оранжевый
playBeep(3);
} else if (distance <= 15) {
// Препятствие очень близко (меньше 15 см) — красный цвет, постоянный звук
setColor(0, 0, 255); // Красный
tone(buzzerPin, 1000); // Постоянный звук
}
delay(500); // Задержка перед следующим измерением
}
// Функция установки цвета на RGB светодиоде
void setColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
// Функция для проигрывания звуковых сигналов
void playBeep(int count) {
for (int i = 0; i < count; i++) {
tone(buzzerPin, 1000); // Включаем звук с частотой 1000 Гц
delay(100); // Задержка для короткого сигнала
noTone(buzzerPin); // Отключаем звук
delay(100); // Задержка между сигналами
}
}
Задания для саморазвития.
Для саморазвития и более глубокого понимания, можете выполнить след. задания:
- Добавьте еще два цвета, чтобы в общей сложности у вас получилось 7 цветов. Используйте другую цветовую гамму.
- Добавьте еще один зуммер, для подключения используйте аналоговый порт. Поменяйте звуковое оповещение используя два зуммера.
- Используйте батарейный отсек, чтобы сделать проект переносным.
Заключение.
Вот и всё, друзья! Теперь у нас в руках настоящий мини-парктроник, который не просто определяет расстояние до препятствий, но и по-настоящему взаимодействует с нами! На ЖК-дисплее вы можете видеть точные данные о расстоянии в сантиметрах, а RGB-светодиод мгновенно меняет цвет (используя 5 цветов), предупреждая о приближении к объекту . И, конечно же, куда без звука? Пьезо-пищалка добавляет звуковую сигнализацию, делая проект еще более функциональным и наглядным.