专栏首页Fdu弟中弟Android 红外遥控

Android 红外遥控

刚刚放假,老爸就给了我一个任务,让我写个简易的app,用手机红外遥控他公司要用的单片机。之前在JetsonTx2小车的项目里有用过蓝牙和socket通信,还没尝试过红外,研究了一下,发现并不难。整个app两个小时就写好了,当然也没做什么界面的美化,主要还是把精力放在功能的实现上。

Android部分

Android有现成的红外类ConsumerIrManager可以用,代码都很简单,关键在于红外码的解读。

红外的编码格式一般为:引导码+用户编码低8位+用户编码高8位+数据码(8位)+数据码的反码(8位,校验用)

以我老爸的单片机为例:

  • 引导码:9ms的高电平+4.5ms的低电平
  • 用户编码:这个要看你自己的,我们的单片机为00000000 ffffffff
  • 数据码:这个要看你想传什么,以传16为例,就是0001 0110,前4位表示1,后4位表示6
  • 数据码的反码:看名字就知道要干嘛,还是以传16为例,就是1110 1001
  • 载波:38KHz

最后要把10用高低电平表示,在我老爸的单片机上,560ms的高电平+565ms的低电平表示0560ms的高电平+1690ms的低电平表示1

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:stretchColumns="0,1,2">
    <TableRow
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_margin="10dp">
        <Button
            android:id="@+id/send_button45"
            android:text="总开关"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#ff0000"
            android:textColor="#ffffff"
            android:textSize="25dp"/>
    </TableRow>
    <TableRow
        android:layout_height="0dp"
        android:layout_weight="1">
        <Button
            android:id="@+id/send_button0d"
            android:text="区号"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
        <Button
            android:id="@+id/send_button47"
            android:text="模式"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
        <Button
            android:id="@+id/send_button44"
            android:text="时间"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
    </TableRow>
    <TableRow
        android:layout_height="0dp"
        android:layout_weight="1">
        <Button
            android:id="@+id/send_button0c"
            android:text="统一时间"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
        <Button
            android:id="@+id/send_button18"
            android:text="统一模式"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
        <Button
            android:id="@+id/send_button16"
            android:text="分段定时"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
    </TableRow>
    <TableRow
        android:layout_height="0dp"
        android:layout_weight="1">
        <Button
            android:id="@+id/send_button40"
            android:text="+"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
        <Button
            android:id="@+id/send_button19"
            android:text="-"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="30dp"/>
        <Button
            android:id="@+id/send_button15"
            android:text="移位"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"/>
    </TableRow>
    <TableRow
        android:layout_height="0dp"
        android:layout_weight="1">
        <Button
            android:id="@+id/send_button09"
            android:text="开机"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"
            android:background="#0000ff"
            android:textColor="#ffffff"/>
        <Button
            android:id="@+id/send_button07"
            android:text="关机"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"
            android:background="#bb0000"
            android:textColor="#ffffff"/>
        <Button
            android:id="@+id/send_button43"
            android:text="确认"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20dp"
            android:background="#00aa00"
            android:textColor="#ffffff"/>
    </TableRow>
</TableLayout>

AndroidManifest.xml

加上这两句:

<!-- 红外遥控 -->
<uses-permission android:name="android.permission.TRANSMIT_IR" />
<!-- 仅在支持红外的设备上运行 -->
<uses-feature android:name="android.hardware.ConsumerIrManager" android:required="true" />

MainActivity.java

