先讲一下整体思路哈!手机肯定不能直接控制台灯的,需要一个中间物来协调,在这里我用的是51单片机(如果大家不知道也没关系,下面我还会说的)。接下来就是具体怎么控制的,其实原理挺简单的。1.手机通过蓝牙来与单片机通信,因而单片机需要外接一个蓝牙模块(我用的是hc-05 主从一体 蓝牙模块)。大家千万不要被外接给吓到了,外接模块一点都不难的,就只要去淘宝卖相应的模块然后用杜邦线(不知道的可以把它当做导线来理解)和51单片机连起来就好了。到这里手机已经可以和51单片机通信了,也就是说手机可以给单片机发送“开灯”和“关灯”的消息了。2.接下来就要解决当51单片机接收到”开灯“和”关灯“的消息后,该怎么控制台灯实际的开关?这个时候我们就需要一个继电器(也是单片机的外接模块),关于继电器我们可以看下面的图片。继电器一共有三个输出端口(常开端 公共端 常闭端)。事先申明,我们可以通过单片机控制继电器的公共端是和常开端

连通,还是和常闭端连通。现在我们只需要剪断台灯的一根电线,将电线的两头分别和继电器的常开端和公共端连接起来即可。通过单片机控制继电器的公共端和常开端连接时台灯打开,反之台灯关闭。大致原理就是这样,我们来梳理一下整个流程。首先手机通过蓝牙和单片机的蓝牙模块建立通信,当手机发送一个打开台灯信号时,单片机收到相应的信号并控制继电器的公共端指向常开端,台灯亮起。

next~就是具体实现了。一共分为两大部分,分别是Android端和单片机端,先从Android端开始说起。

一.Android端:

Android端其实就是一个简单的蓝牙通信,Android端只需要通过蓝牙向单片机的蓝牙模块发送开关对应的消息即可(我是用0xff表示打开台灯,0x00关闭台灯)。先来看看工程的总体结构以及软件界面。

其中BluetoothTool类是一个蓝牙工具类,里面有关于蓝牙的连接以及发送接收数据功能。IUpdateUI是一个接口,用来在 BlurtoothTool中更新主界面的设备列表以及log。MainAty就是主界面的Activity。activity_main.xml和layout_lv_devices_item.xml不用多说了吧,就是一些界面有关的。关于Android端的解析以贴代码为主,因为代码中我都有详细的解释,比较重要的我会在博客中用文字再次解释的。

1.MainAty:

获取蓝牙适配器,可以通过蓝牙适配器获取蓝牙设备的信息。

/**

  • 获得默认的蓝牙适配器
    */
    private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

如果手机没打开蓝牙,则界面跳转到打开蓝牙界面。

@Override
protected void onStart() {
super.onStart();

/** 判断蓝牙是否可用,不可用时请求打开*/
if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivity(intent);
}

}

通过蓝牙适配器获取之前匹配过的蓝牙设备信息(如单片机的蓝牙设备),所以第一次使用的时候,先用手机自带的蓝牙匹配成功一次哈!蓝牙设备中一个比较重要的信息就是设备地址-如98:D3:33:80:83:05就是一个蓝牙设备地址,唯一标示。

/** 获取以前匹配过的蓝牙设备*/
Set devices = null;
if (mBluetoothAdapter != null)
devices = mBluetoothAdapter.getBondedDevices();
else
Toast.makeText(MainAty.this, "该设备不支持蓝牙功能 ", Toast.LENGTH_SHORT).show();

    if (devices != null && devices.size() > 0) {data.clear();for (BluetoothDevice device : devices) {HashMap<String, Object> map = new HashMap<>();map.put("lv_left_icon", R.drawable.lv_left_icon);map.put("lv_address", device.getAddress());map.put("lv_right_icon", R.drawable.lv_right_white);data.add(map);}} else {HashMap<String, Object> map = new HashMap<>();map.put("lv_left_icon", R.drawable.lv_left_icon);map.put("lv_address", "没有已经匹配的设备");map.put("lv_right_icon", R.drawable.lv_right_white);data.add(map);mTextView.append("没有已经匹配的设备" + "\r\n");}simpleAdapter.notifyDataSetChanged();

