Бесконтактный выключатель на Arduino: инфракрасный датчик, реле, автоотключение
Бесконтактный выключатель — удобный проект на Arduino: махнул рукой — свет включился, махнул снова — выключился. Или включил рукой — выключился автоматически через заданное время (10 сек). Инфракрасный датчик препятствий (KY-032 или аналог) + реле 5В. Управление лампой 220В, насосом, вентилятором. Расстояние срабатывания 2–10 см, регулируется потенциометром. Простая схема, минимум деталей. Идеально для кухни, ванной, умного дома, где руки заняты или грязные. Уроки Arduino, ИК-датчик, реле, таймер, бесконтактное управление.
Зачем нужен бесконтактный выключатель
Обычный выключатель пачкается, требует нажатия, неудобен с занятыми руками. Бесконтактный: махнул рукой — свет включился, махнул снова — выключился. Или включил — выключится сам через 10 секунд (если никто не маячит). Идеально для кухни, ванной, прихожей, гаража. Управляет 220В (лампа, вентилятор) или 12–24В (насос, мотор). Расстояние 2–10 см, регулируется потенциометром. Безопасно, гигиенично, современно. Простой проект для новичков: минимум деталей, 200–500 руб.
Компоненты
- Arduino Uno/Nano
- Инфракрасный датчик препятствий (KY-032 или аналог)
- Реле модуль 5В (1 канал)
- Лампа 220В (или нагрузка)
- Резистор 10 кОм (подтяжка)
- Провода, макетная плата
- БП 5В 1А+
Подключение ИК-датчика
- VCC → 5В
- GND → GND
- OUT → D2
- Потенциометр на плате — регулировка расстояния
Реле: IN → D10, VCC → 5В, GND → GND. Нагрузка 220В через силовые контакты.
Скетч 1: вкл/выкл маханием руки
int sensorPin = 2;
int relayPin = 10;
bool state = false;
bool lastSensorState = LOW;
void setup() {
pinMode(sensorPin, INPUT);
pinMode(relayPin, OUTPUT);
}
void loop() {
bool sensorState = digitalRead(sensorPin);
// проверка фронта сигнала (LOW -> HIGH)
if (sensorState == HIGH && lastSensorState == LOW) {
state = !state;
digitalWrite(relayPin, state);
delay(50); // debounce
}
lastSensorState = sensorState;
}
Скетч 2: автоотключение через 10 сек
int sensorPin = 2;
int relayPin = 10;
unsigned long lastTrigger = 0;
const unsigned long interval = 10000; // 10 сек
bool relayState = false;
void setup() {
pinMode(sensorPin, INPUT);
pinMode(relayPin, OUTPUT);
}
void loop() {
static bool lastSensorState = LOW;
bool sensorState = digitalRead(sensorPin);
// срабатывание только при фронте сигнала
if (sensorState == HIGH && lastSensorState == LOW) {
digitalWrite(relayPin, HIGH);
relayState = true;
lastTrigger = millis();
}
// выключение реле через интервал
if (relayState && (millis() - lastTrigger >= interval)) {
digitalWrite(relayPin, LOW);
relayState = false;
}
lastSensorState = sensorState;
}
Настройка чувствительности
Потенциометр на датчике: поворачивать плавно. 2–10 см — стабильный диапазон. Больше — ложные срабатывания. Тестировать хлопком или рукой.
Расширение
Двойной хлопок. Wi-Fi ESP8266 + Blynk. OpenHAB MQTT. Таймер с кнопкой. Датчик движения PIR. RGB-подсветка. Уведомления Telegram.
Заключение
Бесконтактный выключатель — гигиеничный и удобный проект. ИК-датчик + Arduino + реле. Вкл/выкл маханием или автоотключение. Просто, дёшево, эффектно. Умный дом своими руками.
FAQ — Бесконтактный выключатель Arduino
Датчик не срабатывает?
Проверьте OUT → D2. Потенциометр чувствительности. Расстояние 2–10 см. Питание 5В стабильное.
Реле не включается?
IN → D10. Реле 5В. Нагрузка 220В через силовые контакты. digitalWrite(HIGH).
Ложные срабатывания?
Уменьшить чувствительность. Debounce 500 мс. Экранирование проводов.
Автоотключение не работает?
millis() — lastTrigger >= interval. lastTrigger обновляется при сигнале.
Wi-Fi управление?
ESP8266 + WebServer/Blynk. Махнул рукой → веб-уведомление.
OpenHAB интеграция?
ESP8266 + MQTT. Топики /switch. Items Switch. Правила по таймеру.
Датчик движения вместо ИК?
PIR HC-SR501. Больше расстояние, но хуже точность.