Stap 3: De schets
De volgende code moet worden geüpload naar de Arduino./ * Jat afstandsbediening
Deze sketch een ultrasone afstandsmeter gebruikt om te bepalen van de gebruiker gebaar en uitgangen een IR-signaal op een sony TV op basis van de opdracht gegeven.
-Hoge uithaal (> 10 inch) = kanaal omhoog
-Lage vegen = omlaag
-Hoog houden (> 10 inch) = Volume omhoog
-Laag houden = Volume omlaag
-Dekking van de sensor (< 3 inch) = Turn On / Off
Gemaakt door Dan Nicholson.
Deze voorbeeldcode is in het publieke domein.
Deze code gebruikt de IRremote bibliotheek (https://github.com/shirriff/Arduino-IRremote)
*/
#include < IRremote.h >
Definieert voor besturingsfuncties
#define CONTROL_CH 1 / / kanaal wijzigen
#define CONTROL_VOL 2 / / Volume
#define CONTROL_POW 3 / / Power
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20 / / maximale afstand in inches en om het even wat hierboven wordt genegeerd.
#define DIST_DOWN 10 / / drempel voor omhoog/omlaag opdrachten. Als hoger, is de opdracht "up". Indien deze lager is, "down".
#define DIST_POW 3 / / drempel voor macht opdracht, lager dan macht = aan/uit
IR-PIN
Const int irPin = 3; Dit is gedefinieerd in de bibliotheek, deze var is enkel een herinnering. DIT ZAL NIET WIJZIGT, WORDT PIN IN BIBLIOTHEEK
2 pin Ping Sensor
Const int pingPin = 8;
Const int echoPin = 7;
Bevestiging LED Pins
Const int geleid = 13; interne LED voor omhoog/omlaag foutopsporing
Const int ledR = 11;
Const int ledG = 10;
Const int ledB = 9;
LED op timer
niet-ondertekende lange timer;
IR zender object
IRsend irsend;
Macht bevestiging vlag (moet twee jat signaal)
Boole powerConfirmed = false;
VOID Setup {}
initialiseren van seriële communicatie en pennen te stellen
Serial.begin(9600);
pinMode led (, uitvoer);
pinMode (ledR, OUTPUT);
pinMode (ledG, OUTPUT);
pinMode (ledB, OUTPUT);
pinMode (pingPin, OUTPUT);
pinMode (echoPin, INPUT);
timer = millis();
}
void loop
{
Serial.println(Millis());
lange duur, duim;
int waarde;
Selectievakje voor een lezing
duur = doPing();
Timer om te bevestigen van acties (momenteel alleen kracht)
Als (timer & & timer < (millis() - 5000) & & (millis() > 5000))
{
Serial.println ("timer reset");
timer = false;
}
digitalWrite (led, laag);
setColor (0, 0, 0); uitschakelen
de tijd omzetten in een afstand
duim = microsecondsToInches(duration);
Als minder dan max inch weg, handelen
Als (inch < DIST_MAX)
{
Debug output
Serial.Print(inches);
Serial.println("in");
Als heel dichtbij, is het een "power"-signaal
Als (inch < DIST_POW)
{
Serial.println(timer);
in- of uitschakelen
Als (timer)
{
doIR (CONTROL_POW, 0);
timer = false;
delay(2000); wil niet te worden het versturen van deze meer dan eens. 2 seconden vertraging
}
anders
{
Serial.println ("vlag machtsverzameling");
timer = millis();
setColor(255,50,50);
delay(500);
}
}
anders / / is volume of kanaal
{
Afstand bepaalt de richting van de controle
waarde = handleDist(inches);
een halve seconde wachten
delay(300);
Controleer nogmaals, hand verdwenen?
Als (microsecondsToInches(doPing()) > DIST_MAX)
{
doIR (CONTROL_CH, waarde); swipe
}
anders
{
volume
int d = 500; eerste vertraging is langer voor één volume wijzigen
Herhaal totdat hand is verwijderd
terwijl (inch < DIST_MAX)
{
waarde = handleDist(inches); is omhoog of omlaag?
doIR (CONTROL_VOL, waarde); vuur af IR signaal
delay(d); wachten
duim = microsecondsToInches(doPing()); selectievakje voor hand weer
d = 100; vertragingen zijn korter voor snelle meerdere volumeaanpassing
}
delay(500); Dit stopt per ongeluk kanaal wijzigen na volumeaanpassing
}
}
}
delay(50); Kort genoeg om op te sporen alle jat.
}
/*
* Als afstand binnen drempel, markeren als 'tot' en bijbehorende LED inschakelen.
*/
int handleDist (int inch)
{
Als (inch > DIST_DOWN)
{
digitalWrite (led, hoog);
Return CONTROL_UP;
}
anders
{
digitalWrite (led, laag);
Return CONTROL_DOWN;
}
}
/*
* Vuur af de juiste IR-code
*/
VOID doIR (int control, int val)
{
switch(Control)
{
Case CONTROL_POW:
macht
Serial.println ("power on/off 0xa90");
for (int i = 0; ik < 3; i ++)
{
setColor (255, 0, 0);
irsend.sendSony (0xa90, 12); Sony TV power code
delay(40);
}
breken;
Case CONTROL_CH:
setColor (0, 0, 255);
uitvoer 'kanaal up / down' afhankelijk van de val
Als (val == CONTROL_UP)
{
digitalWrite (led, hoog);
for (int i = 0; ik < 3; i ++)
{
irsend.sendSony(0x90, 12);
delay(40);
}
Serial.println ("kanaal omhoog 0xD00A");
}
anders / / omlaag
{
for (int i = 0; ik < 3; i ++)
{
irsend.sendSony (0x890, 12);
delay(40);
}
Serial.println ("kanaal naar beneden 0x3002");
}
breken;
Case CONTROL_VOL:
setColor (0, 0, 255);
uitvoer 'volume omhoog / omlaag' afhankelijk van de val
Als (val == CONTROL_UP)
{
digitalWrite (led, hoog);
for (int i = 0; ik < 3; i ++)
{
irsend.sendSony (0x490, 12);
delay(40);
}
Serial.println ("volume omhoog 0x490");
}
anders //down
{
for (int i = 0; ik < 3; i ++)
{
irsend.sendSony (0xC90, 12);
delay(40);
}
Serial.println ("volume omlaag 0xC90");
}
breken;
}
}
VOID setColor (int rood, int groene, blauwe int)
{
analogWrite (ledR, rood);
analogWrite (ledG, groene);
analogWrite (ledB, blauw);
}
lange doPing()
{
digitalWrite (pingPin, laag);
delayMicroseconds(2);
digitalWrite (pingPin, hoge);
delayMicroseconds(5);
digitalWrite (pingPin, laag);
keren pulseIn (echoPin, hoge);
}
lange microsecondsToInches(long microseconds)
{
Volgens de Parallax gegevensblad voor de PING))), er zijn
73.746 microseconden per inch (dwz geluid reist aan 1130 voeten per
seconde). Dit geeft de afstand die is afgelegd door de ping, uitgaande
en terug te keren, zodat wij door 2 delen te krijgen van de afstand van het obstakel.
Zie: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
retourneren van microseconden / 74 / 2;
}
lange microsecondsToCentimeters(long microseconds)
{
De snelheid van het geluid is 340 m/s of 29 microseconden per vierkante centimeter.
De ping reist uit en terug, zo vind je de afstand van de
we de helft van de afgelegde afstand nemen-object.
retourneren van microseconden / 29 / 2;
}