一次DIY远程空调控制的经历(长篇多图)

单片机爱好者 2022-01-12 18:30
点击上方蓝色字关注我们!




本文转自阿莫论坛,作者:jk36125.

原文链接:

https://www.amobbs.com/thread-5596868-1-1.html

前言
在很早之前,我就想过利用网络远程控制家里的空调。夏天,能够回到家里就一阵凉爽的赶脚是一个原因。另外一个更为重要的原因是,冬天的时候,开启了空调的暖气以后,需要二十分钟左右才能达到设定的温度。所以如果能够提前打开暖气,会是十分惬意的一件事。于是这篇文章记载了我想要在每天到家之前,就能把空调远程打开所做出的努力。包括对空调遥控器的红外解码,空调编码的发送和网页远程控制界面的设计等等。想想为了回家打开门那清爽的一瞬间,我也是蛮拼的,嘿嘿。

对于所有的红外解码过程,我尽量附上了采集到的原始数据,以方便其他人参考。

1 空调遥控器的红外解码
1.1 Arduino红外解码库
这就是我家的空调遥控器,型号是:三菱电机KP06AS:


想要远程控制空调,有几种方法:


  • 雇一个菲佣在家里,然后打电话叫她开空调

  • 设计一个可以远程控制的机器人,然后让它去按空调遥控器

  • 设计一个可以远程控制的空调遥控器


相信正常人都会说:“去你妹的远程机器人和菲佣,当然是选3啊.”



要制作能够控制空调的红外遥控器,首先要了解空调的红外编码。例如在饭店里,如果想叫服务员点单,你就必须说出他能够听懂的命令,比如:“靓仔,再不过来点单我会削你哦”。同样,空调是通过红外线来遥控的,为了能让它听话,就要使用红外线发送它“听”的懂的语言。所以,我们就要对原配的空调遥控器进行分析,弄懂空调的红外“语言”。

比较麻烦的地方是,不同于电视或者机顶盒的遥控器。空调遥控器的编码常常又臭又长,并且是厂家自定义的独特规范,因此学习型的万能空调遥控器常常不能正常使用。只有在完全了解我的空调的红外编码的情况下,我才敢用自己自制的遥控器来操作空调。不然,现在的空调那么复杂,空调主机又不能显示绝大多数的运行状态。对遥控器来说,空调主机就是一个黑箱。万一弄错了哪个编码,把空调都搞坏,就得不偿失了。

要分析,找工具。有现成的分析工具总是最方便的。Arduino有一套红外接收程序库,能够将红外遥控器发送的数据解码以后,通过串口打印出来。使用的器件是一体化红外接收器,通过AVR的IO来进行解码。

参考这篇文章:《Arduino練習:紅外線傳送與接收》我使用了Arduino来尝试解码空调遥控数据。

愿望很美好,结局很悲惨。我拿着空调遥控器对着一体化接收器按了好几下,当然,只有按开机键,遥控器的其它状态,例如风速等等,完全没有变化。对于同一个空调按键,Arduino解码出来的数据每一次都不相同,软件也不能分析出红外编码的类型,简单来说,就是数据一塌糊涂完全不能看。

Figure 1-1. Arduino空调红外解码数据


这样乱七八糟的数据,根本无法放心的拿来分析。因为空调有许多不同的状态组合,所以相同的按键在不同的状态下,发送的红外编码可能都不一样。并且由于空调的一次按键中,需要包含较多的状态,因此数据量也比电视遥控器大的多。Arduino解码出的数据一团糟,说明空调遥控器发送的红外编码,已经超出了Arduino能够解码的范围,我只能使用其它的方式来解码空调遥控器的数据了。

1.2 红外接收二极管和示波器
其实,网络上是有卖现成的红外遥控分析器。但我只想分析下一个空调遥控器而已,能够正常开关机就够了。花几百块买一个红外分析器,只用一两次然后丢在那里吃灰,实在不是一件划算的事情。所以我自己设计了一个简单实用的红外接收设备,然后使用我手边有的逻辑分析仪来捕捉空调遥控器发送的红外数据:

Figure 1-2. 红外接收装置原理图


这个红外接收器构造很简单,只使用了一个红外接收二极管和一个100欧姆的电阻。这一个红外接收装置的原理是:


  • 当红外接收二极管照射到红外线时,它的反向电阻急剧减小,接收装置输出高电平。

  • 当红外接收二极管没有红外照射时,它反向截止,装置输出低电平。


