Немного предисловия:
Как то решил заняться своим рабочим местом дома. Сделал удобный стол, полки, подсветка, на подоконнике микро мастерская для пайки и разных приблуд. Но каждый раз пока сидишь работаешь, супруга ложится спать. И приходится постоянно включать и отключать подсветку. Задолбало!!! в итоге пришел к следующему
Задача:
Автоматизировать включение подсветки рабочего места из имеющегося говна и палок =))) Главный приоритет бесшумное включение.
Решение:
Использовать имеющийся лазерный дальномер. Бесшумное реле и самая маленькая плата которая есть Arduino Uno + блок питания в розетку для стационарной работы.
Алгоритм простой. Есть препятствие - включаем реле, нет препятствия - выключаем реле.
Реализация:
Вначале использовал ультразвуковой дальномер HC-SR04. Но с ним есть одна проблема - ультразвуковой сигнал который она выпускает, теряется в ткани одежды. В связи с чем он был выкинут. Инфракрасный датчик тоже отпал, так как MH-Sensor даже с учётом построечного резистора, не очень большой диапазон распознавания препятствия. Хотя это идеальный вариант что бы схема была минимальной. Что было под рукой:
Arduino Uno - Лучше конечно nano но её нет ( Или на MH-Sensor но увеличивать дальность
HY-M285 - Твердотельное реле omron которое не издаёт никакого звука (Тишина залог здоровья)
CJVL53L0XV2 - Лазерный дальномер который постоянно делает замер
[Супер - Схема]
Определяем пины:
CJVL53L0XV2 - A4 (SDA)
CJVL53L0XV2 - A5 (SCL)
HY-M285 Реле - D3
Подключение
На дальномере + и - подключаем к линии +5 и grd. SDA подключаем к контакту А4 на Arduno и SCL на контакт А5 Arduino
HY-M285 подключаем так же, + к +5 на ардуино и - на grn. CH1 крутим на контакт D3
На светодиодную ленту у меня стоит драйвер с 220 на 12 вольт. Поэтому реле я ставлю в разрез фазы 220 вольт
Программа
Для работы программы нужна стандартная библиотека Adafruit_VL53L0X.h
#include "Adafruit_VL53L0X.h"
#define PIN_RELAY 3 // определяем пин для реле
Adafruit_VL53L0X lox = Adafruit_VL53L0X();
void setup() {
Serial.begin(115200);
pinMode(PIN_RELAY, OUTPUT);
digitalWrite(PIN_RELAY, HIGH);
while (! Serial) {
delay(1);
}
if (!lox.begin()) {
Serial.println(F("Не загружен VL53L0X"));
while(1);
}
}
void loop() {
VL53L0X_RangingMeasurementData_t measure;
lox.rangingTest(&measure, false);
if (measure.RangeStatus != 4) {
Serial.print("Растояние: ");
Serial.print(measure.RangeMilliMeter);
Serial.println(" mm");
} else {
Serial.println(" Очень далеко ");
}
if (measure.RangeMilliMeter < 450) {
digitalWrite(PIN_RELAY, HIGH);
}
else
{
digitalWrite(PIN_RELAY, LOW);
}
delay(100);
}
Параметр "чувствительности" или появления объекта регулируется здесь. Если расстояние до объекта меньше 450 мм то включаем реле
if (measure.RangeMilliMeter < 450) {
digitalWrite(PIN_RELAY, HIGH);
Видео: