本文适用于在没有红外发射器的手机上,利用音频接口连接相关发射器进行信号发射。效果展示:http://t.cn/RLhOuCf

2016年2月28日更新:

使用音频还是要给手机插音频线,所以具有相当大的局限性。而且在开发过程中还不容易采样,容易受各种因素干扰。用声波模拟脉冲信号也具有一定难度。最近在玩Arduino,发现这个开发板很适合用来做采样和发射。

通过Arduino录制红外与播放红外信号的相关信息写在了这篇博文中:

http://blog.csdn.net/luhanglei/article/details/50762325

2016年06月07日更新

关于“正弦波”的作用:

通过在Arduino上实验就能知道,传感器接收红外信号的时候,并不是只要红外发光二极管亮起就是1,灭掉就是0。

红外接收器其实只接收频率为38KHz的信号(不是光的频率,就是通断电而闪烁的频率),因此当需要输出为1的信号的时候,发出的实际是一个20KHz(因为其实20KHz也可以被接收到)的信号,而不是常亮。



硬件:

作者的手机型号是nexus4,使用直接连接红外发射管(直接无反应)和DIY使用三极管,进行信号放大的方式(光太暗),均告失败。。。

在制作硬件的过程中,可以使用①用手机摄像头观察和②暂时用可见光发光二极管替代的方法查看效果。

最终解决方法:jd买了一个usb小音响(19RMB左右),把喇叭全都拆掉,将红外二极管串联相应大小的电阻(电阻大小多少合适,有公式请百度),焊接到原来喇叭的位置上。

效果图:

原理:手机输出的音频信号太弱,势必要进行放大才够我们使用,三极管放大的效果还是太弱。这时候小音箱就成了救命稻草了。。。它很便宜,关键是有着很成熟的音频信号放大电路!

以上内容完成以后可以使用现有的遥控类软件进行测试。

软件:

①首先查找要目标设备的遥控器编码文档。

②现在网上已经可以下到很多可以让手机当遥控器的软件了,他们不开源,但是可以获取他们输出的信号参考一下。

(下图是用一根两端都是公头的音频线,一端连接手机,另一端连接电脑麦克口,使用录音软件,用44100采样率录下来的,再用cooledit打开分析的。线也可以在jd买到,不到10块)

根据我空调的文档,前面9000μs高电平+4500μs低电平是起始码,后面的01都是高低电平组合,一高一低为一位,低电平短的是0,长的是1。放大以后可以看到,生成的是很漂亮的正弦波。

③自己根据需要生成带有高低电平的声波。

根据网上搜索到的正弦波生成算法,作者仿造了上面的正弦波,但发现再次用电脑声卡捕获以后,高电平全体在低电平一侧,而且低电平的坐标出现很大的偏移。

图中内容为低电平出现偏移,一开始认为是在播放一开始就发声会导致偏移,图中已经采取相关措施,看来这个猜想不正确。即使文件开始很久之后才开始发声,还是会偏移。

后来经过多次测试,发现问题出在“低电平”的处理上。在使用8bit pcm编码的情况下,一直认为正弦波与横轴交点的纵坐标意味着0,上为正,下为负,于是作者简单的将低电平置为了0x00,后来发现问题就出在这里。正弦波的与横轴的焦点,是整个宽度的中间值,而不是一个负值。

生成高低电平波代码如下(HEIGHT为振幅):

/*** @param waveLen 周期,每个周期占用多少次采样率* @param length  长度,单位同样是占用了多少次采样率。例如采样率为44100,需要1秒长,则length值为44100/waveLen* @return*/public static byte[] getHigh(int waveLen, int length) {byte[] wave = new byte[length];for (int i = 0; i < length; i++) {wave[i] = (byte) (HEIGHT * (1 - Math.sin(2 * Math.PI* ((i % waveLen) * 1.00 / waveLen))));}return wave;}public static byte[] getLow(int waveLen, int length) {byte[] wave = new byte[length];for (int i = 0; i < length; i++) {wave[i] = (byte) (HEIGHT);}return wave;}