刚开始的时候,我使用的是10K的电阻,但是由于电阻的阻值太大,因此对于红外信号常见的38K频率,没有办法快速的把电平信号拉低。因此我做了几次尝试,最后发现100欧姆的阻值,对于38K的红外频率有着较好的输出效果。红外二极管需要在反向电压的情况下来使用。因为没有任何放大电路,所以使用的时候,为了达到好的输出效果,需要将红外遥控器的发射端二极管,尽可能的和红外接收二极管接近并且对正。这和某些“学习型”的红外遥控器很相似。不管怎样,对于红外信号分析来说,能够获取红外线的信号才是关键,距离限制什么的倒是完全没有关系。

这个接收器虽然简单,但因为对原始的红外信号做出反应,可以同时还原红外信号的所有信息,包括载波频率,载波占空比等等。这是一体化红外接收头没有办法做到的。一体化红外接收器会过滤掉载波的部分信息,这对于读取红外数据来说或许方便,但对于红外数据分析不是一件好事了。

下面是使用示波器和上面制作的红外接收器,捕获空调遥控器的开机按键红外编码:

Figure 1-3. 使用示波器查看空调红外编码


通过示波器的波形可以看出,一次按键的数据分为独立的两个帧,每帧的长度大约为162毫秒,两帧间隔大约为15毫秒。从示波器上暂时还看不出来两帧数据之间的关系。这两帧数据有可能是为了效验而相互取反的,也有可能是完全相同的数值。只有通过进一步的数据分析才能得出结论。

到目前为止,可以确定的事情只有:

  • 空调遥控一次按键操作会发出两帧红外码

  • 两帧红外码加上间隔时间的总长度为339毫秒左右

1.3 逻辑分析仪捕获的数据
虽然使用示波器能够获取红外遥控的波形,但示波器一次能够记录的数据却很有限。如果将示波器的量程调节到可以看清载波频率,就没有办法看到完整的波形了。如果将量程调节到可以捕捉完整的波形,却又看不清波形的细节。

这个时候就要靠逻辑分析仪了,通过示波器的观察,自制接收器的输出电平已经达到了CMOS的标准,所以可以直接将接收器连接到逻辑分析仪上,而不用添加额外的放大电路。额外的电路,意味着可能添加额外的噪音。简单是最好了。下面是使用逻辑分析仪捕获的红外数据:

Figure 1-3. 逻辑分析仪捕获的数据


从逻辑分析仪软件上可以测量出,采集的数据总长度大约为320毫秒,可以清晰看到两个独立的帧数据。这和示波器上采集到的波形一样。和示波器不同的是,逻辑分析仪的数据包含遥控器一次发送的红外编码的所有信息,我可以通过逻辑分析仪软件,放大查看波形的每一个细节,也可以缩小查看整个完整的波形,完全可以随心所欲的处理数据。所以我觉得,逻辑分析仪是除了示波器和可调电源以外的必备调试工具。

1.4 红外数据的解码
1.4.1 常见的红外编码格式

到网上搜索了一番红外数据编码规范以后,我照着一番比较,发现所捕获的空调遥控红外编码和网上所列出的红外编码规则都不完全相同。但还是可以看出一些通用的编码规律。例如,每一帧的数据都有一个比其它结构都要长出很多的起始位:

Figure 1-4. 红外波形的起始位(StartBit)


数据由不断重复的两种波形结构组成:
Figure 1-5. 红外波形种的两种基本结构


这两种波形结构在其它红外编码规范中经常出现,因此可以合理的类比假设,“结构1”代表逻辑“0”,“结构2”代表逻辑“1”。

每一帧的结尾有一个结束位:
Figure 1-6. 红外波形的结束位(StopBit)


知道了数据的比特位信息,我感觉解码红外数据胜利就在前方,于是兴冲冲的开始人肉解码的工作:数一数逻辑分析仪软件上的波形数据,然后在纸上写下解码的逻辑位。

Figure 1-7. 人肉数据解码


我写出了两组数据以后,发现这样行不通,因为我还不知道红外数据的编码方式是LSB(Least Significant Bit-低位在前格式)还是MSB(Most Significant Bit-高位在前格式)。这样算下来,能够产生的组合数据量太大了,没一会我就数的头昏眼花了。并且我发现,空调遥控器的同一个按键发送的红外数据,一直在随时间不断的变化!

1.4.2 让计算机来数数
计数的工作,作为普通人类的我,当然是没有计算机效率高。所以我用VC编写了一个软件来代替我分析取逻辑分析仪保存下来的数据。根据上面对起始位,逻辑“0”,逻辑“1”,结束位的波形假设,对数据进行分析,列出载波的频率,原始的比特值,并且按照LSB和MSB两种方式解码数据等。

Figure 1-7. 对逻辑分析仪数据的自动解码输出


有了这个工具,我就不用对着逻辑分析的软件一个一个数比特位了。这样一来工作效率提高了不少呢。

1.4.3 对效验值的猜测
有了自动解码工具以后,我抓取了两组数据来进行观察按键的编码规律:

Figure 1-8. PowerOn, 13:26, Cold, 26Degree 红外数据 



Figure 1-9. PowerOn, 14:00, Cold, 26Degree 红外数据 


对比两次采集的数据,可以发现大部分的数据都相同,只有两个字节的数据不一样。实际上,通过进一步比较不同编码值可以发现,只要编码的数据有变化,不管有多少个数据是相同的,最后一个字节的数据必定也跟着变化,因此合理的猜测是,这个值是某种算法产生的效验值。数据末尾加一个效验值也是常用的编码方法。但我并不知道具体的效验算法,也不知道数据是LSB还是MSB编码的。所以我在红外解码程序中同时尝试了3种常见的效验方式:累加和,异或,以及CRC7。加上LSB和MSB两种编码方式,因此总共可以得到6个计算结果。

Figure 1-10. 效验值的三种尝试


结果是,最简单的累加和效验命中!同时我们也知道,数据的编码格式为LSB(低位在前,高位在后)。

另外一个方面,空调遥控器一次按键操作,发送的前后两帧数据,经过解码以后发现是完全相同的,并不像我原先预计的那样,是某种取反之后的比较值。

1.4.4 不断改变的红外数据
知道了红外数据的编码和效验,下一步就要分析红外编码随时间变化的原因。因为红外遥控器的同一个按钮,发送的红外数据一直在变化。这一款空调遥控器的控制面板上,又有时间的显示和设定。所以可以假设,在红外数据中有一个或者几个字节是和时间有关的变量。

为了证明这个假设,在不改变遥控器任何设置的情况下,我每隔几分钟就抓取一次遥控器开机的红外数据,并且用上面写的软件分析出编码数值。这个时候因为可以计算数据的效验码,所以我对数据的正确性有相当的信心。

Table 1-1. 随时间变化的红外数据

23,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd                // 10:4023,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd                // 10:4123,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd                // 10:4223,cb,26,01,00,20,58,0a,06,50,40,00,00,80,10,00,00,bd                // 10:4523,cb,26,01,00,20,58,0a,06,50,41,00,00,80,10,00,00,be                // 10:5223,cb,26,01,00,20,58,0a,06,50,41,00,00,80,10,00,00,be                // 10:5423,cb,26,01,00,20,58,0a,06,50,41,00,00,80,10,00,00,be                // 10:5523,cb,26,01,00,20,58,0a,06,50,42,00,00,80,10,00,00,bf                // 11:0123,cb,26,01,00,20,58,0a,06,50,42,00,00,80,10,00,00,bf                // 11:0923,cb,26,01,00,20,58,0a,06,50,43,00,00,80,10,00,00,c0                // 11:1023,cb,26,01,00,20,58,0a,06,50,4e,00,00,80,10,00,00,cb                // 13:00



对比表格中的数据,可以看到:

  • 前三次的数据是相同的。

  • 到了10:52分的时候,数据中的第11个字节增加了1。

  • 10:52到10:55之间的三次数据完全相同。

  • 到11:00时,数据的第11个字节再次增加了1。


所以规律就十分的明显了:每隔10分钟,红外数据当中的第11字节就会增加1。这样,假设第11个字节的数据是表示当前的时间,以10分钟为计数单位,从每天的零点开始算起。以24小时制来说的话:

第11个字节数据 = (取整数部分)[小时数H / 6 + 分钟数M / 10]


以上是我假设得到的数据,要证明我的假设是正确的,就必须能够根据这个公式,计算出其它时间点上,红外编码中第11个字节数据的值。
根据公式,在18:25时,第11个字节应该是:

18 * 6 + 25 / 10 = 110.5 取整数为110 = 0x6e


在23:55分的数据中,第11个字节应该是:

23 * 6 + 55 / 10 = 143.5 取整数为143 = 0x8f


为了验证结果的对错,我把空调遥控器上的时间调整成了18:25和23:55,然后分别截取了两次开机按钮的红外数据。

