FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
Onderdelen en benodigdheden
- Ultrasonische sensor HC-SR04 (1×)
- IR-zender (IR-LED, 1×)
- RGB LED gemeenschappelijke kathode (1×)
- Arduino 101 (of Uno) (1×)
- Weerstand 220 Ω voor IR-LED (1×)
- Breadboard en draden
Apps en online services
- Arduino IDE
Over dit project

Inleiding
Standaard IR-afstandsbedieningen vereisen dat je naar de knoppen kijkt. FlickMote gebruikt handgebaren gedetecteerd met een ultrasonische sensor om IR-commando's uit te sturen – ideaal voor ouderen, blinden of fysiek beperkten.
Hoe het werkt
De HC-SR04 meet de afstand naar de hand. Gebaren worden vertaald naar IR-codes (Sony TV-protocol in de voorbeeldcode):
- Hoge swipe (> 10 inch / ~25 cm): Kanaal omhoog
- Lage swipe (< 10 inch): Kanaal omlaag
- Hoge vasthouden (> 10 inch): Volume omhoog
- Lage vasthouden: Volume omlaag
- Sensor bedekken (< 3 inch / ~7,5 cm): Aan/uit (bevestiging via tweede swipe binnen 5 s)
Afstanden zijn in de code aanpasbaar.
Constructie
- IR-LED aan pin 3 via 220 Ω weerstand, kathode naar GND.
- HC-SR04: VCC → 5V, GND → GND, Trig → pin 8, Echo → pin 7.
- RGB LED: GND → GND, Rood → pin 11, Groen → pin 10, Blauw → pin 9.

Bediening
Standby / Aan-Uit
Swipen binnen 3 inch → RGB LED knippert paars. Tweede swipe binnen 5 s bevestigt → IR aan/uit code verstuurd.
Kanaal
Swipen 3–10 inch → kanaal -. Swipen 10–20 inch → kanaal +.
Volume
Vasthouden 3–10 inch → volume -. Vasthouden 10–20 inch → volume +. Blijft doorgaan tot hand verwijderd.
Voordelen & verbeteringen
- Geen zoeken naar knoppen; intuïtieve gebaren.
- Toegankelijk voor blinden en motorisch beperkten.
- Uitbreidbaar naar alle IR-apparaten in huis.
Code
Volledige sketch (vereist IRremote bibliotheek):
/* Swipe Remote Control
Ultrasonische gebaren → IR commando's (Sony TV)
- Hoge swipe (>10in) = Kanaal +
- Lage swipe = Kanaal -
- Hoge vasthouden = Volume +
- Lage vasthouden = Volume -
- Sensor bedekken (<3in) = Aan/Uit (dubbele swipe)
Door Vignesh Jaishankar
Gebruikt IRremote library: https://github.com/shirriff/Arduino-IRremote
*/
#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; // vast in IRremote library
const int pingPin = 8;
const int echoPin = 7;
const int led = 13;
const int ledR = 11;
const int ledG = 10;
const int 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);
timer = millis();
}
void loop() {
long duration = doPing();
if (timer && timer < (millis() - 5000) && (millis() > 5000)) {
Serial.println("timer reset");
timer = 0;
}
digitalWrite(led, LOW);
setColor(0, 0, 0);
long inches = microsecondsToInches(duration);
if (inches < DIST_MAX) {
Serial.print(inches); Serial.println("in");
if (inches < DIST_POW) {
Serial.println(timer);
if (timer) {
doIR(CONTROL_POW, 0);
timer = 0;
delay(2000);
} else {
Serial.println("power flag set");
timer = millis();
setColor(255, 50, 50);
delay(500);
}
} else {
int value = handleDist(inches);
delay(300);
if (microsecondsToInches(doPing()) > DIST_MAX) {
doIR(CONTROL_CH, value); // swipe
} 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:
Serial.println("power on/off 0xa90");
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);
}
Serial.println("channel up 0xD00A");
} else {
for (int i = 0; i < 3; i++) {
irsend.sendSony(0x890, 12);
delay(40);
}
Serial.println("channel down 0x3002");
}
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);
}
Serial.println("volume up 0x490");
} else {
for (int i = 0; i < 3; i++) {
irsend.sendSony(0xC90, 12);
delay(40);
}
Serial.println("volume down 0xC90");
}
break;
}
}
void setColor(int red, int green, int blue) {
analogWrite(ledR, red);
analogWrite(ledG, green);
analogWrite(ledB, blue);
}
long doPing() {
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
return pulseIn(echoPin, HIGH);
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}
long microsecondsToCentimeters(long microseconds) {
return microseconds / 29 / 2;
}
Schema's

Fritzing-bestand: flickmote_9Gx3XNFHEp.fzz
Productieproces
- Bouw een Ultrasonische Zweefapparaat met Arduino – Stap-voor-stap Handleiding
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
- Arduino Boter-Kaas-Eieren met MAX7219 LED Matrix en Kartonnen Behuizing
- Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
- Bouw een Aangepaste Arduino Joystick Stuurwiel voor Gaming
- Compact Arduino Radarsysteem met HC-SR04 Ultrasonische Sensor & 1.8" Display
- Bouw een Volledig Functionele CNC-machine met Arduino Nano R3