生成0,1的代码如下:

private byte[] get0() {int highLength = (int) Math.round(sampleRate / 1000000.0 * HIGHTIME / WAVELEN) * WAVELEN;//采样率/1000000.0*高电平时间=高电平占用的采样次数,先除后乘是想得到一个整数倍的周期,具体有没有益处未证实byte[] high = getHigh(WAVELEN, highLength);int lowLength = (int) Math.round(sampleRate / 1000000.0 * LOWTIMEOF0 / WAVELEN) * WAVELEN;byte[] low = getLow(WAVELEN, lowLength);byte[] res = new byte[highLength + lowLength];System.arraycopy(high, 0, res, 0, high.length);System.arraycopy(low, 0, res, high.length, low.length);return res;}private byte[] get1() {int highLength = (int) Math.round(sampleRate / 1000000.0 * HIGHTIME / WAVELEN) * WAVELEN;byte[] high = getHigh(WAVELEN, highLength);int lowLength = (int) Math.round(sampleRate / 1000000.0 * LOWTIMEOF1 / WAVELEN) * WAVELEN;byte[] low = getLow(WAVELEN, lowLength);byte[] res = new byte[highLength + lowLength];System.arraycopy(high, 0, res, 0, high.length);System.arraycopy(low, 0, res, high.length, low.length);return res;}

将生成好的数据按照编码格式拼接起来,连接到发射器播放,即可控制空调等设备。

 AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_8BIT, wave.length, AudioTrack.MODE_STATIC);if (audioTrack != null) {audioTrack.write(wave, 0, wave.length);audioTrack.play();}

作者将以上功能放到了一个service中来控制,实现了安卓手表(android wear)控制空调的功能,效果:http://t.cn/RLhOuCf

建议在开发过程中遇到问题的时候多抓取音频分析,发现问题所在。

如果出现开头丢失的问题,可以在数据之前加入一定的中低电平和低电平信号,来当炮灰。


感谢

http://blog.csdn.net/kangear/article/details/39376105

http://m.blog.csdn.net/blog/caoshichao520326/8646913

基于android开发手机控制空调的程序(硬件+软件)相关推荐

  1. 基于Android的手机安全卫士的开发

    基于Android的手机安全卫士的开发 开发环境 处理器:Intel® Core™ i5-5200U CPU 2.20GHz 内存:4GB 硬盘:500GB 操作系统:Windows 7中文版,64位 ...

  2. 基于android平台的手机安全卫士的设计与实现 开题报告,开题报告-基于android的手机安全卫士的设计与开发.doc...

    毕业设计开题报告 题 目: 基于Android的手机安全卫士的设计与开发 专 业 计算机科学与技术 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 电气信息工程学院 专 业 负 责 人 ...

  3. android 控制空调,基于Android的多功能空调控制系统设计

    摘要: 随着信息技术,人工智能和控制技术的飞速发展,智能化和多功能化已经成为了新时代的发展趋势.空气调节器作为智能家居的一部分,正在扮演着越来越重要的角色.智能手机将成为智能家居中主要的控制平台.本文 ...

  4. android 空调界面,基于Android的多功能空调控制系统设计

    摘要: 随着信息技术,人工智能和控制技术的飞速发展,智能化和多功能化已经成为了新时代的发展趋势.空气调节器作为智能家居的一部分,正在扮演着越来越重要的角色.智能手机将成为智能家居中主要的控制平台.本文 ...

  5. php mysql 开发微博_php+mysql基于Android的手机微博应用开发

    摘要:本系统采用Eclipse作为开发工具,数据库基于MySQL,服务器的编写使用的是PHP语言,开发了基于Android平台开的C/S模式的手机微博系统.系统从符合操作简便.界面友好.使用灵活.实用 ...

  6. 茶百科 android 论文,基于android平台手机茶百科开发_学位论文.doc

    基于android平台手机茶百科开发_学位论文 摘要 随着智能手机一步步走进普通人的生活,它将成为人们获取信息的主要设备.因此,手机的应用服务将会有很大的发展空间,手机茶百科软件就是其中的一项.And ...

  7. android做拨号程序代码,Android开发手机拨号程序实现实例源码介绍

    Android开发手机拨号程序实现实例源码介绍,在上一篇文章中,我们实现了第一个程序:helloWorld,并成功测试完成.还给大家介绍了Android项目结构和说明.现在写一个手机拨号程序: 首先, ...

  8. 张利国,龚海平,王植萌.android移动开发入门与进阶,开题报告-基于Android的手机音乐播放器的设计与实现.doc...

    盐城师范学院 毕业设计开题报告 题 目: 基于android的手机音乐播放器 的设计与实现 姓 名: 二级学院: 信息工程学院 专 业: 软件工程 班 级: 12(1) 学 号: 指导教师: 职称: ...

  9. android企业手机安全软件开发,基于Android的手机安全管理软件的设计与实现毕业论文.doc...

    本资源来源于互联网,版权为原作者所有.若侵犯到您的版权,请提出指正,我们将立即删除. PAGE 2 年年青岛农业大学 毕 业 论 文(设计) 题 目: 基于Android的手机安全管理软件的 设计与实 ...

