Paso 3: El bosquejo
El código siguiente debe cargarse en el Arduino./ * Pasar a Control remoto
Este esbozo un telémetro ultrasónico utiliza para determinar los gestos del usuario y salidas de una señal de IR a un televisor de sony basada en el mandato dado.
-Golpe alta (> 10 in) = canal
-Golpe bajo = canal
-Sostener alta (> 10 in) = subir volumen
-Mantenga = bajar volumen
-Sensor (< 3 in) de la cubierta = vuelta con. / desc.
Creado por Dan Nicholson.
Este ejemplo de código es de dominio público.
Este código utiliza la librería IRremote (https://github.com/shirriff/Arduino-IRremote)
*/
#include < IRremote.h >
Define las funciones de control
#define CONTROL_CH 1 / / cambio de canal
#define CONTROL_VOL 2 / / volumen
#define CONTROL_POW 3 / energía
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20 / / distancia máxima en pulgadas, todo lo anterior es ignorado.
#define DIST_DOWN 10 / / umbral para arriba/abajo comandos. Si es mayor, el comando es "arriba". Si baja, "down".
#define DIST_POW 3 / / umbral de comando de potencia, inferiores a = potencia de encendido/apagado
PIN DE IR
const int Irpín = 3; Esto se define en la biblioteca, esta var es sólo un recordatorio. CAMBIAR ESTO NO VA A CAMBIAR PIN EN LA BIBLIOTECA
2 pin Sensor Ping
const int pingPin = 8;
const echoPin int = 7;
Pasadores LED de confirmación
const int led = 13; LED interior para arriba/abajo de depuración
const int ledR = 11;
const int ledG = 10;
const int ledB = 9;
LED cronómetro
contador de tiempo largo sin firmar;
Objeto de transmisor IR
Irsend de IRsend;
Bandera de confirmación de poder (necesita dos golpes fuertes para enviar la señal)
Boolean powerConfirmed = false;
void setup() {}
inicializar la comunicación serial y ajustar pernos
Serial.Begin(9600);
pinMode (led, salida);
pinMode (ledR, salida);
pinMode (ledG, salida);
pinMode (ledB, salida);
pinMode (pingPin, salida);
pinMode (echoPin, entrada);
temporizador = millis();
}
void loop()
{
Serial.println(Millis());
larga duración, pulgadas;
int valor;
Busque una lectura
duración = doPing();
Temporizador para confirmar acciones (actualmente, sólo energía)
Si (contador de tiempo & & contador < (millis() - 5000) & & (millis() > 5000))
{
Serial.println ("reset timer");
temporizador = false;
}
digitalWrite (led, baja);
Colores (0, 0, 0); de
convertir el tiempo en una distancia
pulgadas = microsecondsToInches(duration);
Si pulgadas menos de máxima, actuar
Si (pulgadas < DIST_MAX)
{
Salida de depuración
Serial.Print(inches);
Serial.println("in");
Si muy cerca, es una señal de "poder"
Si (pulgadas < DIST_POW)
{
Serial.println(TIMER);
activar o desactivar
Si (contador)
{
doIR (CONTROL_POW, 0);
temporizador = false;
Delay(2000); no quiere esto enviando más de una vez. retardo de 2 segundos
}
otra cosa
{
Serial.println ("poder establecido");
temporizador = millis();
setColor(255,50,50);
Delay(500);
}
}
Else / / es volumen o canal
{
Distancia determina la dirección de control
valor = handleDist(inches);
esperar medio segundo
Delay(300);
¿Compruebe una vez más, mano desaparecida?
Si (microsecondsToInches(doPing()) > DIST_MAX)
{
doIR (CONTROL_CH, valor); golpe fuerte
}
otra cosa
{
volumen
int d = 500; primera demora es más larga para el cambio de volumen
repetir hasta que se quite la mano
mientras que (pulgadas < DIST_MAX)
{
valor = handleDist(inches); ¿es hacia arriba o hacia abajo?
doIR (CONTROL_VOL, valor); disparar la señal de infrarrojos
Delay(d); esperar
pulgadas = microsecondsToInches(doPing()); Compruebe otra vez la mano
d = 100; retrasos son más cortos para múltiples rápido ajuste del volumen
}
Delay(500); Esto detiene el cambio accidental de la canal después de ajuste de volumen
}
}
}
Delay(50); Corto lo suficiente para detectar todos los golpes.
}
/*
* Si la distancia es de umbral, marcar como 'up' y encienda el LED correspondiente.
*/
int handleDist (int pulgadas)
{
Si (pulgadas > DIST_DOWN)
{
digitalWrite (led, alto);
volver CONTROL_UP;
}
otra cosa
{
digitalWrite (led, baja);
volver CONTROL_DOWN;
}
}
/*
* Disparar código correcto IR
*/
doIR vacío (control de int, int val)
{
Switch(control)
{
caso CONTROL_POW:
energía
Serial.println ("power on/off 0xa90");
para (int i = 0; i < 3; i ++)
{
Colores (255, 0, 0);
irsend.sendSony (0xa90, 12); Código de poder de TV SONY
Delay(40);
}
rotura;
caso CONTROL_CH:
Colores (0, 255, 0);
salida de 'canal arriba / abajo' según val
Si (val == CONTROL_UP)
{
digitalWrite (led, alto);
para (int i = 0; i < 3; i ++)
{
irsend.sendSony(0x90, 12);
Delay(40);
}
Serial.println ("canal por 0xD00A");
}
Else / / abajo
{
para (int i = 0; i < 3; i ++)
{
irsend.sendSony (0x890, 12);
Delay(40);
}
Serial.println ("canal abajo 0x3002");
}
rotura;
caso CONTROL_VOL:
Colores (0, 0, 255);
salida 'volumen arriba / abajo' según val
Si (val == CONTROL_UP)
{
digitalWrite (led, alto);
para (int i = 0; i < 3; i ++)
{
irsend.sendSony (0x490, 12);
Delay(40);
}
Serial.println ("volumen 0x490");
}
//down más
{
para (int i = 0; i < 3; i ++)
{
irsend.sendSony (0xC90, 12);
Delay(40);
}
Serial.println ("volumen abajo 0xC90");
}
rotura;
}
}
void colores (int rojo, int verde, int azul)
{
analogWrite (ledR, rojo);
analogWrite (ledG, verde);
analogWrite (ledB, azul);
}
doPing() largo
{
digitalWrite (pingPin, LOW);
delayMicroseconds(2);
digitalWrite (pingPin, HIGH);
delayMicroseconds(5);
digitalWrite (pingPin, LOW);
volver pulseIn (echoPin, HIGH);
}
microsecondsToInches(long microseconds) largo
{
Según ficha técnica de paralaje para el PING))), hay
73,746 microsegundos por pulgada (es decir, el sonido viaja a 1130 pies por
en segundo lugar). Esto da la distancia recorrida por el ping, saliente
y, por lo que dividimos por 2 para obtener la distancia del obstáculo.
Ver: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
volver microsegundos / 74 / 2;
}
microsecondsToCentimeters(long microseconds) largo
{
La velocidad del sonido es 340 m/s o 29 microsegundos por centímetro.
El ping viaja hacia fuera y hacia atrás, para encontrar la distancia de la
objeto que tomamos la mitad de la distancia recorrida.
volver microsegundos / 29 / 2;
}