Figure 1-11. 18:25 空调开机红外数据 



Figure 1-12. 23:55 空调开机红外数据 


注意上图中软件输出的解码值中红圈的部分,就是第11个字节的数据,和推算的数值完全相同!

1.4.5 温度,制冷,制热和开关机
已经确定了红外编码中的两个变量:时间和效验值。因此,可以很方便的分析出其它的变化量。窍门是,每次只改变一个遥控器的状态,而保持其它的状态不变,就能很容易的看出编码的变化规律。简单说来,我找出了下面四个我感兴趣的变化规律:

对于温度数据:

第8个字节 = 设定温度 - 16


对于制冷模式:

第7个字节 = 0x58


对于制热模式:

第7个字节 = 0x48


对于开关机

第6个字节 = 0x20(开机),0x00(关机)


到这里为止,所有我感兴趣的红外遥控键值都已经解码出来了。对于空调的风向控制,体感测温方向等等,我不打算在远程遥控当中实现。我都已经不在家里了,难道还在乎空调风往哪里吹么?对于远程开关空调来说,只要能够开启制冷26度和制热22度两种模式,并且可以正常开关机。我认为就已经足够实用了。

2 用ARDUINO进行测试
2.5 发射电路
既然已经完全了解了空调的红外遥控编码,下一步就是试着用分析出的编码来发射红外线信号咯。

实现这个目的有很多种方法,不过我只是为了验证一下我分析出的遥控编码是不是正确的。最快的方法就是实用Arduino了发射红外线啦。

当然,我也没有直接将做好的设备拿去对着空调一通乱按。我先使用了上面自制的红外接收器和分析软件,看看自制的红外遥控器发出的编码,经过我自己的解码器以后,是不是和原装的遥控器发送的编码完全相同。算是一种交叉检验吧。(不,我不是处女座,只是有一点完美癖好)。

Figure 2-1. Arduino红外发射测试:


硬件的连接方式相当的简单:

红外LED正极 -> 5V
红外LED负极 -> 引脚2



2.6 Arduino源代码

操作的方式是,使用Arduino的串口工具,发送字符“s”,就发送制冷26度的空调红外开机命令。发送其它任意字符,就发送停机的红外命令

原配的遥控器编码中具有时间变量。Arduino无法获得当前的时间参数,所以遥控的时间参数被硬编码为18:25。当时的时间是18:21,几分钟之后,我使用Arduino发送了自己编制的红外代码(制冷26度开机):

0x23,0xcb,0x26,0x01,0x00,0x20,0x58,0x0a,0x06,0x50,0x54,0x00,0x00,0x80,0x10,0x00,0x00,0xd1



当听到空调主机发出一声”滴“的响声,表示成功接收了红外遥控信息的时候,真是十分的开心啊。

使用Arduino测试的结果:

  • 自制的红外编码可以对空调正常操作

  • 编码中的时间参数随意设定的话,也可以正常开关机,但我还是决定要加入真实的时间信息,完全保持和原装空调一模一样的编码来发送(不,我不是处女座,已经说过一次了)



3 制作USB红外发射器
3.1 发射电路
我不想把Arduino长时间的用来控制空调,所以需要重新制作一个新的硬件。设计一个新的硬件还是一件相对简单的事情。但是我实在是很讨厌画PCB啊。而且作电路板比较花时间,所以我直接用了上一次自己制作的USBWireless(USB to 2.4G控制器)的硬件,手动增加一个红外发送的接口,做成了一个USB to IR的设备。简单来说,就是可以通过USB接口,发送红外控制信号的东西。节省下来的时间,当然是拿来泡茶吃差点了哈哈。


3.2 可变更的红外参数
考虑到将来或许有更换空调的可能,但我不想那时候再重新把固件的代码重新拿出来编译烧写一次。所以我将USB红外发射器做成了参数可配置的。

通过变更不同的参数,就可以发射出不同格式红外编码。这样,兼容新的遥控编码就不用重新编译USB红外发射器的固件,直接编写新的shell脚本设置参数就OK啦。

更好玩的是,通过逻辑分析检测其它电器的遥控器,获取它们的编码规律以后。只要增加几个shell脚本,这个USB红外设备就可以控制电视或者机顶盒啦!

可变更的参数使用结构体的方式来表示:

