FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
Компоненты и материалы
- Arduino 101 (или Uno) — 1 шт.
- Ультразвуковой датчик расстояния HC-SR04 — 1 шт.
- IR-светодиод (передатчик) — 1 шт.
- Резистор 220 Ом для IR-светодиода — 1 шт.
- RGB-светодиод (общий катод) — 1 шт. (индикация)
- Макетная плата и провода — 1 компл.
Программное обеспечение
- Arduino IDE
- Библиотека
IRremote(Ken Shirriff)
О проекте
Устройство управляет телевизором (или другой техникой) жестами руки над ультразвуковым датчиком. Не нужно искать кнопки на пульте — удобно для пожилых и людей с ограниченными возможностями.
Принцип работы
HC-SR04 измеряет расстояние до руки. Жесты распознаются по расстоянию и типу движения (свайп/удержание):
- Свайп высоко (>10 дюймов / 25 см) — Канал +
- Свайп низко (<10 дюймов, но >3 дюймов) — Канал –
- Удержание высоко — Громкость +
- Удержание низко — Громкость –
- Прикрытие датчика (<3 дюймов / 7.5 см) — Вкл/Выкл (двойной свайп за 5 сек для подтверждения)
RGB-светодиод индицирует режим: красный — питание, зелёный — канал, синий — громкость.
Схема подключения
- IR LED: анод через 220 Ом → Pin 3 (фиксирован в библиотеке IRremote), катод → GND.
- HC-SR04: VCC→5V, GND→GND, Trig→Pin 8, Echo→Pin 7.
- RGB LED: общий катод → GND, R→Pin 11, G→Pin 10, B→Pin 9 (PWM).
Код (C/C++)
#include <IRremote.h>
#define CONTROL_CH 1
#define CONTROL_VOL 2
#define CONTROL_POW 3
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20
#define DIST_DOWN 10
#define DIST_POW 3
const int irPin = 3;
const int pingPin = 8;
const int echoPin = 7;
const int led = 13;
const int ledR = 11, ledG = 10, ledB = 9;
unsigned long timer = 0;
IRsend irsend;
boolean powerConfirmed = false;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(ledR, OUTPUT); pinMode(ledG, OUTPUT); pinMode(ledB, OUTPUT);
pinMode(pingPin, OUTPUT); pinMode(echoPin, INPUT);
}
void loop() {
long duration = doPing();
long inches = microsecondsToInches(duration);
if (timer && timer < (millis() - 5000) && (millis() > 5000)) {
timer = 0;
}
digitalWrite(led, LOW);
setColor(0,0,0);
if (inches < DIST_MAX) {
Serial.print(inches); Serial.println("in");
if (inches < DIST_POW) {
if (timer) {
doIR(CONTROL_POW, 0);
timer = 0;
delay(2000);
} else {
timer = millis();
setColor(255,50,50); delay(500);
}
} else {
int value = handleDist(inches);
delay(300);
if (microsecondsToInches(doPing()) > DIST_MAX) {
doIR(CONTROL_CH, value); // свайп
} else {
int d = 500;
while (inches < DIST_MAX) {
value = handleDist(inches);
doIR(CONTROL_VOL, value);
delay(d);
inches = microsecondsToInches(doPing());
d = 100;
}
delay(500);
}
}
}
delay(50);
}
int handleDist(int inches) {
if (inches > DIST_DOWN) { digitalWrite(led, HIGH); return CONTROL_UP; }
else { digitalWrite(led, LOW); return CONTROL_DOWN; }
}
void doIR(int control, int val) {
switch(control) {
case CONTROL_POW:
for (int i=0;i<3;i++) { setColor(255,0,0); irsend.sendSony(0xa90,12); delay(40); }
break;
case CONTROL_CH:
setColor(0,255,0);
if (val == CONTROL_UP) {
digitalWrite(led,HIGH);
for (int i=0;i<3;i++) { irsend.sendSony(0x90,12); delay(40); }
} else {
for (int i=0;i<3;i++) { irsend.sendSony(0x890,12); delay(40); }
}
break;
case CONTROL_VOL:
setColor(0,0,255);
if (val == CONTROL_UP) {
digitalWrite(led,HIGH);
for (int i=0;i<3;i++) { irsend.sendSony(0x490,12); delay(40); }
} else {
for (int i=0;i<3;i++) { irsend.sendSony(0xC90,12); delay(40); }
}
break;
}
}
void setColor(int r,int g,int b) {
analogWrite(ledR,r); analogWrite(ledG,g); analogWrite(ledB,b);
}
long doPing() {
digitalWrite(pingPin,LOW); delayMicroseconds(2);
digitalWrite(pingPin,HIGH); delayMicroseconds(5);
digitalWrite(pingPin,LOW);
return pulseIn(echoPin,HIGH);
}
long microsecondsToInches(long us) { return us / 74 / 2; }
long microsecondsToCentimeters(long us) { return us / 29 / 2; }
Схемы
Схема в Fritzing (flickmote_9Gx3XNFHEp.fzz) и фото собранной платы в оригинале.
Производственный процесс
- Создание ультразвукового левитатора на Arduino: пошаговое руководство
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Своё рулевое управление (джойстик) для игр на Arduino
- Компактный радар на Arduino Nano с HC-SR04 и дисплеем 1.8"