FlickMote
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
简介
通过红外线遥控器控制家用电器和电子产品现在很普遍。但是可以更轻松地完成相同的控制任务。使用新的手势遥控器系统的主要动机是消除查看手持遥控器和搜索特定功能的特定键的需要,主要是针对旧的。该项目提出了一种新颖的系统,可以通过手势作为远程控制设备来控制家用电器。该项目在本报告中将被称为 flickremote。它使用超声波测距仪来确定用户的手势并输出红外信号,微控制器开发板 Arduino 101
硬件组件
1. Arduino 101 或 uno
2. HC-SR04超声波模块
3. 一个红外线 LED
4. 适合您的红外线 LED (220R) 的电阻器
5. RGB LED
6.面包板和电线
它是如何工作的:
该项目使用超声波测距仪来确定用户的手势,并根据给定的命令将红外信号输出到电视..距离或英寸可以在代码中编辑,以满足您的方便
- 高刷(> 10 英寸)=频道向上
- 低滑动 =频道向下
- 高保持(> 10 英寸)=音量增大
- 低位保持 =降低音量
- 覆盖传感器 (<3in) =打开 / 关闭
使用 Fritzing 的电路图:
建筑:
1. IR LED 通过适当的电阻连接到pin 3,然后将阴极连接到GND。
2. 将超声波传感器连接到引脚指定的 5v 和 GND。将触发引脚连接到引脚 8,将回声引脚连接到 7。您可以在程序中配置这些引脚
3. 将 RGB LED 连接到 GND 和引脚 11(红色)、10(绿色)、9(蓝色)。这些引脚也是可配置的。
控制
电源
在 3 英寸内刷过传感器会导致 LED 呈紫色闪烁。这是对“打开/关闭”信号已准备好发送的确认。为了防止它意外关闭电视,我让草图在第一次确认后的 5 秒内等待第二次滑动。此时信号发送到电视以打开或关闭。
频道
在传感器 10 英寸内(但不在 3 英寸内)滑动将导致通道向下变化。在 10 到 20 英寸之间滑动会导致频道向上变化。
音量
将手放在距离传感器 10 英寸以内(但不在 3 英寸以内)会导致音量降低。保持在 10 到 20 英寸之间会导致音量变大。音量会不断变化(向上或向下),直到您的手被移开
优势和改进:
将不再需要查看手持遥控器并搜索特定功能的特定键
一种为盲人和残障人士控制小工具(电视)的解决方案
该项目可以通过添加更多功能来改进,以使用相同的方法控制所有家用电器
谢谢你
代码
- 代码
代码C/C++
/* 滑动遥控器此草图使用超声波测距仪来确定用户的手势,并根据给定的命令将 IR 信号输出到索尼电视。- 高刷 (> 10in) =频道向上-低刷 =频道向下-高保持(> 10 英寸)=音量增大- 低保持=音量减小- 覆盖传感器(<3 英寸)=打开/关闭由 Vignesh Jaishankar 创建此代码使用 IRremote 库(https://github.com/shirriff/Arduino-IRremote) */#include// 定义控制功能#define CONTROL_CH 1 // 通道改变#define CONTROL_VOL 2 // Volume#define CONTROL_POW 3 // Power#define CONTROL_UP 1#define CONTROL_DOWN -1#define DIST_MAX 20 // 以英寸为单位的最大距离,上面的任何内容都将被忽略。#define DIST_DOWN 10 // 向上/向下命令的阈值。如果更高,则命令为“向上”。如果更低,则“向下”。#define DIST_POW 3 // 电源命令阈值,低于 =电源开/关 // IR PINconst int irPin =3; // 这是在库中定义的,这个变量只是一个提醒。更改此不会更改库中的 PIN // 2 Pin Ping Sensorconst int pingPin =8;const int echoPin =7;// 确认 LED Pinsconst int led =13; //用于上/下调试的内部 LEDconst int ledR =11;const int ledG =10;const int ledB =9;// LED on timerunsigned long timer;// IR 发射器 objectIRsend irsend;// 电源确认标志(需要两次刷卡) to send signal)boolean powerConfirmed =false;void setup() { // 初始化串行通信并设置引脚 Serial.begin(9600); pinMode(led,输出); pinMode(ledR,输出); pinMode(ledG,输出); pinMode(ledB,输出); pinMode(pingPin,输出); pinMode(echoPin, INPUT); timer =millis();}void loop(){ // Serial.println(millis());持续时间长,英寸;整数值; // 检查阅读持续时间 =doPing(); // 确认动作的定时器(目前只有电源) if (timer &&timer <(millis() - 5000) &&(millis()> 5000)) { Serial.println("timer reset");计时器=假;数字写入(领导,低);设置颜色(0, 0, 0); // off // 将时间转换为距离inches =microsecondsToInches(duration); // 如果距离小于最大英寸,则执行 if (inches DIST_MAX) { doIR(CONTROL_CH, value); // 滑动 } else { // 音量 int d =500; // 单次音量变化的第一次延迟更长 // 重复直到手被移开 while (inches DIST_DOWN) { digitalWrite(led,高的);返回 CONTROL_UP; } else { digitalWrite(led, LOW);返回 CONTROL_DOWN; }}/** 触发正确的 IR 代码*/void doIR(int control, int val){ switch(control) { case CONTROL_POW:// power Serial.println("power on / off 0xa90"); for (int i =0; i <3; i++) { setColor(255, 0, 0); irsend.sendSony(0xa90, 12); // 索尼电视电源代码延迟(40); } 休息; case CONTROL_CH:setColor(0, 255, 0); // 输出“通道向上/向下”取决于 val if (val ==CONTROL_UP) { digitalWrite(led, HIGH); for (int i =0; i <3; i++) { irsend.sendSony(0x90, 12);延迟(40); } Serial.println("通道向上0xD00A"); } else // 向下 { for (int i =0; i <3; i++) { irsend.sendSony(0x890, 12);延迟(40); } Serial.println("通道向下0x3002"); } 休息; case CONTROL_VOL:setColor(0, 0, 255); // 输出“音量增大/减小”取决于 val if (val ==CONTROL_UP) { digitalWrite(led, HIGH); for (int i =0; i <3; i++) { irsend.sendSony(0x490, 12);延迟(40); } Serial.println("音量增加0x490"); } else //向下{ for (int i =0; i <3; i++) { irsend.sendSony(0xC90, 12);延迟(40); } Serial.println("音量降低0xC90"); } 休息; }}void setColor(int red, int green, int blue){analogWrite(ledR, red);模拟写入(ledG,绿色);模拟写入(ledB,蓝色);}长 doPing(){ 数字写入(pingPin,低);延迟微秒(2);数字写入(pingPin,高);延迟微秒(5);数字写入(pingPin,低); return pulseIn(echoPin, HIGH);}long microsecondsToInches(long microseconds){ return microseconds / 74 / 2;}long microsecondsToCentimeters(long microseconds){ return microseconds / 29 / 2;}
示意图
flickmote_9Gx3XNFHEp.fzz制造工艺