typedef struct {        uint16_t forestClocks;        uint16_t flatTime;} bit_time_t;typedef struct {        uint16_t carrierClockHighDelayUs;                uint16_t carrierClockLowDelayUs;        uint16_t isLSB;        uint16_t sendStartBit;        uint16_t sendStopBit;        bit_time_t startBit;        bit_time_t stopBit;        bit_time_t logicalBit1;        bit_time_t logicalBit0;} ir_code_t;



3.3 红外数据输入格式
一个完整的红外控制信号通常包括几个帧。像上面的空调遥控器,就包含完全相同的两个帧数据。而有些电视遥控器,却具有取反效验的两个或者三个不同帧。因为很难计算一个红外数据帧发送完成的时间,所以在shell脚本里面来做红外数据中帧和帧之间的延时会不准确。

解决的方法是,将所有要发送的数据,包括数据的比特数,发送完成以后的延时等信息全部发送到USB红外发送器来进行处理

红外数据在USB设备中的处理:

bits = usbDataBuffer[index]; // 第一个字节为数据总比特数delayMs = usbDataBuffer[index + 1]; // 第二个字节为数据发送完成以后的延时(毫秒)IRWrite(&usbDataBuffer[index + 2], bits); // IR数据从第三个字节开始delay_ms(delayMs); // 一帧数据以后的延时index += (2 + bits / 8 + ((bits % 8) ? 1 : 0)); // 转跳到下一帧数据


4 RASPBERRYPI服务器
将USB红外发送器插在Linux主机上,我们就可以通过Linux来发送红外控制信号了。这个Linux主机就是RaspberryPi啦。

因为我的这个主机有做其它的用途,比如设置为我的在线鱼缸视频服务器,以及我的个人网站等等。所以已经配置了好apache和php,以及mjpeg-streamer等等。也安装了ddns的软件来维持外部网络的访问。

所以,只要在网络服务器上增加远程控制USB红外发送器的接口,我们就能够通过网络,远程的操控空调啦!

5 LINUX下的软件和脚本
5.1 u2w软件
Linux上的控制软件,使用前作(USB to 2.4G控制器)的软件来进行改装,相比较重新写一个,这样省事多了。增加了"-ac"选项来控制空调器的运作。软件的源代码可在文章最后下载。下面列出几个通过命令行发送空调红外编码的范例:

设定空调开机的范例1:

sudo ./u2w -ac -on -cold -t 26


设定空调开机的范例2:

sudo ./u2w -ac -on -hot -t 22


设定空调关机的范例:

sudo ./u2w -ac -off -cold -t 26


5.2 shell脚本的使用
使用命令行还不够灵活,需要编写控制空调的shell脚本,这样,即使以后命令行的参数有变化,也只需要改动shell脚本就可以,而且能够少打很多自负啊:

#!/bin/bash

if sudo /home/pi/usb2wireless/u2w -ac -$1 -$2 -t $3 | grep -q "[ok]" ; then
        exit 0
else
        exit 1
fi


调用的方式:

./ac.sh on cold 26
./ac.sh off hot 22


这里碰到一个问题,在windows下编辑过shell脚本以后,可能会出现错误:

/bin/bash^M: bad interpreter: No such file or directory


解决的方法是使用dos2unix进行结束符号的转换:

dos2unix open.sh


6 再见命令行-使用网页远程控制
6.1 界面设计
使用命令行来发送红外控制信号真是向前进了一步,但如果自己出门在外,拿出手机调用命令行实在是不方便。所以必须增加一个GUI的控制接口。

我选择使用网页的形式来进行远程控制,由于我的Linux主机已经运行了我的个人网站,所以增加一个页面来远程控制空调很方便。

使用网页来控制,也不要手机或者电脑安装额外的软件。也不需要关心是安卓手机还是苹果手机,总之,是各种方便就对了。

因为觉得用html的button控件看上去很丑啊,所以我使用iDraw来设计了一个简单的在线空调遥控器控制界面:




6.2 给图片添加按钮功能

接下来就是需要让图片上画出来的按钮变成能够点击的,真正的按钮。可以使用html的area标签,对遥控器控制图片添加HOT模式,COLD模式,以及电源按键三个按钮(因为显示问题,下面的area标签删除了标签符号‘<>’):




area                shape="rect"        coords="80,40,120,90" // 图像左上角为坐标原点        href="javascript:void(0)"        onclick="ACCommand(1)"        alt="coldMode"area        shape="rect"        coords="160,40,200,90"        href="javascript:void(0)"        onclick="ACCommand(3)"        alt="hotMode"area        shape="rect"        coords="50,280,390,380"        href="javascript:void(0)"        onclick="ACCommand(1)"        alt="powerOnOff"



