Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen

Onderdelen en benodigdheden

  • Ultrasonische sensor HC-SR04 (1×)
  • IR-zender (IR-LED, 1×)
  • RGB LED gemeenschappelijke kathode (1×)
  • Arduino 101 (of Uno) (1×)
  • Weerstand 220 Ω voor IR-LED (1×)
  • Breadboard en draden

Apps en online services

  • Arduino IDE

Over dit project

FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen

Inleiding

Standaard IR-afstandsbedieningen vereisen dat je naar de knoppen kijkt. FlickMote gebruikt handgebaren gedetecteerd met een ultrasonische sensor om IR-commando's uit te sturen – ideaal voor ouderen, blinden of fysiek beperkten.

Hoe het werkt

De HC-SR04 meet de afstand naar de hand. Gebaren worden vertaald naar IR-codes (Sony TV-protocol in de voorbeeldcode):

  • Hoge swipe (> 10 inch / ~25 cm): Kanaal omhoog
  • Lage swipe (< 10 inch): Kanaal omlaag
  • Hoge vasthouden (> 10 inch): Volume omhoog
  • Lage vasthouden: Volume omlaag
  • Sensor bedekken (< 3 inch / ~7,5 cm): Aan/uit (bevestiging via tweede swipe binnen 5 s)

Afstanden zijn in de code aanpasbaar.

Constructie

  1. IR-LED aan pin 3 via 220 Ω weerstand, kathode naar GND.
  2. HC-SR04: VCC → 5V, GND → GND, Trig → pin 8, Echo → pin 7.
  3. RGB LED: GND → GND, Rood → pin 11, Groen → pin 10, Blauw → pin 9.
FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen

Bediening

Standby / Aan-Uit

Swipen binnen 3 inch → RGB LED knippert paars. Tweede swipe binnen 5 s bevestigt → IR aan/uit code verstuurd.

Kanaal

Swipen 3–10 inch → kanaal -. Swipen 10–20 inch → kanaal +.

Volume

Vasthouden 3–10 inch → volume -. Vasthouden 10–20 inch → volume +. Blijft doorgaan tot hand verwijderd.

Voordelen & verbeteringen

  • Geen zoeken naar knoppen; intuïtieve gebaren.
  • Toegankelijk voor blinden en motorisch beperkten.
  • Uitbreidbaar naar alle IR-apparaten in huis.

Code

Volledige sketch (vereist IRremote bibliotheek):

/* Swipe Remote Control
   Ultrasonische gebaren → IR commando's (Sony TV)
   - Hoge swipe (>10in) = Kanaal +
   - Lage swipe = Kanaal -
   - Hoge vasthouden = Volume +
   - Lage vasthouden = Volume -
   - Sensor bedekken (<3in) = Aan/Uit (dubbele swipe)
   Door Vignesh Jaishankar
   Gebruikt IRremote library: https://github.com/shirriff/Arduino-IRremote
*/
#include <IRremote.h>

#define CONTROL_CH 1
#define CONTROL_VOL 2
#define CONTROL_POW 3
#define CONTROL_UP 1
#define CONTROL_DOWN -1
#define DIST_MAX 20
#define DIST_DOWN 10
#define DIST_POW 3

const int irPin = 3;          // vast in IRremote library
const int pingPin = 8;
const int echoPin = 7;
const int led = 13;
const int ledR = 11;
const int ledG = 10;
const int ledB = 9;

unsigned long timer = 0;
IRsend irsend;
boolean powerConfirmed = false;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(pingPin, OUTPUT);
  pinMode(echoPin, INPUT);
  timer = millis();
}

void loop() {
  long duration = doPing();
  if (timer && timer < (millis() - 5000) && (millis() > 5000)) {
    Serial.println("timer reset");
    timer = 0;
  }
  digitalWrite(led, LOW);
  setColor(0, 0, 0);

  long inches = microsecondsToInches(duration);
  if (inches < DIST_MAX) {
    Serial.print(inches); Serial.println("in");
    if (inches < DIST_POW) {
      Serial.println(timer);
      if (timer) {
        doIR(CONTROL_POW, 0);
        timer = 0;
        delay(2000);
      } else {
        Serial.println("power flag set");
        timer = millis();
        setColor(255, 50, 50);
        delay(500);
      }
    } else {
      int value = handleDist(inches);
      delay(300);
      if (microsecondsToInches(doPing()) > DIST_MAX) {
        doIR(CONTROL_CH, value); // swipe
      } else {
        int d = 500;
        while (inches < DIST_MAX) {
          value = handleDist(inches);
          doIR(CONTROL_VOL, value);
          delay(d);
          inches = microsecondsToInches(doPing());
          d = 100;
        }
        delay(500);
      }
    }
  }
  delay(50);
}

int handleDist(int inches) {
  if (inches > DIST_DOWN) {
    digitalWrite(led, HIGH);
    return CONTROL_UP;
  } else {
    digitalWrite(led, LOW);
    return CONTROL_DOWN;
  }
}

void doIR(int control, int val) {
  switch (control) {
    case CONTROL_POW:
      Serial.println("power on/off 0xa90");
      for (int i = 0; i < 3; i++) {
        setColor(255, 0, 0);
        irsend.sendSony(0xa90, 12);
        delay(40);
      }
      break;
    case CONTROL_CH:
      setColor(0, 255, 0);
      if (val == CONTROL_UP) {
        digitalWrite(led, HIGH);
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0x90, 12);
          delay(40);
        }
        Serial.println("channel up 0xD00A");
      } else {
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0x890, 12);
          delay(40);
        }
        Serial.println("channel down 0x3002");
      }
      break;
    case CONTROL_VOL:
      setColor(0, 0, 255);
      if (val == CONTROL_UP) {
        digitalWrite(led, HIGH);
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0x490, 12);
          delay(40);
        }
        Serial.println("volume up 0x490");
      } else {
        for (int i = 0; i < 3; i++) {
          irsend.sendSony(0xC90, 12);
          delay(40);
        }
        Serial.println("volume down 0xC90");
      }
      break;
  }
}

void setColor(int red, int green, int blue) {
  analogWrite(ledR, red);
  analogWrite(ledG, green);
  analogWrite(ledB, blue);
}

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

long microsecondsToInches(long microseconds) {
  return microseconds / 74 / 2;
}
long microsecondsToCentimeters(long microseconds) {
  return microseconds / 29 / 2;
}

Schema's

FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen

Fritzing-bestand: flickmote_9Gx3XNFHEp.fzz

Productieproces

  1. Bouw een Ultrasonische Zweefapparaat met Arduino – Stap-voor-stap Handleiding
  2. Bluetooth-gecontroleerde Arduino Spybot bouwen
  3. DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
  4. Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
  5. Find Me: Slimme Item Locator met Arduino en Bluetooth
  6. Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
  7. Arduino Boter-Kaas-Eieren met MAX7219 LED Matrix en Kartonnen Behuizing
  8. Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
  9. Bouw een Aangepaste Arduino Joystick Stuurwiel voor Gaming
  10. Compact Arduino Radarsysteem met HC-SR04 Ultrasonische Sensor & 1.8" Display
  11. Bouw een Volledig Functionele CNC-machine met Arduino Nano R3