红外解码(TCL 空调)
<p><a href="forum.php?mod=attachment&aid=73869" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:红外遥控器.zip</a>## 项目简介</p><pre><code>TCL空调遥控器
</code></pre>
<h2>项目功能</h2>
<pre><code>简单完成一款能够实现学习的空调遥控器
</code></pre>
<h2>硬件所需</h2>
<ul>
<li>打样并完成焊接。</li>
<li>逻辑分析仪+若干杜邦线</li>
</ul>
<h2>软件编写</h2>
<ul>
<li>首先根据将开发板直接供电并通过逻辑分析仪获取到红外接收输出的红外协议。
<ul>
<li>假定我的空调是TCL ,此时我需要学习或者使用它来做到控制空调简单的开关。</li>
<li>我们需要用逻辑分析仪器抓取它收到的协议,空调遥控器也好,手机万能遥控也好,只要是可以正常的控制空调的都行,逻辑分析仪设置为下降边沿捕获,最后分析协议的特点进行编程。</li>
</ul>
</li>
<li>根据捕获的协议编写发送的协议,低电平一般表示的就是38Khz 的载波,高电平呢就表示当时为空闲。</li>
</ul>
<p>使用逻辑分析仪器抓取的协议如下图 例:</p>
<p><img src="data/attachment/forum/202412/18/113733iddq6jicjqcqbhiw.png" alt="ba6d436f06a54abd95435754a3b88a44.png" title="ba6d436f06a54abd95435754a3b88a44.png" /></p>
<p>以TCL 空调为例子,它的协议和NEC 的协议就有略微的不同,它具有14 位数据,接收管接收的数据开始码是3150us 的低电平和1600us 的高电平,0和1 的区分是采用脉冲位置调制(PPM),通过脉冲之间的时间间隔来区分“0”和“1”,0的脉冲间隔是1150us,1的脉冲间隔是450us。</p>
<ul>
<li>
<p>接收代码如下。</p>
<pre><code class="language-c">void Get_Infrared_Code(uint8_t *buf)
{
uint8_t data_bits=0,timer_10us=0;
while(1)
{
if(P22==1)
{
if(timer_10us<255)
timer_10us++;
}else
{
buf&=~(0x01<<(data_bits%8));
if(timer_10us<70)
buf|=(0x01<<(data_bits%8));
if(timer_10us>140)
data_bits=0;
else
data_bits++;
timer_10us=0;
while(P22==0);
}
if(data_bits==112)
break;
Delay10us();
}
}
</code></pre>
</li>
<li>
<p>发送代码如下,其中延时均通过stc下载软件生成,并通过逻辑分析仪校准查看过,使用的系统时钟为33.1766MHz:</p>
</li>
</ul>
<pre><code class="language-c">void start2(void)
{
uint8_t i=0;
for(i=0;i<239;i++)
{
Delay13us();
P03=~P03;
}
P03=0;
Delay1600us();
}
void send_38k(void)
{
uint8_t i=0;
for(i=0;i<34;i++)
{
Delay13us();
P03=~P03;
}
P03=0;
}
void send_IR_Ctl(uint8_t *buf)
{
uint8_t i=0,j=0,tp;
start2();
for(i=0;i<14;i++)
{
tp=buf;
for(j=0;j<8;j++)
{
send_38k();
if(tp&0x01)
{
Delay450us();
}else
{
Delay1150us();
}
tp>>=1;
}
}
send_38k();
}
</code></pre>
<ul>
<li>主函数功能实现</li>
</ul>
<pre><code class="language-c">void main(void)
{
uint8_t tp=0;
uint8_t mode=0;
uint8_t buf;
char xdata show;
WTST = 0;
EAXSFR();
CKCON = 0;
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x04;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
I2CCFG = 0xc2;
I2CPSCR = 0x00; //MSSPEED
I2CMSST = 0x00;
OLED_Init();
OLED_ShowString(0,0,"state:Rx",16);
Get_Infrared_Code(&buf);
my_sprintf(show,buf,14);
OLED_ShowString(0,2,show,16);
Delay100ms();
OLED_ShowString(0,0,"state:Rx",16);
while(1)
{
if(P32==0)
{
send_IR_Ctl(&buf);
}
}
}
</code></pre>
<h2>验证功能</h2>
<ol>
<li>开机显示 state:Rx,说明设备进入学习功能模式了。</li>
</ol>
<p><img src="data/attachment/forum/202412/18/113755kd8m7nnamvamnam8.jpg" alt="c84eb0a61f814285a89e2233cc290d7e.jpg" title="c84eb0a61f814285a89e2233cc290d7e.jpg" /></p>
<ol start="2">
<li>使用TCL空调遥控器或者红米手机中的我万能遥控功能对着接收管按下按键.此时OLED 会显示出接收到的红外码。</li>
</ol>
<p><img src="data/attachment/forum/202412/18/113811vuv91h2wuhgj4nu9.jpg" alt="470e5137c0084afe9a697851f48bc176.jpg" title="470e5137c0084afe9a697851f48bc176.jpg" /></p>
<video controls="controls" src="forum.php?mod=attachment&aid=73868"></video>
<ol start="3">
<li>按下确认按键可以发送刚才收到的红外编码</li>
</ol>
能够储存多少组空调命令?
如果能解析出模式、温度、风速等信息就好了 VCC 发表于 2024-12-18 15:40
能够储存多少组空调命令?
如果能解析出模式、温度、风速等信息就好了
可以通过带红外的手机上对照着查看,必须用手机一直切换模式,那么变化的那位自然就是表示着模式了。这些信息基本可以解析出来。 {:4_174:} 楼主威武,牛,学习 {:4_165:},向电视遥控一样,加给个学习功能 很赞 {:qiang:} 高手,真的是高手 !
页:
[1]