连接指定的蓝牙:通过调用BluetoothTool连接蓝牙,我们传入了设备的地址"(String) data.get(0).get(“lv_address”)"以及连接类型 BluetoothTool.ServiceOrClient.CLIENT(这里我们是以客户端的形式连接,也就是单片机的蓝牙当作客户端 )。之后设置了BluetoothTool的更新UI接口,并在MainAty中具体实现。
builder.setPositiveButton(“连接”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mBluetoothTool = new BluetoothTool((String) data.get(0).get(“lv_address”),
BluetoothTool.ServiceOrClient.CLIENT);
mBluetoothTool.SetOnIUpdateUI(new IUpdateUI() {
@Override
public void updateListViewDevices() {
for (int i = 0; i < data.size(); i++) {
if (i == index) {
data.get(i).put(“lv_right_icon”, R.drawable.checked);
continue;
}
data.get(i).put(“lv_right_icon”, R.drawable.lv_right_white);
}

            simpleAdapter.notifyDataSetChanged();}@Overridepublic void updateLog(String msg) {mTextView.append("\r\n" + msg);}});}

});

可以看到打开台灯按钮的点击事件,只是调用了BluetoothTool的发送功能向单片机蓝牙发送了一个ff消息(具体发送时将ff转化成16进制0xff,因而在单片机端我们会收到一个0xff的数据)。关闭事件同上。

@Override
public void onClick(View view) {
int id = view.getId();

switch (id) {case R.id.id_btn_open:if (mBluetoothTool != null) {mBluetoothTool.sendData("ff");} elseToast.makeText(MainAty.this, "蓝牙未连接...", Toast.LENGTH_SHORT).show();break;case R.id.id_btn_close:if (mBluetoothTool != null) {mBluetoothTool.sendData("00");} elseToast.makeText(MainAty.this, "蓝牙未连接...", Toast.LENGTH_SHORT).show();break;default:break;
}

}

2.BluetoothTool

传入的蓝牙设备地址(一般是单片机端蓝牙的地址)
/**

  • 蓝牙设备地址
    */
    private String mBluetoothAddress = null;

通过传入的蓝牙地址获取相应的蓝牙设备。

/**

  • 蓝牙设备
    */
    private BluetoothDevice mDevice = null;

mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mBluetoothAddress);

这里我们都是以客户端的形式连接的。(也就是单片机上的蓝牙是客户端)。

/**

  • 枚举 表示是客户端还是服务端
    */
    public static enum ServiceOrClient {
    NONE, SERVICE, CLIENT
    }
    private ServiceOrClient mServiceOrClient = ServiceOrClient.NONE;

Handler 用来更新UI

private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_LISTVIEW:
if (iUpdateUI != null)
iUpdateUI.updateListViewDevices();
break;
case MSG_UPDATE_LOG:
if(iUpdateUI!=null)
iUpdateUI.updateLog(msg.obj + “”);
break;
}
}
};

单片机的蓝牙与手机端的蓝牙通信的socket,说明一下蓝牙通信其实也是基于socket通信的。

/**

  • 蓝牙客户端socket
    */
    private BluetoothSocket mClientSocket = null;

以客户端身份连接的线程,我们来看看具体实现。

/**

  • 客户端线程
    */
    private ClientThread mClientThread = null;

通过蓝牙设备获取相应的socket,之后单片机的蓝牙和手机的蓝牙通信都是通过这个socket。其中在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (UUID)来校验。而且这个UUID的值必须是00001101-0000-1000-8000-00805F9B34FB,这个是android的API上面说明的,用于普通蓝牙适配器和android手机蓝牙模块连接的。获取之后通过socket的connect进行连接,连接成功之后开启读取数据的线程。

/**

  • 客户端线程
    /
    private class ClientThread extends Thread {
    @Override
    public void run() {
    super.run();
    try {
    /
    * 客户端通过服务端的UUID与之连接*/
    mClientSocket = mDevice.createRfcommSocketToServiceRecord(
    UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));

         Message msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "正在连接。。。";mHandler.sendMessage(msg);/** 连接*/mClientSocket.connect();msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "连接成功";mHandler.sendMessage(msg);msg = Message.obtain(null, MSG_UPDATE_LISTVIEW);mHandler.sendMessage(msg);/** 接收数据*/mReadThread = new ReadThread();mReadThread.start();} catch (IOException e) {e.printStackTrace();Message msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "连接失败";mHandler.sendMessage(msg);}
    

    }
    }

