FlickMote: Mando IR por gestos para Smart Home
Componentes y suministros
- Sensor ultrasónico HC‑SR04 × 1
- Emisor IR (genérico) × 1
- LED RGB difuso cátodo común × 1
- Arduino 101 × 1
Aplicaciones y servicios en línea
- Arduino IDE
Sobre el proyecto

INTRODUCCIÓN
Controlar electrodomésticos y gadgets mediante mando a distancia infrarrojo es algo común. Pero la misma tarea puede hacerse más fácilmente. El motivo principal de proponer un nuevo sistema de control remoto por gestos de mano es eliminar la necesidad de mirar el mando manual y buscar una tecla específica para cada función, especialmente para personas mayores. Este proyecto presenta un sistema novedoso para controlar electrodomésticos mediante gestos de mano como dispositivo de control remoto. El proyecto se denominará flickremote en este informe. Usa un telémetro ultrasónico para determinar el gesto del usuario y emite una señal IR, usando la placa de desarrollo Arduino 101.
COMPONENTES HARDWARE
- Arduino 101 o Uno
- Módulo ultrasónico HC‑SR04
- LED infrarrojo
- Resistencia adecuada para el LED IR (220 Ω)
- LED RGB
- Protoboard y cables
FUNCIONAMIENTO:
Este proyecto usa un telémetro ultrasónico para determinar el gesto del usuario y emite una señal IR a un televisor según el comando dado. La distancia en pulgadas puede editarse en el código según conveniencia.
- Deslizamiento alto (> 10 pulg) = Canal arriba
- Deslizamiento bajo = Canal abajo
- Mantenimiento alto (> 10 pulg) = Volumen arriba
- Mantenimiento bajo = Volumen abajo
- Cubrir sensor (< 3 pulg) = Encender / Apagar
CONSTRUCCIÓN:
- Conecta el LED IR al pin 3 a través de una resistencia adecuada, y el cátodo a GND.
- Conecta el sensor ultrasónico a 5 V y GND donde indiquen los pines. Conecta el pin trigger al pin 8 y el pin echo al 7. Estos pines son configurables en el programa.
- Conecta el LED RGB a GND y pines 11 (rojo), 10 (verde), 9 (azul). Estos pines también son configurables.

CONTROLES
Encendido/Apagado
Deslizar la mano sobre el sensor a menos de 3 pulgadas hará que el LED parpadee en morado. Esto confirma que una señal de «encender/apagar» está lista para enviarse. Para evitar apagados accidentales, el sketch espera un segundo deslizamiento dentro de 5 segundos del primero para confirmar. En ese momento se envía la señal al TV para encender/apagar.
Canal
Deslizar a menos de 10 pulgadas (pero no menos de 3) cambia el canal hacia abajo. Deslizar entre 10 y 20 pulgadas cambia el canal hacia arriba.
Volumen
Mantener la mano a menos de 10 pulgadas (pero no menos de 3) baja el volumen. Mantener entre 10 y 20 pulgadas sube el volumen. El volumen seguirá cambiando (arriba o abajo) hasta que retires la mano.
VENTAJAS Y MEJORAS:
- Elimina la necesidad de mirar el mando manual y buscar tecla específica.
- Solución para controlar gadgets (TV) para personas ciegas o con discapacidad física.
- El proyecto puede mejorarse añadiendo más funcionalidad para controlar todos los electrodomésticos del hogar con el mismo método.
GRACIAS

