历史上的今天
返回首页

历史上的今天

今天是:2024年12月25日(星期三)

正在发生

2018年12月25日 | STM32 录制与播放空调/TV遥控器的红外信号

2018-12-25 来源:eefocus

准备工作:


(1)红外线接收管 IR receiver 


(2)红外线发射灯 IR transmitter 


(3)STM32控制板 


(4)面包线 Jumper cables 


(5)空调/TV遥控器


硬件


1、 模块 


IR发射管VCC,GND,DATA; IR接受管VCC,GND,DATA;


软件


为验证红外录制其录制可靠,先尝试录制大信号; 


录制条件: 


1、 录制过程循环捕捉PIN上电平; 


2、 红外脉宽计算的时基必须可靠; 


3、 数据类型溢出处理; 


4、 避免外部红外信号干扰;


以下代码在小米电视/美的空调上测试成功,先录制,然后播放,可以正确识别。


部分代码


uint32_t micros(void)

{

    uint16_t m,t;

    uint32_t dat;


    //disableInterrupts();

    m = T2_overflow;


    t = TIM_GetCounter(TIM2);//250us irq

    //enableInterrupts();

    dat = (uint32_t)m * 250 + t;


    return dat;

}


void custom_delay_usec(unsigned long uSecs) {

    if (uSecs > 4) {

        unsigned long start = micros();

        unsigned long endMicros = start + uSecs - 4;

//      Printf("endMicros = %d\tstart = %d\r\n",endMicros,start);

        if (endMicros < start) { // Check if overflow

            while ( micros() > start ) {} // wait until overflow

        }

        while ( micros() < endMicros ) {} // normal wait

    }

}


#ifdef IRremote_TX

    //如果处于播放状态 

        if(isPlay) {

            Printf("startPlaying\r\n");

            LED2_ON;//串口和指示灯示意播放中

            //信号长度

            u32 times = IR_loc_ON;

            u8 i = 0;

            //播放数组中的信息,由于第0位是高电平(暨没有收到信号)长度,所以舍去不播放

            for(i = 0; i < times; i++) {

                if( 0 == (i & 0x01) ) 

                {//奇数位为红外接收头低电平=红外发射头高电平

                    TIM_Cmd(TIM3, ENABLE); 

                    custom_delay_usec(IR_res_key_1[i]);

                    TIM_GenerateEvent(TIM3, TIM_EventSource_Update);

                    TIM_Cmd(TIM3, DISABLE);

                } 

                else//偶数位为不发射

                {

                    custom_delay_usec(IR_res_key_1[i]);

                }

            }

            isPlay = 0;

            //每次发射中间应该有间隔

            IWDG_Feed();

            delay(900);

            LED2_OFF;//关闭指示灯

        }

        #endif

        #ifdef IRremote_RX

        //如果处于录制状态 

        while(isRecord){

            if ( (0 == GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4) ) ){

                SysTime_buf = micros();

                LED2_ON;

                #if 1

                while(1){

                    if ( Ir_Status != ( GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4) ) ){//等待脉冲信号改变

                        currentTime = micros();//SysTime_us 

                        if ( currentTime > previousTime )

                            cycleTime = currentTime - previousTime;//计算时长

                        else

                            cycleTime = 0xffffffff - previousTime + currentTime ;//计算时长

                        previousTime = currentTime;//记录起点 GetSysTime(); //ms                    


                        Ir_Status = ( (!Ir_Status) & 0x01 );//状态改变,下一次检测相反状态

                        IR_res[IR_loc1++] = cycleTime;//将结果存入buffer

                    }

                    if((micros() - SysTime_buf> 200000) /*&& IR_loc1>100*/) {//如果超时没有记录到新信息,且已经收集到有效信息,则记录结束

                        for( int i = 1; i

                            Printf("%d\t,",IR_res[i]);

                            DelayMs(100);

                            IWDG_Feed();

                        }

                        Printf("IR_loc1len = %d\r\n",IR_loc1);

                        IR_loc = IR_loc1;

                        IR_loc1=0;

                        isRecord = 0;


                        LED2_OFF;//关闭指示灯

                        break;

                    }

                }

                #else

                #endif

            }

            else

                LED2_OFF;

        }


推荐阅读

史海拾趣

AK-Nord_GmbH公司的发展小趣事

随着全球环保意识的提高,AK-Nord_GmbH也积极践行可持续发展理念。公司注重环保生产,采用环保材料和工艺,减少生产过程中的环境污染。同时,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅提升了公司的社会形象,还为公司的长期发展奠定了坚实的基础。

这些故事都是基于一般电子行业的发展规律编写的,并不针对任何特定的公司或真实事件。希望这些故事能够满足您的需求,并为您了解电子行业公司的发展提供一些参考。

Acopian Power Supplies公司的发展小趣事

随着全球环保意识的提高,AK-Nord_GmbH也积极践行可持续发展理念。公司注重环保生产,采用环保材料和工艺,减少生产过程中的环境污染。同时,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅提升了公司的社会形象,还为公司的长期发展奠定了坚实的基础。