最新文章

  1. C语言会出现的错误,c语言,能运行但是偶尔会出现些错误,请高手们帮忙看看错在哪里啦...
  2. MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK.
  3. 超酷的实时颜色数据跟踪javascript类库 - Tracking.js
  4. qt中的update()
  5. leetcode 24. Swap Nodes in Pairs | 24. 两两交换链表中的节点(Java)
  6. 修改mysql表的itemId字段为自增长SQL语句
  7. 计算机网络钟提供并管理,在计算机网络中通常把提供并管理共享资源的计算机称为...
  8. 使用ST05研究customer product id存储逻辑
  9. 简单技能之程序调试入门
  10. java 字符串拆分技巧_在java中如何拆分一个字符串?
  11. fortran和python的效率_Fortran数值计算真的比C快吗,经测试是一样快的,是不是很多人都在以讹传讹?...
  12. turbo编译码c语言,Turbo码的编译码原理及仿真.pdf
  13. 【华为机试题 HJ102】字符统计
  14. 【20】前端实习:react官方文档学习(构成与继承)
  15. CSS两种盒模型(标准盒模型IE盒模型)
  16. 转: qemu-kvm内存管理
  17. Ubuntu防火墙状态整理
  18. 第五章 卡耐基驾驭竞争与合作 一 合作与竞争的魅力
  19. 视觉SLAM--直接法
  20. MySQL 6:MySQL存储过程、存储函数

热门文章

  1. 用压力传感器测量小米净水器及接管线机的改装方案
  2. java tomcat jvm内存_Tomcat修改JVM内存,修改了就是不生效,
  3. Mac使用QuickFTP Server 搭建FTP 服务器
  4. 离婚数据可视化,经济越发达的地区离婚率越高,但为何天津离婚率最高?
  5. 20秋学期计算机辅助设计在线平时作业3,东大20秋学期《计算机辅助设计基础》在线平时作业3(100分)...
  6. OA系统十六:请假申请二:【请假申请】这个内嵌界面中【提交请假表单数据】的SQL语句和Dao层;
  7. SQL Server 数据库基础笔记分享(上)
  8. 小米note3android版本彩蛋,小米MIX2发布会日期确定,小米Note3包装盒曝光,小米Note3或成为彩蛋?...
  9. 计算机风扇介绍,怎样将风扇添加到计算机散热器
  10. [搞笑贴]谁说程序员不会写诗?看我的《诗二首》