Código
/* Mando a distancia por gestos
Este sketch usa un telémetro ultrasónico para determinar el gesto del usuario
y emite una señal IR a un TV Sony según el comando.
- Deslizamiento alto (> 10 pulg) = Canal arriba
- Deslizamiento bajo = Canal abajo
- Mantenimiento alto (> 10 pulg) = Volumen arriba
- Mantenimiento bajo = Volumen abajo
- Cubrir sensor (< 3 pulg) = Encender / Apagar
Creado por Vignesh Jaishankar
Usa la librería IRremote (https://github.com/shirriff/Arduino-IRremote)
*/
#include <IRremote.h>
// Definiciones para funciones de control
#define CONTROL_CH 1 // Cambio canal
#define CONTROL_VOL 2 // Volumen
#define CONTROL_POW 3 // Encendido
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20 // Distancia máxima en pulgadas, superior se ignora
#define DIST_DOWN 10 // Umbral para arriba/abajo. Si mayor, comando «up», si menor «down»
#define DIST_POW 3 // Umbral para encendido, menor = power on/off
// Pin IR
const int irPin = 3; // definido en la librería, esta variable es solo recordatorio. CAMBIAR ESTO NO CAMBIA EL PIN EN LA LIBRERÍA
// Sensor de ping 2 pines
const int pingPin = 8;
const int echoPin = 7;
// Pines LED de confirmación
const int led = 13; // LED interno para depuración up/down
const int ledR = 11;
const int ledG = 10;
const int ledB = 9;
// Temporizador LED
unsigned long timer;
// Objeto transmisor IR
IRsend irsend;
// Bandera confirmación power (necesita dos deslizamientos)
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, inches;
int value;
// Lectura sensor
duration = doPing();
// Temporizador para confirmar acciones (actualmente solo power)
if (timer && timer < (millis() - 5000) && (millis() > 5000)) {
Serial.println("timer reset");
timer = false;
}
digitalWrite(led, LOW);
setColor(0, 0, 0); // apagado
// Convertir tiempo a distancia
inches = microsecondsToInches(duration);
// Si está dentro de distancia máxima, actuar
if (inches < DIST_MAX) {
// Depuración
Serial.print(inches); Serial.println("in");
// Si muy cerca, es señal «power»
if (inches < DIST_POW) {
Serial.println(timer);
if (timer) {
doIR(CONTROL_POW, 0);
timer = false;
delay(2000); // no enviar más de una vez, delay 2 seg
} else {
Serial.println("power flag set");
timer = millis();
setColor(255, 50, 50);
delay(500);
}
} else { // es volumen o canal
// Distancia determina dirección control
value = handleDist(inches);
// Espera medio segundo
delay(300);
// Comprueba de nuevo, ¿ha desaparecido la mano?
if (microsecondsToInches(doPing()) > DIST_MAX) {
doIR(CONTROL_CH, value); // deslizamiento
} else { // volumen
int d = 500; // primer delay más largo para cambio único de volumen
// Repetir hasta que se retire la mano
while (inches < DIST_MAX) {
value = handleDist(inches); // arriba o abajo?
doIR(CONTROL_VOL, value); // disparar señal IR
delay(d);
inches = microsecondsToInches(doPing()); // comprobar mano de nuevo
d = 100; // delays más cortos para ajuste rápido múltiple
}
delay(500); // evita cambio accidental de canal tras ajuste volumen
}
}
}
delay(50); // Suficientemente corto para detectar todos los deslizamientos
}
/* Si distancia dentro de umbral, marca como 'up' y enciende LED correspondiente */
int handleDist(int inches) {
if (inches > DIST_DOWN) {
digitalWrite(led, HIGH);
return CONTROL_UP;
} else {
digitalWrite(led, LOW);
return CONTROL_DOWN;
}
}
/* Dispara código IR correcto */
void doIR(int control, int val) {
switch (control) {
case CONTROL_POW: // power
Serial.println("power on / off 0xa90");
for (int i = 0; i < 3; i++) {
setColor(255, 0, 0);
irsend.sendSony(0xa90, 12); // Código power Sony TV
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;
}
Esquemáticos

flickmote_9Gx3XNFHEp.fzz
Proceso de manufactura
- Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
- Construye un Spybot controlado por Bluetooth con Arduino
- TV‑B‑Gone DIY con Arduino: Mando universal para apagar cualquier TV
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Soluciones de Alimentación Optimizadas para Proyectos Arduino
- Tres en raya con Arduino, matriz LED MAX7219 y carcasa de cartón
- Construye un Robot Cuadrúpedo Inteligente con Arduino: Guía Paso a Paso
- Construye un volante joystick personalizado con Arduino para gaming
- Sistema Radar Compacto con Arduino Nano, Sensor HC-SR04 y Pantalla 1.8"
- Construye una Máquina CNC Totalmente Funcional con Arduino Nano R3