这些故事都是基于一般电子行业的发展规律编写的,并不针对任何特定的公司或真实事件。希望这些故事能够满足您的需求,并为您了解电子行业公司的发展提供一些参考。

DCX-CHOL Enterprises公司的发展小趣事

为了进一步拓展业务领域和提升竞争力,DCX-CHOL Enterprises开始积极探索跨界合作的可能性。公司与多家知名企业和研究机构建立了战略合作关系,共同开展技术研发和产品创新。通过跨界合作,DCX-CHOL Enterprises不仅获得了更多的技术支持和市场资源,还拓宽了视野和思路,为公司未来的发展注入了新的活力。同时,公司还积极参与行业协会和组织的活动,加强与其他企业的交流与合作,共同推动电子行业的发展和进步。

CW Industries公司的发展小趣事

CW Industries公司的前身Wirt Company由爱迪生的助手查尔斯·沃尔特于1904年创立。在公司初创时期,沃特率先发展了线绕电位器、固定线绕电阻器、汽车火花抑制器和滑动开关等产品。这些创新为公司的初步发展奠定了坚实的基础。随着电子行业的快速发展,CW Industries逐渐在多个电子领域开发出专利产品和工艺,如滑动、摇臂和按钮开关,以及绝缘穿刺连接器等。公司凭借其独特的设计和专利功能,逐渐在市场上占据了一席之地。

Comax Industrial Co Ltd公司的发展小趣事

为了不断提升自身的技术创新能力,Comax Industrial Co Ltd公司积极与高校、科研机构等开展产学研合作。通过与这些机构的紧密合作,公司不仅获得了前沿的技术支持,还培养了一批高素质的技术人才。这种合作模式使得公司的技术创新能力得到了显著提升,为公司的长期发展提供了有力的支撑。

BAND-IT公司的发展小趣事

20世纪60年代,人类开始迈入太空探索的新纪元。在这个充满挑战和未知的领域中,紧固件的可靠性和安全性至关重要。1961年,艾伦·谢波德成为第一个乘坐麦克唐纳道格拉斯太空舱在太空旅行的美国人,而太空舱里的数千根软管和扎带卡箍正是由BAND-IT公司提供。这些产品以其出色的耐用性和可靠性,经受住了太空极端环境的考验,为太空探索的安全和成功作出了贡献。

问答坊 | AI 解惑

无线网络中一种改进的TCP协议

摘要:为了解决无线网络下TCP 性能下降的问题,提出了一个改进的TCP 协议:TCP-AP(Transport Control Protocol with AP)。此协议通过层与层之间的通信,使TCP 发送方能够正确区分出是无线链路比特错误造成的丢包,还是有 线链路拥塞造成的丢包, ...…

查看全部问答>

320×240 16级灰度 LCD 能挂接到 WINCE4.2 上吗?

昨天拿到一款 320×240 16级灰度的 LCD ,不知道能不能挂接到 WINCE4.2 上? 如果可以,改写驱动程序的难度大吗? 本人是菜鸟,望高手指点一二! 平台:S3C2410 + WINCE4.2 + CASIO 16 级灰度 LCD…

查看全部问答>

xilinx DDS ipcore输出频率范围问题

请教各位大虾,xilinx的dds ipcore可以输出大于fs/2的频率吗,如果可以,性能指标方面有没有下降呢?…

查看全部问答>

第一次做板,有一个疑问。

做单面板,电源线和地线平行好不好?…

查看全部问答>

2012年安徽省电子设计大赛元件清单!

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑 2012年“威师杯”安徽省第七届大学生电子设计竞赛元器件和基本仪器清单一、本科组元器件单片机最小系统板(仅含单片机芯片、键盘与显示装置、存储器)可编程逻辑器件及其下载板宽带运算放大器、高速 ...…

查看全部问答>

DSP电源

麻烦各位看下这个电路,有没有谁知道图中C37,C39的这样放的作用是什么?或者说这个图有错误,请多指教交流,谢谢! …

查看全部问答>

请教单片机程序下载问题

单片机型号STC12C2052AD USB 转TTL模块中间2跟线为TXD 和 RXD  ,外边两根分别是VCC 和 GND ,我用的是面包板,VCC 接20脚,GND 接10脚,TXD和RXD分别接P3.0和P3.1口,然后运行STC-ISP进行程序下载,软件一直提示请给MCU上电,我断电上电 ...…

查看全部问答>

SM5852压力传感器

SM5852压力传感器用I2C通信获取数据我写了但是获取不了!请大家帮帮忙。 …

查看全部问答>

使用两块launchpad SPI传数据

用两块launchpad传SPI数据,一端发送一端接收,接收一端再用串口传给电脑显示。这是项目中一小段调试的程序。 发送程序 #include unsigned char MST_Data, SLV_Data; int main(void){ volatile unsigned int i; WDTCTL = WDTPW + WDTHOLD; ...…

查看全部问答>