Ultrasonic gest baserad TV-fjärrkontrollen (3 / 4 steg)
Steg 3: Skiss
Följande kod bör överföras till Arduino./ * Svepa fjärrkontroll
Denna skiss använder en Ultraljuds avståndsmätare för att fastställa användarens gest och utgångar en IR-signal till en sony TV baserat på kommandot ges.
-Hög känga (> 10 i) = kanal upp
-Låg känga = kanal ner
-Hög håll (> 10 i) = volym upp
-Låg Håll = Volym ned
-Täcka sensor (< 3 in) = slå på / av
Skapad av Dan Nicholson.
Denna exempelkod är offentlig.
Denna kod använder IRremote biblioteket (https://github.com/shirriff/Arduino-IRremote)
*/
#include < IRremote.h >
Definierar för kontrollfunktioner
#define CONTROL_CH 1 / / kanal förändring
#define CONTROL_VOL 2 / / volym
#define CONTROL_POW 3 / / Power
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20 / / maximalt avstånd i tum, allt över ignoreras.
#define DIST_DOWN 10 / / tröskel för upp/ner kommandon. Om högre, är kommandot "up". Om den är lägre, "nedåt".
#define DIST_POW 3 / / tröskel för power kommando, lägre än = ström på/av
IR-PIN
CONST int irPin = 3; detta definieras i biblioteket, detta var är bara en påminnelse. ÄNDRA DETTA INTE ÄNDRAR PIN-BIBLIOTEK
2 stift Ping Sensor
CONST int pingPin = 8;
CONST int echoPin = 7.
Bekräftelse LED stift
CONST int ledde = 13. inre LED för upp/felsökning
CONST int ledR = 11;
CONST int resk.trans.buff = 10;
CONST int ledB = 9.
LED på timer
osignerade långa timer;
IR sändare objekt
IRsend irsend;
Power bekräftelse flagga (behöver två swipes skicka signal)
booleska powerConfirmed = false;
void setup() {
initiera seriell kommunikation och ange stift
Serial.BEGIN(9600);
pinMode ledde (, OUTPUT);
pinMode (ledR, produktionen);
pinMode (resk.trans.buff, produktionen);
pinMode (ledB, produktionen);
pinMode (pingPin, produktionen);
pinMode (echoPin, ingång);
timer = millis();
}
void loop()
{
Serial.println(Millis());
lång varaktighet, inches;
int värde;
Check för en behandling
längd = doPing();
Timer för att bekräfta åtgärder (för närvarande endast power)
om (timer & & timer < (millis() - 5000) & & (millis() > 5000))
{
Serial.println ("timer reset");
timer = false;
}
digitalWrite (ledde, låg);
setColor (0, 0, 0); utanför
konvertera tiden till ett avstånd
tum = microsecondsToInches(duration);
Om mindre än max inches bort, agerar
om (inches < DIST_MAX)
{
Debug utmatning
Serial.Print(inches);
Serial.println("in");
Om mycket nära, är det en "power"-signal
om (inches < DIST_POW)
{
Serial.println(timer);
på eller av
om (timer)
{
doIR (CONTROL_POW, 0);
timer = false;
Delay(2000); vill du inte att skicka detta mer än en gång. 2 sekunders fördröjning
}
annat
{
Serial.println ("power flagga uppsättning");
timer = millis();
setColor(255,50,50);
Delay(500);
}
}
annat / / är volym eller kanal
{
Avståndet avgör styra riktning
värde = handleDist(inches);
vänta en halv sekund
Delay(300);
Kolla igen, har sidan försvunnit?
om (microsecondsToInches(doPing()) > DIST_MAX)
{
doIR (CONTROL_CH, värde); känga
}
annat
{
volym
int d = 500. första dröjsmål är längre för enda volymförändring
Upprepa tills hand tas bort
medan (inches < DIST_MAX)
{
värde = handleDist(inches); är upp eller ner?
doIR (CONTROL_VOL, värde); avfyra IR-signalen
Delay(d); Vänta
tum = microsecondsToInches(doPing()); check för hand igen
d = 100; förseningar är kortare för snabb flera volymjustering
}
Delay(500); Detta stoppar oavsiktlig kanal förändring efter volymjustering
}
}
}
Delay(50); Kort nog att upptäcka alla swipes.
}
/*
* Om avståndet är inom tröskel, markera som "upp" och aktivera motsvarande LED.
*/
int handleDist (int inches)
{
om (tum > DIST_DOWN)
{
digitalWrite (ledde, högt);
återvända CONTROL_UP;
}
annat
{
digitalWrite (ledde, låg);
återvända CONTROL_DOWN;
}
}
/*
* Avfyra rätt IR-kod
*/
void doIR (int kontroll, int val)
{
Switch(Control)
{
fall CONTROL_POW:
Power
Serial.println ("power on/off 0xa90");
för (int jag = 0; jag < 3; i ++)
{
setColor (255, 0, 0);
irsend.sendSony (0xa90, 12); Sony TV power kod
Delay(40);
}
bryta;
fall CONTROL_CH:
setColor (0, 255, 0);
output "kanal upp / ner" beroende på val
om (val == CONTROL_UP)
{
digitalWrite (ledde, högt);
för (int jag = 0; jag < 3; i ++)
{
irsend.sendSony(0x90, 12);
Delay(40);
}
Serial.println ("kanal upp 0xD00A");
}
annat / / ner
{
för (int jag = 0; jag < 3; i ++)
{
irsend.sendSony (0x890, 12);
Delay(40);
}
Serial.println ("kanal ner 0x3002");
}
bryta;
fall CONTROL_VOL:
setColor (0, 0, 255);
output "volym upp / ner" beroende på val
om (val == CONTROL_UP)
{
digitalWrite (ledde, högt);
för (int jag = 0; jag < 3; i ++)
{
irsend.sendSony (0x490, 12);
Delay(40);
}
Serial.println ("volym upp 0x490");
}
annat //down
{
för (int jag = 0; jag < 3; i ++)
{
irsend.sendSony (0xC90, 12);
Delay(40);
}
Serial.println ("volym ner 0xC90");
}
bryta;
}
}
void setColor (int rött, int grön, int blå)
{
analogWrite (ledR, röd);
analogWrite (resk.trans.buff, grön);
analogWrite (ledB, blå);
}
lång doPing()
{
digitalWrite (pingPin, låg);
delayMicroseconds(2);
digitalWrite (pingPin, hög);
delayMicroseconds(5);
digitalWrite (pingPin, låg);
återgå pulseIn (echoPin, hög);
}
lång microsecondsToInches(long microseconds)
{
Enligt Parallaxs datablad för PING))), det finns
73.746 mikrosekunder per tum (dvs. ljud resor på 1130 fot per
det andra). Detta ger vägsträcka som ping, utgående
och tillbaka, så vi delar med 2 att få distansera av hindret.
Se: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
återvända mikrosekunder / 74 / 2;
}
lång microsecondsToCentimeters(long microseconds)
{
Ljudets hastighet är 340 m/s eller 29 mikrosekunder per centimeter.
Ping reser ut och tillbaka, så för att hitta distansera av den
objekt vi tar hälften av den tillryggalagda.
återvända mikrosekunder / 29 / 2;
}