FlickMote (6 / 6 steg)

Steg 6: kod

/ * 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 = Channel Down - hög håll (> 10 i) = volym upp - låg Håll = Volym ned - Cover sensor (< 3 in) = slå på / av

Skapad av Gustaf Emil

Denna kod använder IRremote biblioteket (https://github.com/shirriff/Arduino-IRremote)

* / #include

Definierar för standardstyruppgifter #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 kommer inte ändra PIN i bibliotek / / 2 Pin Ping Sensor const int pingPin = 8; CONST int echoPin = 7. Bekräftelse LED stift const int ledde = 13. inre LED för upp/ner 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) boolean 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;

När på en läsning 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 output Serial.print(inches); Serial.println("in"); Om mycket nära, är det en "power" signal om (inches < DIST_POW) {Serial.println(timer); / / aktivera eller inaktivera om (timer) {doIR (CONTROL_POW, 0); timer = false; delay(2000); / / inte vill skicka detta mer än en gång. 2 sekunders fördröjning} annat {Serial.println ("power flagga set"), timer = millis(); setColor(255,50,50); delay(500);}} annat / / är volym eller kanal {/ / avstånd avgör riktningen värde = handleDist(inches); / / vänta halva en andra delay(300); / / kolla igen , har sidan försvunnit? om (microsecondsToInches(doPing()) > DIST_MAX) {doIR (CONTROL_CH, värde); / / svepa} annat {/ / volym int d = 500; / / första dröjsmål är längre för enda volymförändring / / repeat tills hand tas bort medan (inches < DIST_MAX) {värde = handleDist(inches); / / är upp eller ner? doIR (CONTROL_VOL, värde); / / avfyra IR signal delay(d); / / wait inches = microsecondsToInches(doPing()); / / utcheckning 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}}} fördröja () 50); Kort nog att upptäcka alla swipes. } / * * Om avståndet är inom tröskel, markera som "upp" och slå på motsvarande LED. * / int handleDist (int inches) {om (inches > DIST_DOWN) {digitalWrite (ledde, hög), återvända CONTROL_UP;} annat {digitalWrite (ledde, låg); return CONTROL_DOWN;}}

/ * * Avfyra rätt IR-kod * / annullera 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; CONTROL_CH i mål: setColor (0, 255, 0); / / output "kanal upp / ner" beroende på val om (val == CONTROL_UP) {digitalWrite (ledde HÖG); 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); utgången "volym upp / ner" beroende på val om (val == CONTROL_UP) {digitalWrite (ledde, hög), 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); return pulseIn (echoPin, hög);}

långa microsecondsToInches (lång mikrosekunder) {återvända mikrosekunder / 74 / 2;}

långa microsecondsToCentimeters (lång mikrosekunder) {återvända mikrosekunder / 29 / 2;

Se Steg
Relaterade Ämnen