如何使用TV遥控器和Arduino传感器来控制电器

  • 内容
  • 评论
  • 相关

在本文中,我们将学习如何使用电视遥控器和Arduino来控制电子设备。我们将从控制一个简单的LED开始,然后控制直流风扇的旋转速度,再到控制家用电器。

控制原理

在日常生活中,电视遥控器我们再熟悉不过了,只是随着网络电视的普及,传统红外线电视机遥控器已经逐步被取代了。你可能注意到,电视遥控器在使用时,当我们按下一个按钮时,有的遥控器前面的LED会闪烁,但有的不会。事实上会闪烁的遥控器只是厂商额外安装了指示灯而已,真的红外线信号人眼是看不到的,我们只能通过相机可以观察到。

使用TV遥控器和Arduino传感器来控制电器
TV遥控器

当通过相机观察到遥控器的红外线闪烁时,意味着你按下了一个按钮,红外LED会发出红外脉冲,我们利用红外接收器就可以接收到这个脉冲。

Arduino利用红外接收器接收到红外脉冲
Arduino利用红外接收器接收到红外脉冲

V34838 红外接收管

下面我们将使用V34838 红外接收管完成系列实验,V34838内部原理图如下:

V34838 红外接收管内部原理图
V34838内部原理图

从图中我们可以看到,V34838内部包含了放大、滤波和解调等功能块,它接收到信号后经过放大、滤波和解调后再进行输出,它的输出信号可以直接接入Arduino控制板的数字输入引脚。

Arduino-IRremote 识别按键编码

Arduino-IRremote 识别按键编码
Arduino-IRremote库及示例代码和运行结果

遥控信号通过V34838输出到Arduino后,我们需要知道这些信号代表什么意思?这里会使用Arduino-IRremote库(地址:https://github.com/z3t0/Arduino-IRremote),通过这个库,我们可以从串口监视器中看到每个遥控按钮按下后的十六进制代码,这样就可以在编写程序时使用它了。

用电视遥控器控制RGB LED

使用电视遥控器上的4个彩色按钮来控制LED的颜色。首先我们需要上传IRrecvDemo到Arduino控制板,然后运行串口监视器来逐一查看每个按钮的十六进制代码并记录下来。在控制代码中添加if语句,如果按下特定按钮,将执行特定的语句,我们给每个按钮设置适当的RGB值,setColor()函数指定特定的颜色点亮LED。控制代码如下:

#include <IRremote.h>
int RECV_PIN = 8; // IR Receiver - Arduino Pin Number 8
IRrecv irrecv(RECV_PIN);
decode_results results;
int redPin = 5;
int greenPin = 6;
int bluePin = 7;
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);  
}
 
void loop() {
  
  if (irrecv.decode(&results)) {   
    
    if (results.value == 0xF21D7D46) { // Red Button
      setColor(255, 0, 0);  // Sets Red Color to the RGB LED
      delay(100);
      }
    if (results.value == 0x87CF1B29) { // Green Button
       setColor(0, 255, 0);  // Green Color
      delay(100);
      }
    if (results.value == 0x6623D37C) { // Yellow Button
      setColor(255, 255, 0);  // Yellow Color
      delay(100);
      }   
    if (results.value == 0x854115F2) { // Blue Button
      setColor(0, 0, 255);  // Blue Color
      delay(100);
      }
     if (results.value == 0x1639AB6E) { // Stop Button
      setColor(0, 0, 0);  // OFF
      delay(100);
      }
      
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}
// Custom made function for activating the RGB LED 
void setColor(int red, int green, int blue)
{
  analogWrite(redPin, red); // Sends PWM signal to the Red pin
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);  
}

用电视遥控器控制直流电风扇的转速

下面我们将使用电视遥控器的前进和后退按钮来控制直流电风扇的速度。电路原理图如下,风扇调速实际上是使用按钮来控制PWM信号,关于PWM信号可查阅:Arduino直流电机控制教程

电视遥控器控制直流电风扇的转速
电视遥控器控制直流电风扇的转速

在下面的示例代码中,会使用analogWrite()函数,PWM信号发送到晶体管的基极, 当按下遥控器“ PLAY ”按钮以最高速度启动电机,这时PWM信号的占空比为100%,按下“ STOP ”按钮电机停止,当按下前进按钮PWM信号的占空比增加,每次按下都会增加风扇的转速,按下后退按钮会降低转速也就是减少占空比。

#include <IRremote.h>
int RECV_PIN = 8; // IR Receiver - Arduino Pin Number 8
int pwmPin = 7; // Arduino Pin Number 7 to the Base of the Transistor
int pwmValue;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode( pwmPin, OUTPUT);  
  pwmValue = 0; // Starts the program with turned off motor
}
 
void loop() {
  
  if (irrecv.decode(&results)) {   
    
    analogWrite(pwmPin, pwmValue);
  
    if (results.value == 0xAFAF8374) { // PLAY Button
        pwmValue = 255; // 100% Duty Cycle | Max Speed
        }
    if (results.value == 0x98519C65) { // STOP Button
        pwmValue = 0; // 0% Duty Cycke | Turned off
        }
    if (results.value == 0x93F1BA08) { // FORWARD Button
        if(pwmValue <= 245){  
        pwmValue = pwmValue + 10; // Increases the Duty Cycle of the PWM Signal
        delay(20);     
      }   
    }
    if (results.value == 0x71D086FF) { // BACKWARD Button
      if(pwmValue >= 20){
        pwmValue = pwmValue - 10; // Decreases the Duty Cycle of the PWM Signal
        delay(20);    
      }
    }   
  Serial.print(pwmValue);
  Serial.print(" ");
  Serial.println(results.value, HEX);
   
  irrecv.resume(); // Receive the next value
  }
  delay(100);
}

用电视遥控器控制家用电器

最后一个例子是使用电视遥控器控制家用电器。例子中使用了一个继电器模块。它的额定值为10A,交流电压为125V~250V。控制信号接入Arduino板上的7号针脚,我们通过控制继电器上的插座,实现对家用电器电源开关的控制。代码如下:

#include <IRremote.h>
int RECV_PIN = 8;
int relayOut = 7;
int buttonState ;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode( relayOut, OUTPUT); 
  buttonState = HIGH; // Starts the program with turned off Relay. The relay input works inversly so HIGH state means deactivated relay
}
 
void loop() {
  
  buttonState = digitalRead(relayOut);
        
  if (irrecv.decode(&results)) {   
    
    if (results.value == 0xAFAF8374) { // PLAY Button
        digitalWrite(relayOut, LOW); // Activates the relay
        }
    if (results.value == 0x98519C65) { // STOP Button
        digitalWrite(relayOut, HIGH); // Deactivates the relay
        }   
  
  irrecv.resume(); // Receive the next value
  }
  
  Serial.print(" ");
  Serial.println(results.value, HEX);
   
  
  delay(100);
}

关于继电器模块的控制,可以查看:Nodemcu继电器控制教程