package com.example.hongwai;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.hardware.ConsumerIrManager;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "ConsumerIrTest";
    private ConsumerIrManager mCIR;

    @SuppressLint("InlinedApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取系统的红外遥控服务
        mCIR = (ConsumerIrManager) getSystemService(Context.CONSUMER_IR_SERVICE);
        initViewsAndEvents();
    }

    private void initViewsAndEvents() {
        findViewById(R.id.send_button45).setOnClickListener(mSendClickListener45);
       	//其余类似
    }

    private static int startH = 9000;
    private static int startL = 4500;

    private static int high8 = 560;
    //0:1125
    private static int low0 = 565;
    //1:2250
    private static int low1 = 1690;

    //用户编码高八位
    private static String userH = "00000000";
    //用户编码低八位
    private static String userL = "11111111";

    //38kHz
    private static int carrierFrequency = 38000;
    private static int[] pattern;

    private static List<Integer> list = new ArrayList<>();

    public static void change(String code) {
        int len = code.length();
        String part;
        for (int i = 0; i < len; i++) {
            list.add(high8);
            part = code.substring(i, i + 1);
            if (part.equals("0"))
                list.add(low0);
            else
                list.add(low1);
        }
    }

    View.OnClickListener mSendClickListener45 = new View.OnClickListener() {
        @TargetApi(Build.VERSION_CODES.KITKAT)
        public void onClick(View v) {
            if (!mCIR.hasIrEmitter()) {
                Log.e(TAG, "未找到红外发身器!");
                return;
            }
            list.clear();
            //引导码
            list.add(startH);
            list.add(startL);
            //用户编码
            change(userH);
            change(userL);
            //键数据码
            change("10100010");
            //键数据反码
            change("01011101");
            //发射时数据少一位
            change("1");

            int size = list.size();
            pattern = new int[size];
            for (int i = 0; i < size; i++) {
                pattern[i] = list.get(i);
            }
            mCIR.transmit(carrierFrequency, pattern);
        }
    };
    
	//其余类似
}

代码写的不好,不同的数据我就硬编码了,没动脑子。。。这里就不全贴出来,用”其余类似“表示了

实际操作中,数据码的传送要左右颠倒,比如16的数据码是00010110,那你就得写成01101000。我不知道为什么要这样,可能是我老爸的单片机接受数据的方式就是这样,开始一直不对,我也是试了几次才发现了这个规律。

还有个坑是发射时数据会少一位,所以我补了一位,这个问题也是仁者见仁,你可能压根遇不到这个问题。

单片机部分

这个咱也不知道是咋写的,咱也不敢问。反正老爸都写好了,用C语言写了一千多行,咱也不想看。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 红外线遥控灯

    红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计...

    跋扈洋
  • Android编程调用红外线遥控功能示例

    本文实例讲述了Android编程调用红外线遥控功能。分享给大家供大家参考,具体如下:

    砸漏
  • SONY NEX 5N相机遥控器红外码分析

    2、脉冲间隔应该是600us(高电平)(实测560~640之间,这是因为38k调制周期30us左右,解调设备不好,误差至少有一个载波周期)

    云深无际
  • MicroPython TPYBoard v102 无线红外遥控舵机(基于红外解/编码模块)

    该模块使用方法非常简单,只需要掌握基本的单片机TTL串口通信知识即可。将模块与开发板进行串口连接,通过串口发送指定的指令进行控制模块发射;通过串口接收方式进行红...

    阿莉埃蒂
  • Android开发笔记(一百六十五)利用红外发射遥控电器

    红外遥控是一种无线控制技术,它具有功耗小、成本低、易实现等诸多优点,因而被各种电子设备特别是家用电器广泛采用,像日常生活中的电...

    用户4464237
  • 用家里旧的红外遥控器控制树莓派小车

    红外遥控是一种无线、非接触控制技术,在工业控制、航空航天、家电等领域都得到了广泛应用。大部分的电视的遥控器,空调遥控器就都是红外遥控。在baidu上检索了树莓派...

    FB客服
  • 手把手教你DIY尼康ML-L3红外遥控器

    ML-L3是用于尼康部分型号相机的无线红外遥控器,可以通过红外方式来控制快门的释放,支持B门拍摄。官方售价100RMB左右,山寨版售价10RMB左右。虽然也能实...

    单片机点灯小能手
  • ESP8266_23基于硬件定时器的红外遥控器解码

    遥控器,做为和物联网设备通信的设备之一,用途还是蛮多的。毕竟像遥控器这类设备,成本低,功能强,一次可以满足多种需要。所以,这一节,咱们研究下用ESP8266,连...

    MCU起航
  • Touchjet WAVE:让电视变成巨型平板的智能硬件

    镁客网

扫码关注云+社区

领取腾讯云代金券