6.3 javascript
到了这一步,按钮已经可以点击了。我们需要在点击按钮执行的函数中,使用javascript发送按键值给mjpeg-streamer服务器,来发送“快开启空调吧”这样的讯息。毕竟,是mjpeg-streamer在一直侦听和处理发往服务器的命令:


function ACCommand(value) {var cmd_line;                var msg;                cmd_line='./echo.php?cmd=ac_ctrl&value=' + value;if( (value == 0) || (value == 2) ) {                        msg = "确认要关闭空调吗?";                } else if (value == 1) {                        msg = "确认要开启制冷模式吗?";                } else if (value == 3) {                        msg = "确认要开启制热模式吗?";                } else {                        msg = false;                }if(msg != false) {if(confirm(msg)) { //点击确定按钮返回true                                AJAX_get(cmd_line); // 发送给mjpeg-streamer                        }                } else {                        document.write("page error");                }        }function AJAX_response(text) { // 返回值通过echo.php重新输出                location.reload(true); // 从服务器重载页面                alert("操作完成"); // 确认对话框        }



6.4 保存上次的状态
保存空调遥控器上一次的运行状态是很有必要的,不然,有可能需要不必要的多次操作空调,带来额外的损耗。所以,需要在服务器上保存空调上一次的操作状态。

在页面载入的时候读取服务器上的上一次运行状态的php代码,使用文件简单的保存数据:


if (file_exists('acstatus.php') == false) {        $fh = fopen('acstatus.php', "w");        fprintf($fh, "%s %s", "off", "cold");        fclose($fh);}// status = image file name$fh = fopen('acstatus.php', "r");fscanf($fh, "%s %s", $statusOnOff, $statusColdHot);fclose($fh);



在服务器接收mjpeg-streamer的返回值的php代码中,保存上一次操作的状态:


if ($cmd == 'ac_ctrl') {        $fh = fopen('acstatus.php', "w");                switch($value) {        case 0:                fprintf($fh, "%s %s", "off", "cold");break;        case 1:                fprintf($fh, "%s %s", "on", "cold");break;        case 2:                fprintf($fh, "%s %s", "off", "hot");break;        case 3:                fprintf($fh, "%s %s", "on", "hot");break;        default:                fprintf($fh, "%s %s", "off", "cold");        }        fclose($fh);}



6.5 mjpeg-streamer的修改
因为实际对USB红外设备进行操作的是mjpg-stramer。当然,为了能够增加新的功能,就必须对它的源代码进行一定的扩展和修改。以下是具体的修改步骤。

  • 在plugins/input.h中,修改枚举_in_cmd_t,增加新的命令类型:IN_CMD_AC_CTRL

  • 在plugins/output_http/httpd.h中,修改in_cmd_mapping结构体数组,将新增加的IN_CMD_AC_CTRL映射到http字符串命令“ac_ctrl"上

  • 在plugins/input_uvc/input_uvc.c中,修改int input_cmd(in_cmd_type, int)函数,增加处理IN_CMD_AC_CTRL命令的代码

  • 在处理IN_CMD_AC_CTRL的代码中,使用system()函数调用shell脚本来完成空调控制



7 完成!
经过一些细微的调整以后,这就是最后的结果了!

Figure 7-1. 最后的成品:

虽然界面简单,但因为是自己设计的,还是各种看的顺眼。

在iPhone上添加了这个网页的快捷方式,只要按下一个按钮,不管身在何处,都可以开启家里的空调啦。当然这个页面只有具有密码的管理员才能看到。我可不想任何人都能控制我家的空调。




8 工程文档和源代码

所有工程以及源代码下载,公众号后台回复关键词:014,或者远程空调,即可获得下载链接。




单片机爱好者 《51单片机逆向学习实战教程》一书作者,单片机爱好者,每天为单片机用户分享一篇精品电子电路方面的经验笔记或教程。
评论 (0)
  • 在嵌入式语音系统的开发过程中,广州唯创电子推出的WT588系列语音芯片凭借其优异的音质表现和灵活的编程特性,广泛应用于智能终端、工业控制、消费电子等领域。作为该系列芯片的关键状态指示信号,BUSY引脚的设计处理直接影响着系统交互的可靠性和功能拓展性。本文将从电路原理、应用场景、设计策略三个维度,深入解析BUSY引脚的技术特性及其工程实践要点。一、BUSY引脚工作原理与信号特性1.1 电气参数电平标准:输出3.3V TTL电平(与VDD同源)驱动能力:典型值±8mA(可直接驱动LED)响应延迟:语
    广州唯创电子 2025-03-26 09:26 204浏览
  • 在智能语音产品的开发过程中,麦克风阵列的选型直接决定了用户体验的优劣。广州唯创电子提供的单麦克风与双麦克风解决方案,为不同场景下的语音交互需求提供了灵活选择。本文将深入解析两种方案的性能差异、适用场景及工程实现要点,为开发者提供系统化的设计决策依据。一、基础参数对比分析维度单麦克风方案双麦克风方案BOM成本¥1.2-2.5元¥4.8-6.5元信噪比(1m)58-62dB65-68dB拾音角度全向360°波束成形±30°功耗8mW@3.3V15mW@3.3V典型响应延迟120ms80ms二、技术原
    广州唯创电子 2025-03-27 09:23 154浏览
  • 六西格玛首先是作为一个量度质量水平的指标,它代表了近乎完美的质量的水平。如果你每天都吃一个苹果,有一间水果店的老板跟你说,他们所卖的苹果,质量达到六西格玛水平,换言之,他们每卖一百万个苹果,只会有3.4个是坏的。你算了一下,发现你如果要从这个店里买到一个坏苹果,需要805年。你会还会选择其他店吗?首先发明六西格玛这个词的人——比尔·史密斯(Bill Smith)他是摩托罗拉(Motorloa)的工程师,在追求这个近乎完美的质量水平的时候,发明了一套方法模型,开始时是MAIC,后来慢慢演变成DMA
    优思学院 2025-03-27 11:47 149浏览
  • 汽车导航系统市场及应用环境参照调研机构GII的研究报告中的市场预测,全球汽车导航系统市场预计将于 2030年达到472亿美元的市场规模,而2024年至2030年的年复合成长率则为可观的6.7%。汽车导航系统无疑已成为智能汽车不可或缺的重要功能之一。随着人们在日常生活中对汽车导航功能的日渐依赖,一旦出现定位不准确或地图错误等问题,就可能导致车主开错路线,平白浪费更多行车时间,不仅造成行车不便,甚或可能引发交通事故的发生。有鉴于此,如果想要提供消费者完善的使用者体验,在车辆开发阶段便针对汽车导航功能
    百佳泰测试实验室 2025-03-27 14:51 188浏览
  • ​2025年3月27日​,贞光科技授权代理品牌紫光同芯正式发布新一代汽车安全芯片T97-415E。作为T97-315E的迭代升级产品,该芯片以大容量存储、全球化合规认证、双SPI接口协同为核心突破,直击智能网联汽车"多场景安全并行"与"出口合规"两大行业痛点,助力车企抢占智能驾驶与全球化市场双赛道。行业趋势锚定:三大升级回应智能化浪潮1. 大容量存储:破解车联网多任务瓶颈随着​车机功能泛在化​(数字钥匙、OTA、T-BOX等安全服务集成),传统安全芯片面临存储资源挤占难题。T97-415E创新性
    贞光科技 2025-03-27 13:50 148浏览
  • 在电子设计中,电磁兼容性(EMC)是确保设备既能抵御外部电磁干扰(EMI),又不会对自身或周围环境产生过量电磁辐射的关键。电容器、电感和磁珠作为三大核心元件,通过不同的机制协同作用,有效抑制电磁干扰。以下是其原理和应用场景的详细解析:1. 电容器:高频噪声的“吸尘器”作用原理:电容器通过“通高频、阻低频”的特性,为高频噪声提供低阻抗路径到地,形成滤波效果。例如,在电源和地之间并联电容,可吸收电源中的高频纹波和瞬态干扰。关键应用场景:电源去耦:在IC电源引脚附近放置0.1μF陶瓷电容,滤除数字电路
    时源芯微 2025-03-27 11:19 157浏览
  • 长期以来,智能家居对于大众家庭而言就像空中楼阁一般,华而不实,更有甚者,还将智能家居认定为资本家的营销游戏。商家们举着“智慧家居、智慧办公”的口号,将原本价格亲民、能用几十年的家电器具包装成为了高档商品,而消费者们最终得到的却是家居设备之间缺乏互操作性、不同品牌生态之间互不兼容的碎片化体验。这种早期的生态割裂现象致使消费者们对智能家居兴趣缺失,也造就了“智能家居无用论”的刻板印象。然而,自Matter协议发布之后,“命运的齿轮”开始转动,智能家居中的生态割裂现象与品牌生态之间的隔阂正被基于IP架
    华普微HOPERF 2025-03-27 09:46 109浏览
  • 文/陈昊编辑/cc孙聪颖‍2025 年,作为中国实施制造强国战略第一个十年计划的关键里程碑,被赋予了极为重大的意义。两会政府工作报告清晰且坚定地指出,要全力加速新质生产力的发展进程,推动传统产业全方位向高端化、智能化与绿色化转型。基于此,有代表敏锐提议,中国制造应从前沿技术的应用切入,逐步拓展至产业生态的构建,最终延伸到提升用户体验的维度,打出独树一帜、具有鲜明特色的发展牌。正是在这样至关重要的时代背景之下,于 AWE 2025(中国家电及消费电子博览会)这一备受瞩目的舞台上,高端厨房的中国方案
    华尔街科技眼 2025-03-25 16:10 82浏览
  • WT588F02B是广州唯创电子推出的一款高性能语音芯片,广泛应用于智能家电、安防设备、玩具等领域。然而,在实际开发中,用户可能会遇到烧录失败的问题,导致项目进度受阻。本文将从下载连线、文件容量、线路长度三大核心因素出发,深入分析烧录失败的原因并提供系统化的解决方案。一、检查下载器与芯片的物理连接问题表现烧录时提示"连接超时"或"设备未响应",或烧录进度条卡顿后报错。原因解析接口错位:WT588F02B采用SPI/UART双模通信,若下载器引脚定义与芯片引脚未严格对应(如TXD/RXD交叉错误)
    广州唯创电子 2025-03-26 09:05 146浏览
  • 家电,在人们的日常生活中扮演着不可或缺的角色,也是提升人们幸福感的重要组成部分,那你了解家电的发展史吗?#70年代结婚流行“四大件”:手表、自行车、缝纫机,收音机,合成“三转一响”。#80年代随着改革开放的深化,中国经济开始飞速发展,黑白电视机、冰箱、洗衣机这“新三件”,成为了人们对生活的新诉求。#90年代彩电、冰箱、全自动洗衣机开始大量进入普通家庭,快速全面普及,90年代末,家电产品实现了从奢侈品到必需品的转变。#00年代至今00年代,随着人们追求高品质生活的愿望,常用的电视机、洗衣机等已经远
    启英AI平台 2025-03-25 14:12 89浏览
  • 案例概况在丹麦哥本哈根,西门子工程师们成功完成了一项高安全设施的数据集成项目。他们利用宏集Cogent DataHub软件,将高安全设施内的设备和仪器与远程监控位置连接起来,让技术人员能够在不违反安全规定、不引入未经授权人员的情况下,远程操作所需设备。突破OPC 服务器的远程连接难题该项目最初看似是一个常规的 OPC 应用:目标是将高安全性设施中的冷水机(chiller)设备及其 OPC DA 服务器,与远程监控站的两套 SCADA 系统(作为 OPC DA 客户端)连接起来。然而,在实际实施过
    宏集科技 2025-03-27 13:20 109浏览
  • 在当今竞争激烈的工业环境中,效率和响应速度已成为企业制胜的关键。为了满足这一需求,我们隆重推出宏集Panorama COOX,这是Panorama Suite中首款集成的制造执行系统(MES)产品。这一创新产品将Panorama平台升级为全面的工业4.0解决方案,融合了工业SCADA和MES技术的双重优势,帮助企业实现生产效率和运营能力的全面提升。深度融合SCADA与MES,开启工业新纪元宏集Panorama COOX的诞生,源于我们对创新和卓越运营的不懈追求。通过战略性收购法国知名MES领域专
    宏集科技 2025-03-27 13:22 185浏览
  •       知识产权保护对工程师的双向影响      正向的激励,保护了工程师的创新成果与权益,给企业带来了知识产权方面的收益,企业的创新和发明大都是工程师的劳动成果,他们的职务发明应当受到奖励和保护,是企业发展的重要源泉。专利同时也成了工程师职称评定的指标之一,专利体现了工程师的创新能力,在求职、竞聘技术岗位或参与重大项目时,专利证书能显著增强个人竞争力。专利将工程师的创意转化为受法律保护的“无形资产”,避免技术成果被他人抄袭或无偿使
    广州铁金刚 2025-03-25 11:48 181浏览
我要评论
0
3
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