FlickMote (6 / 6 étapes)

Étape 6: CODE

/ * Glisser télécommande

Cette esquisse utilise un télémètre à ultrasons pour déterminer le geste de l’utilisateur et fournit en sortie un signal IR à un téléviseur sony basé sur la commande donnée. -Swipe élevée (> 10 in) = Channel Up - coup bas = Channel Down - attente élevée (> 10 in) = Volume Up - cale faible = Volume Down - couverture capteur (< 3 po) = Turn On / Off

Créé par Vignesh jek

Ce code utilise la bibliothèque IRremote (https://github.com/shirriff/Arduino-IRremote)

* / #include

Définit des fonctions de commande #define CONTROL_CH 1 / / canal change #define CONTROL_VOL 2 / / Volume #define CONTROL_POW 3 / / Power

#define CONTROL_UP 1 #define CONTROL_DOWN -1

#define DIST_MAX 20 / / distance maximale en pouces, tout ce qui précède est ignoré. #define DIST_DOWN 10 / / haut/bas de seuil pour les commandes. S’il est supérieur, la commande est « up ». S’il est inférieur, « down ». #define DIST_POW 3 / / seuil pour commande de puissance inférieur = alimentation marche/arrêt

IR PIN const int irPin = 3 ; elle est définie dans la bibliothèque, cette var est juste un rappel. CHANGER ce ne sera pas changement PIN dans bibliotheque / / 2 Pin Ping capteur const int pingPin = 8 ; const int echoPin = 7 ; Confirmation LED Pins const int conduit = 13 ; une LED interne pour haut/bas débogage const int ledR = 11 ; const int ledG = 10 ; const int ledB = 9 ; LED sur unsigned long minuterie ; IR émetteur objet IRsend irsend ; Drapeau de confirmation (nécessite deux balayages pour envoyer le signal) de puissance powerConfirmed booléen = false ;

void setup() {/ / initialiser la communication sérielle et réglez de façon strictement Serial.begin(9600) ; pinMode (led, sortie); pinMode (ledR, sortie); pinMode (ledG, sortie); pinMode (ledB, sortie); pinMode (pingPin, sortie); pinMode (echoPin, INPUT); timer = millis();}

void loop() {/ / Serial.println(millis()) ; longue durée, pouces int valeur ;

Vérifiez pour une durée de lecture = doPing() ; Minuterie pour confirmer les mesures (actuellement seul pouvoir) si (minuterie & & minuterie < (millis() - 5000) & & (millis() > 5000)) {Serial.println ("reset timer"); timer = false;}

digitalWrite (led, faible) ; setColor (0, 0, 0) ; hors

convertir l’heure dans un pouce de distance = microsecondsToInches(duration) ;

Si moins de max pouces de distance, agir si (pouces < DIST_MAX) {/ / Debug output Serial.print(inches) ; Serial.println("in") ; Si très proche, c’est un signal de « pouvoir » si (pouces < DIST_POW) {Serial.println(timer); / / sur ou off si (minuterie) {doIR (CONTROL_POW, 0); minuterie = false ; delay(2000); / / ne veux pas envoyer ceci plus de délai de 2 secondes en une fois.} d’autre {Serial.println ("puissance indicateur défini"); timer = millis() ; setColor(255,50,50) ; delay(500);}} d’autre / / volume ou canal {/ / Distance détermine la valeur de contrôle direction = handleDist(inches); / / attendre la moitié d’un deuxième delay(300); / / vérifier encore une fois , main disparue ? Si (microsecondsToInches(doPing()) > DIST_MAX) {doIR (CONTROL_CH, valeur); / / glisser} d’autre {/ / volume int d = 500; / / premier retard est plus longue pour le changement de volume unique / / répéter jusqu'à ce que la main est supprimé tandis que (pouces < DIST_MAX) {valeur = handleDist(inches); / / est vers le haut ou vers le bas? doIR (CONTROL_VOL, valeur); / / déclencher delay(d) de signal IR; / / attendre pouces = microsecondsToInches(doPing()); / / check pour main encore d = 100; / / retards sont plus courtes pour multiple rapide réglage du volume} delay(500); / / Ceci empêche le changement de canal accidentel après réglage du volume}}} retarder () 50) ; Assez courte pour détecter tous les coups. } / * * Si la distance est au seuil, marquer comme « haut » et la LED correspondante s’allume. * / int handleDist (int pouces) {si (pouces > DIST_DOWN) {digitalWrite (conduit, en haut); return CONTROL_UP;} else {digitalWrite (led, faible); return CONTROL_DOWN;}}

/ * * Déclencher du code IR correct * / void doIR (contrôle int, int val) {switch(control) {CONTROL_POW-affaire: / / power Serial.println ("marche/arrêt 0xa90"); pour (int j’ai = 0; j’ai < 3; i ++) {setColor (255, 0, 0); irsend.sendSony (0xa90, 12); / / Sony TV power code delay(40);} break ; case CONTROL_CH : setColor (0, 255, 0); / / sortie « canal haut / bas » selon val si (val == CONTROL_UP) {digitalWrite (sous la direction ÉLEVÉ) ; pour (int i = 0; i < 3; i ++) {irsend.sendSony(0x90, 12) ; delay(40);} Serial.println ("canal vers le haut de 0xD00A") ; } else / / down {pour (int i = 0; j’ai < 3; i ++) {irsend.sendSony (0x890, 12); delay(40);} Serial.println ("canal vers le bas de 0x3002") ; } break ; affaire CONTROL_VOL : setColor (0, 0, 255) ; sortie « volume haut / bas » selon val si (val == CONTROL_UP) {digitalWrite (led, HIGH); pour (int j’ai = 0; j’ai < 3; i ++) {irsend.sendSony (0x490, 12); delay(40);} Serial.println ("volume haut 0x490") ; } else //down {pour (int i = 0; j’ai < 3; i ++) {irsend.sendSony (0xC90, 12); delay(40);} Serial.println ("volume bas 0xC90") ; } break ; }} void setColor (int rouge, int vert, int bleu) {analogWrite (ledR, rouge); analogWrite (ledG, vert); analogWrite (ledB, bleu);}

long doPing() {digitalWrite (pingPin, basse) delayMicroseconds(2) digitalWrite (pingPin, HIGH); delayMicroseconds(5) ; digitalWrite (pingPin, LOW); return pulseIn (echoPin, HIGH);}

long microsecondsToInches (longs microsecondes) {return microsecondes / 74 / 2;}

long microsecondsToCentimeters (longs microsecondes) {return microsecondes / 29 / 2 ;

Articles Liés