可以看到线程一直在查看有没有数据,如果有的话就接受,并根据接收到的数据进行相应的显示。有一点要先说一下,就是如果手机成功发送了一个开灯命令给单片机,单片机收到之后成功控制继电器将台灯打开之后,单片机会回发一个消息0xff给手机。因此手机端只要收到0xff这个消息,就知道台灯打开成功了手机就可以显示台灯成功开启。

/**

  • 读取数据线程
    */
    private class ReadThread extends Thread {
    @Override
    public void run() {
    super.run();

     byte[] buffer = new byte[1024];int bytes;InputStream in = null;try {in = mClientSocket.getInputStream();while (true) {if ((bytes = in.read(buffer)) > 0) {byte[] buf_data = new byte[bytes];for (int i = 0; i < bytes; i++) {buf_data[i] = buffer[i];int j = buffer[i];j = buffer[i] & 0xff;String str = Integer.toHexString(j);if ("ff".equals(str)) {Message msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "台灯打开";mHandler.sendMessage(msg);} else if ("0".equals(str)) {//注意不能用00,因为0x00实际的值是0Message msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "台灯关闭";mHandler.sendMessage(msg);} else {Message msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "err...";mHandler.sendMessage(msg);}}}}} catch (IOException e) {e.printStackTrace();Message msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "连接数据失败";mHandler.sendMessage(msg);} finally {if (in != null)try {in.close();} catch (IOException e) {e.printStackTrace();}}
    

    }
    }

向单片机发送数据,通过socket获取相应的输出流,然后将要发送的字符串转化成16进制发送。

/**

  • 发送数据

  • @param str
    */
    public void sendData(String str) {
    if (mClientSocket == null) {
    Log.d(TAG, “sendData: 没有连接。。。”);

     Message msg = Message.obtain(null, MSG_UPDATE_LOG);msg.obj = "没有连接";mHandler.sendMessage(msg);return;
    

    }

    OutputStream out = null;
    try {
    out = mClientSocket.getOutputStream();
    out.write(getHexBytes(str));
    } catch (IOException e) {
    e.printStackTrace();
    Message msg = Message.obtain(null, MSG_UPDATE_LOG);
    msg.obj = “发送失败”;
    mHandler.sendMessage(msg);

    }
    }

连接蓝牙,就是启动客户端连接线程。

/**

  • 连接蓝牙
    */
    private void connect() {
    if (mIsConnected == true) {
    Log.d(TAG, “connect: 已经连接”);
    Message msg = Message.obtain(null, MSG_UPDATE_LOG);
    msg.obj = “已经连接”;
    mHandler.sendMessage(msg);
    return;
    }

    /** 客户端*/
    if (mServiceOrClient == ServiceOrClient.CLIENT) {
    if (!mBluetoothAddress.equals(“null”)) {

         mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mBluetoothAddress);mClientThread = new ClientThread();mClientThread.start();mIsConnected = true;} else Log.d(TAG, "connect: address is null");
    

    }

}

Android端项目github地址:https://github.com/973927190/TableLamp

二.单片机端:

说具体实现之前,先要说一下用到的设备。

1.51单片机开发板 附上博主买的地址

https://s.click.taobao.com/t?e=m%3D2%26s%3DdECpF7ooI6kcQipKwQzePOeEDrYVVa64LKpWJ%2Bin0XLjf2vlNIV67jfX11I6drP0ZW7hPg9HazhMVPdbt3fgwWT400sgLOAr5yw7SOOxWj33gRJpVZU6CBJv5lTqaGlY1MwyhkSzfY8PK7UwQBlvCi1cJAQEP%2BovMtfwQouT7qg%3D&pvid=10_183.39.58.9_28045_1558880259675
2.杜邦线(公对母,母对母,公对公) 附上博主买的地址

https://s.click.taobao.com/t?e=m%3D2%26s%3DePhW7ZvPQm8cQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67uEKCHZPv3GYxT40F5yyh61MVPdbt3fgwWT400sgLOAr5yw7SOOxWj33gRJpVZU6CBJv5lTqaGlYwI0svZcyUg2UIG1bHEE7hAlE7kG%2FgUXMSUm0FQ9tsQ8hhQs2DjqgEA%3D%3D&pvid=10_183.39.58.9_2309_1558880456607

3.继电器(1路继电器模块带光耦隔离 支持高低电平触发 5V 一路) 我的台灯是usb接口的电压挺小的,大家也用这种台灯做这个吧。附上博主买的地址

https://s.click.taobao.com/t?e=m%3D2%26s%3DXHEpqAhkLN0cQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67vIXkCidw5j8Buky%2F0Sep%2BFMVPdbt3fgwWT400sgLOAr5yw7SOOxWj33gRJpVZU6CBJv5lTqaGlY88T0Kqszwju%2BrJEQg3xQGYHYFIyN9t40GseKnlMOipY%3D&pvid=10_183.39.58.9_6879_1558880691417
4.蓝牙模块(HC-05 主从机一体蓝牙模块 无线蓝牙串口透传模块 无线模块) 附上博主买的地址

https://s.click.taobao.com/t?e=m%3D2%26s%3D4sZwMIIdBd8cQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67nBoGrJUNUrSu6Vvho8Zh8BMVPdbt3fgwWT400sgLOAr5yw7SOOxWj33gRJpVZU6CBJv5lTqaGlY4jXVaulmfG%2Bg1L7XvuNuZdt1sQVgCqdt5wealhvKxmk%3D&pvid=10_183.39.58.9_2829_1558880799406

哈哈 先给大家看一看单片机方面的代码 大家看了之后肯定就会有动力写了!

#include <reg52.h>
unsigned char flage,temp;
sbit p33=P3^3;//单片机P3.3口

void main()
{
TMOD=0x20;//设置定时器1为工作方式2
// 波特率=9600时定时初值为FDH
TH1=0xfd;//装载TH1
TL1=0xfd;//装载TL1
TR1=1;//启动T1(定时器1),开始计数
REN=1;//允许串行接收
//SM0=0 SM1=1 为工作方式2
SM0=0;
SM1=1;
EA=1;//开启总中断
ES=1;//允许串口产生中断

while(1)
{if(flage==1){ES=0;//不允许串口产生中断 保证此次操作安全flage=0;SBUF=temp;//发送数据while(!TI);TI=0;//取消此次中断申请ES=1;//允许串口产生中断}
}

}

void interrupt4() interrupt 4//4号中断 处理函数
{
RI=0;//取消此次中断申请
if(SBUF0xff)//开灯
p33=1;//单片机P33口置为高电平
else if(SBUF0x00)//关闭
p33=0;//单片机P33口置为低电平
temp=SBUF;
flage=1;
}

是不是看起来感觉挺少挺简单的,没错这就是单片机方面的所有代码。个人感觉单片机方面代码其实问题不是很大的,主要是硬件方面的问题,所以代码先放一放,我们先来说说具体器件的问题。

1.51单片机

图一是单片机开发板,其中开发板中间那个长方形就是51单片机,图二就是单个的51单片机,图三是51单片机的引脚图。引脚就是单片机裸露在外面的银色导体,引脚可以输出高电压(等价于逻辑“1”)也可以输出低电压(等价于逻辑“0”)。补充一下电平信号的概念,TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”,这被称做TTL(晶体管-晶体管逻辑电平)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。个人认为单片机最重要的一个特性就是我们可以往单片机中写入自己的程序(C++/C/汇编 这个过程也叫做烧写程序),通过自己的程序控制单片机各个引脚的输出电压,然后在通过引脚的输出电压来控制相应的外接模块。外接模块就是将单片机的引脚和模块的引脚连接起来,单片机引脚的输出电压当做模块引脚的输入电压。如果之前没有接触过单片机开发的,博主强烈建议去看看“郭天祥十天学会单片机的视频教程”。如果你去淘宝买了单片机开发板到时会有一张光盘里面有很多的资料 教学视频 开发工具 以及配套开发板的结构图,郭天祥十天学会单片机的视频教程光盘里也有的。博主我将单片机有关的资料全部打包上传了 http://pan.baidu.com/s/1hrYwv1U

                          图一                                                                                         图二                                                                             图三

2.HC-05主从一体蓝牙模块

HC-05主从一体蓝牙模块一共有6个引脚,我们只需要关注VCC,GND,TXD,RXD 这四个引脚。VCC:电源端,接单片机的VCC(高电平)。GND:接地端,接接单片机的GND端(低电平)。TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD(我的单片机P30口是RX端)。RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD(我的单片机P31口是TX端)。led指示蓝牙连接状态,快闪表示没有蓝牙连接,慢闪表示进入AT模式,双闪表示蓝牙已连接并打开了端口。注意! 不要将电源接到信号脚上,会直接烧坏。有可能你们的单片机RXD端,TXD端和我的不一样,这个就要去看光盘里的开发板结构图了,里面有画出来的。这里我想提醒一下大家,单片机烧写程序也是通过RXD端和TXD端。所以在烧写的时候要确保RXD端和TXD端没有外接其他模块,如果你接了蓝牙就会烧写失败。

蓝牙模块的编程本质上就是串口编程,串口编程大家可以去看看“郭天祥十天学会单片机的视频教程”里面有相应的教学。在这里我稍微解释一下波特率,波特率,可以通俗的理解为一个设备在一秒钟内发送(或接收)了多少码元的数据。为了在彼此之间通讯,蓝牙收发端必须使用相同的波特率进行操作。如果将接收方的波特率设置为高于发送方的波特率,则接收数据时会出现错误。 hc-05可以用指令调节波特率,我们就用默认的9600bps。。在单片机代码中,我们要通过设置单片机的计数器将将单片机的波特率也调成9600,同时打开中断开关,这部分的代码如下。

TMOD=0x20;//设置定时器1为工作方式2
// 波特率=9600时定时初值为FDH
TH1=0xfd;//装载TH1
TL1=0xfd;//装载TL1
TR1=1;//启动T1(定时器1),开始计数
REN=1;//允许串行接收
//SM0=0 SM1=1 为工作方式2
SM0=0;
SM1=1;
EA=1;//开启总中断
ES=1;//允许串口产生中断蓝牙模块收到数据会触发4号中断,程序进入4号中断处理函数。我们只要重写中断函数如下。51单片机有两个物理上独立的接收 发送缓冲器SBUF,它们占用同一地址99H。 在中断处理函数中通SBUF存储着蓝牙模块接收到的数据。将其和我们自己定义的‘开’和‘关’进行比较,如果接收到的数据是0xff就将pP33口置为高电平(打开台灯),反之接收到的数据是0x00就将pP33口置为低电平(关闭台灯)。单片机的P33口又和继电器的控制端口连接(这个我们之后会具体分析的)。

void interrupt4() interrupt 4//4号中断 处理函数
{
RI=0;//取消此次中断申请
if(SBUF0xff)//开灯
p33=1;//单片机P33口置为高电平
else if(SBUF0x00)//关闭
p33=0;//单片机P33口置为低电平
temp=SBUF;
flage=1;
}

在中断函数中,处理完所有操作之后都会将flage置为1。在main函数中有一个无限循环,其中如果flage=1的话 就通过SBUF发送数据给手机端的蓝牙。发送的temp就是收到之前接收到的数据,还记得在之前分析Android端BluetoothTool的接收函数的时候,有说到如果手机成功发送了一个开灯命令给单片机,单片机收到之后成功控制继电器将台灯打开之后,单片机会回发一个消息0xff给手机。因此手机端只要收到0xff这个消息,就知道台灯打开成功了。具体发送过程就是在下面的代码中完成的,至于代码中ES TI这些都是和串口编程有关的,个人建议去看看视频教学比较好。

while(1)
{
if(flage==1)
{
ES=0;//不允许串口产生中断 保证此次操作安全
flage=0;
SBUF=temp;//发送数据
while(!TI);
TI=0;//取消此次中断申请
ES=1;//允许串口产生中断
}
}

3.继电器(1路继电器模块带光耦隔离 支持高低电平触发 5V 一路)

继电器模块接口有1、DC+:接电源正极(电压按继电器要求,有5V.9V.12V和24V选择)2、DC-:接电源负极3、IN:可以高或低电平控制继电器吸合。 IN端是用来控制继电器公共端是和常闭端连接还是和常开端连接用的,如果IN端是高电平那么继电器的公共端就和常闭端连接,反之公共端和常开端连接。我是将IN端和单片机的P33口连接,通过改变单片机P33端上的电平,从而改变继电器IN端的电平,达到控制继电器开合的效果。这里非常有必要说明一点,就是继电器的IN端和单片机的哪个口连的问题。不是所有的端口都可以连得,要接有上拉电阻的端口才可以,因为如果没有接上拉电阻的端口就算在代码中将该端口置为1,实际中该端口电压达不到高电压,只有接有外接电阻端口的电压才能达到高电压。至于怎么判断单片机端口是不是有接外接电阻有两种方法,一看单片机(开发板)的结构图找到接有外接电阻的端口,二是自己一个一个试过去。如代码所示,打开台灯的时候将P33口置为1(1是高电平 0是低电平)。

继电器输出端:1、NO: 继电器常开接口,继电器吸合前悬空,吸合后与COM短接 2、COM:继电器公用接口 3、NC: 继电器常闭接口,继电器吸合前与COM短接,吸合后悬空

if(SBUF==0xff)//开灯p33=1;//单片机P33口置为高电平
else if(SBUF==0x00)//关闭p33=0;//单片机P33口置为低电平

4.台灯

台灯方面主要就是将台灯的一根导线(零线或者火线)弄断,然后两端分别继电器的NO(继电器常开接口) COM(继电器公用接口)连接就好。这里要注意,台灯要是那种USB接口的,USB接口的有降压器会将220V降下来的。千万不要用那种不是USB的,那种电压太高太危险了,而且继电器也承受不了这么大的电压,要买相应的继电器。 切记!

5.单片机代码

#include <reg52.h>
unsigned char flage,temp;
sbit p33=P3^3;//单片机P3.3口

void main()
{
TMOD=0x20;//设置定时器1为工作方式2
// 波特率=9600时定时初值为FDH
TH1=0xfd;//装载TH1
TL1=0xfd;//装载TL1
TR1=1;//启动T1(定时器1),开始计数
REN=1;//允许串行接收
//SM0=0 SM1=1 为工作方式2
SM0=0;
SM1=1;
EA=1;//开启总中断
ES=1;//允许串口产生中断

while(1)
{if(flage==1){ES=0;//不允许串口产生中断 保证此次操作安全flage=0;SBUF=temp;//发送数据while(!TI);TI=0;//取消此次中断申请ES=1;//允许串口产生中断}
}

}

void interrupt4() interrupt 4//4号中断 处理函数
{
RI=0;//取消此次中断申请
if(SBUF0xff)//开灯
p33=1;//单片机P33口置为高电平
else if(SBUF0x00)//关闭
p33=0;//单片机P33口置为低电平
temp=SBUF;
flage=1;
}

到这里手机控制台灯的开关有关内容都已经介绍完毕,大家不妨自己动手做一个,挺有趣的。

Android端项目github地址:https://github.com/973927190/TableLamp

单片机端项目:http://pan.baidu.com/s/1i4P87dj

单片机有关的资料: http://pan.baidu.com/s/1hrYwv1U

如果手机控制台灯开关的做出来了,大家也可以做做手机控制台灯暗亮的,可以用电阻来做的哈,

手机android app 无线控制led灯开关相关推荐

  1. 利用 Andorid 手机连接 Arduino 并控制 LED灯开关

    利用 Andorid 手机连接 Arduino 并控制 LED灯开关 ***首先,将 Arduino 断电***,然后按着蓝牙模块上的黑色按钮,再让 Arduino 通电,如果蓝牙模块指示灯按2秒的频 ...

  2. 无线授时服务器接LED屏,实现ipad远程无线控制led大屏幕分以下几个步骤!

    原标题:实现ipad远程无线控制led大屏幕分以下几个步骤! 不通过电脑有线控制,实现IPAD无线式.移动式.同步无延时控制LED大屏幕(液晶屏拼接墙等大屏幕也实用),让控制大屏幕的方式变得简单化.傻 ...

  3. 如何用手机和华为平板控制LED透明屏?方法及功能盘点!

    现在LED透明屏管理及播放越来越方便了,目前已经实现移动手机或平板端的控制,即使身处异地,通过手机端网络发送信息显示在大屏上,已经成为现实.LED透明屏专业厂家联曼光电带您来一起了解. 一.手机与华为 ...

  4. 使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

    上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断 ...

  5. 【物联网(IoT)开发】使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

    上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断 ...

  6. android+app+wifi+控制+协议,玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(数量无限制)+ Android App控制...

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.但愿你们分享给你周边须要的朋友或者同窗,说不定大神成长之路有博哥的奠定石...android 若是以为有用,麻烦点赞收藏,您的 ...

  7. STM32F103单片机温湿度等监测Android手机蓝牙APP显示控制设计

    这次给大家介绍的是一个温湿度,光照烟雾等监测设计,包含开关灯.基于STM32F103单片机(正点原子mini板).蓝牙模块.Android APP完成.软件是Android studio 2021.1 ...

  8. Arduino红外控制LED灯开关

    Arduino红外光电反射传感器模块 本章主要实现:通过红外模块控制LED的亮和灭.当遮挡住红外时,LED点亮:不遮挡住红外时,LED熄灭. 1.需要设备: 1.LED灯一个: 2.一个欧姆电阻: 3 ...

  9. Arduino用遥控器控制LED灯开关和亮度

    最近在学习物联网,毕竟现在人工智能包括无人驾驶,自动避障等行业的火热,所以在这里分享学习笔记 工具: 硬件:Arduino,遥控器,红外线,传感器,网上有卖不是很贵十几块钱 软件:Mixly 步骤 一 ...

最新文章

  1. 知识图谱在互联网金融中的应用
  2. 开启及关闭go mod
  3. Android View Binding的使用
  4. f-BRS: Rethinking Backpropagating Refinement for Interactive Segmentation解析
  5. html怎么改变一块区域颜色,更改HTML中所选区域的背景颜色/不透明度
  6. findler mac 隐藏文件_fiddler使用实例之----------查找隐藏的真实地址!!!!
  7. 最简单的CSocket通信流程
  8. zepto为什么不支持animate,报animate is not a function
  9. kis 2009 key/卡巴斯基2009 key/kis 8.0 0.454 key/卡巴斯基 8.0 0.454 key
  10. Matlab线性规划求解
  11. 计算机专业实训是干什么,计算机系实习目的是什么
  12. Oracle 购买价格 和 服务费 计算方式
  13. rxbus 源码_RxBus学习
  14. qq机器人php源码_基于PHP开发的QQ多功能机器人,小明同学机器人V4.0开源
  15. mysql 分组 列转行,mysql列转行以及年月分组实例
  16. 计算机成绩分数段,用FreQuency函数统计学生成绩分数段的技巧-excel技巧-电脑技巧收藏家...
  17. conda搜索安装包时显示没有匹配No match found for: fastaqc. Search: *fastaqc* PackagesNotFoundError:
  18. 蚂蚁、理财通、天天基金:公募基金代销市场风云异动,未来谁主沉浮?
  19. UniSwap V3协议浅析(上)
  20. 2022年全球市场液体石蜡总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. 惊天翻转,复盘BSV的逆袭之路
  2. CodeForces 858C Did you mean... 、 CodeForces 858D Polycarp's phone book!黑科技
  3. MPSOC之8——启动及错误处理
  4. 暗影精灵4清灰、加硅脂
  5. 《小狗钱钱》读书笔记
  6. 超详细的Mysql安装教程
  7. js 事件绑定传入自定义参数
  8. 学习SQLSugar,分享给更多人收益
  9. Delphi开发OPC
  10. 华为Mate X2发售首日秒没,黄牛报价4.5万,有中介安排12个人抢购