esp32红外遥控

什么是红外遥控

红外遥控是一种无线控制技术,利用红外信号进行非接触式通信。

红外遥控系统通常由两部分组成:发射器和接收器。发射器将用户的指令编码成特定的红外信号,然后通过红外发射二极管发送出去。接收器则包含一个红外接收二极管,用于检测来自发射器的红外信号,并将其转换回电信号,最终解析为用户的原始指令。这种技术的优点包括结构简单、功耗低等。

红外遥控在日常生活中的应用非常广泛,例如家用电器(如电视、空调)、个人娱乐设备(如玩具控制车)、工业控制和智能仪器等领域。它的主要优势在于成本较低,且能够满足大多数基本的遥控需求。此外,还有一些应用程序和服务,如遥控精灵App,能够模拟多种电器的红外遥控器,提供给用户更加便捷的控制体验。
在实际应用中,红外遥控的编码方式有多种,如NEC编码等,这些编码定义了如何将按键信号转换为红外信号,以及如何从接收到的红外信号中恢复出原始的按键信息。

NEC编码

NEC编码是红外遥控中最常用的编码之一,它的特点是协议简洁且易于实现,因此非常适合用于家电等设备的红外控制。NEC红外遥控的载波频率通常为38kHz,这是一种在国际上广泛使用的标准载波频率。以下是NEC编码的主要特点:

脉冲位置调制(PPM):NEC协议采用脉冲位置调制来区分逻辑“0”和逻辑“1”。这种调制方式利用脉冲之间的时间间隔来表示不同的逻辑状态。
数据帧格式:一个典型的NEC协议数据帧格式包括引导码、用户码、用户反码、按键数据码和按键数据反码。用户码及其反码用于验证数据的有效性,而按键数据码则代表具体的控制指令。
发送顺序:在NEC协议中,数据的发送顺序是从最低有效位(LSB)到最高有效位(MSB)。
双向编码:NEC协议使用双向编码,也称为曼彻斯特编码,这种编码方式有助于提高信号的可靠性。
载波占空比:推荐载波占空比为1/3至1/4,这有助于确保信号的稳定性和可靠性。

NEC数据格式

包括引导码、用户码、用户码反码、按键码和按键反码。

  • 引导码:引导码是数据帧的起始标志,用于指示数据的开始。它通常由一定数量的脉冲组成,以帮助接收器同步信号。
  • 用户码:用户码是遥控器的唯一标识,用于区分不同的遥控器。它确保了多个遥控器在同一环境中使用时不会相互干扰。
  • 用户码反码:用户码反码是用户码的反向形式,用于错误检测。如果用户码和用户码反码不匹配,则表明数据传输过程中可能出现了错误。
  • 按键码:按键码代表用户按下的具体按键,每个按键对应一个唯一的编码。
  • 按键反码:按键反码同样用于错误检测,它是按键码的反向形式。

接线

在这里插入图片描述

micro python 代码实现

#导入Pin模块
from machine import Pin
import time

#定义IRED控制对象
ired=Pin(14,Pin.IN,Pin.PULL_UP)

#存储红外遥控器键值
gired_data=[0,0,0,0]



#外部中断函数
def ired_irq(ired):
    ired_high_time=0  #保存高电平时间,鉴别数据1还是0
    
    if ired.value()==0:
        time_cnt=1000
        while (not ired.value()) and time_cnt:  #等待引导信号9ms低电平结束,若超过10ms强制退出
            time.sleep_us(10)
            time_cnt-=1
            if time_cnt==0:
                return
        
        if ired.value()==1:  #引导信号9ms低电平已过,进入4.5ms高电平
            time_cnt=500
            while ired.value() and time_cnt:  #等待引导信号4.5ms高电平结束,若超过5ms强制退出
                time.sleep_us(10)
                time_cnt-=1
                if time_cnt==0:
                    return
            for i in range(4):  #循环4次,读取4个字节数据
                for j in range(8):  #循环8次读取每位数据即一个字节
                    time_cnt=600
                    while (ired.value()==0) and time_cnt:  #等待数据1或0前面的0.56ms结束,若超过6ms强制退出
                        time.sleep_us(10)
                        time_cnt-=1
                        if time_cnt==0:
                            return
                    time_cnt=20
                    while ired.value()==1:  #等待数据1或0后面的高电平结束,若超过2ms强制退出
                        time.sleep_us(100)
                        ired_high_time+=1
                        if ired_high_time>20:
                            return
                    gired_data[i]>>=1  #先读取的为低位,然后是高位
                    if ired_high_time>=8:  #如果高电平时间大于0.8ms,数据则为1,否则为0
                        gired_data[i]|=0x80
                    ired_high_time=0  #重新清零,等待下一次计算时间
        if gired_data[2]!=~gired_data[3]:  #校验控制码与反码,错误则返回
            for i in range(4):
                gired_data[i]=0
                return
            
    print("红外遥控器操作码:0x%02X" % gired_data[2])     
            

#程序入口
if __name__=="__main__":
    ired.irq(ired_irq,Pin.IRQ_FALLING)
    
    while True:
        pass

外部中断函数ired_irq,当红外接收器接收到信号时,这个函数会被调用。在这个函数中,首先初始化了一个变量ired_high_time,用于保存高电平时间,以判断数据是1还是0。然后,通过一系列的循环和判断,解析出红外遥控器发送的数据,并将解析出的数据存储在gired_data列表中。最后,如果校验控制码与反码不匹配,则清空gired_data列表并返回。如果匹配,则打印出操作码。
此时我们可以使用红外遥控器发送指令,比如各种遥控器空调,电风扇甚至手机的红外控制。
此时控制台将输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

π克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值