这两天做了一个非常简单的远程格力空调遥控,真的很简单,但是基本功能满足了。可以开关,改变温度。手机连接服务器,输入宿舍号和温度,然后你在图书馆就可以把空调开到23,回到宿舍直接吹凉风。过程中有一些小坑,这里记录一下。
  1.红外发射的问题。(1)红外发射的0和1的格式是确定的,看网上的博客都说“0”是600us低电平,600us高电平,“1”是600us低电平,1600us高电平。按照这个思路发送的波形根本不对,后来仔细看了正点原子关于红外接收的那个实验,才知道前面说的“0”和“1”的格式是接收端的格式。而红外接收头在没有接收到红外时,是高电平状态。所以实际上发射端的“0”和“1”的格式是,“0”是600us高电平(也就是发送37KHz的红外),600us低电平(不发送红外),“1”是600us高电平,1600us低电平。(2)在数据发送的时候,最后一位数据的发送问题最隐蔽。for循环结束后,我直接把管脚变成低电平,然后接收到的数据不对,想了好久,然后把十六进制展成二进制的0和1,发现少发送了一位,为什么呢?就是最后for循环结束,直接拉低电平的锅。发送的时候0或1的结束都是低电平,那么for循环结束前的最后一位的时候是低电平,然后结束后我直接就是低电平,问题来了,最后的一位的低电平和结束发送的低电平连到一块了,那么最后一位就被当成了结束,数据自然不对。解决办法,for循环结束,拉高电平600us,再拉低电平。就是正确的数据了。(3)最后,由于平常二极管都是接大电阻,这次接的是2K的电阻,发射距离不到2米,所以我改成了100欧的电阻,距离有5-6米。
  2.数据格式的问题。按照网上的格式组成的信息,而且为了简单,不需要的功能我都设为了0,然后空调没反应。所以格式错了?,为了弄明白问题,我把正点原子的红外接收的实验代码改了一下,可以接收网上说的那个格式,同时用示波器记录了接收的波形,接着用小米手机的万能遥控发送信息,观察接收的波形和数据。小米的手机发送了两次数据,第一次的数据就可以使用,但是为什么发送第二次,不知道。结论:其他博客说的,关于格里空调遥控的数据格式是不完全对的,有的接收数据字段和他们说的不一样,但是模式,开关,温度,这几个字段位置是一样的。而且发送的数据不要按照自己想的最简单的数据来发送。我们可以把小米的数据粘贴过来,作为一个数组,然后发送这个数组的内容,不久可以实现控制空调了吗。
  3.ESP8266连接的问题。首先直接用电脑串口,按照AT指令进行配置,没有问题。但是用stm32的串口的时候始终连接不上服务器。后来修改成while(atk_8266_send_cmd(str_p,“ALREADY”,200)),注意这里把接收的判断信息改成了ALREADY,而不是OK,为的是多次连接服务器,为什么这么做,因为他可能一次连接不上,但是好像返回有OK,然后误以为连接上了,修改完是最稳定的,肯定可以连接到服务器
  4.文件读写的问题。(1)我的思路是用户发送的数据写到一个文件,然后ESP8266连接到服务器后,读取这个文件获取温度。问题是我打开文件用的是“wr”,我想的是既可以读,也可以写,然而事实是写是可以写,读的时候,直接啥也没有。原因就是“w”,打开文件的时候,直接给我清空了,没数据了咋读呢。解决办法,判断这个进程是谁的(怎么判断,ESP8266的温度数据位置是0,用户的温度数据是温度,肯定不是0),用户就“w”打开,ESP8266的就“r”打开。(2)为了程序的健壮性,考虑到温度数据可能有错误,比如某些人发送“100度”,甚至“2334444003度”,直接把这个数据写到文件,遥控端读取数据的时候就 永远无法读取到正确数据 ,所以在接收用户的数据时,进行判断,if(temp<0||temp>99) temp=99;这样数据就是两位数,不会发生读取错误。