ESP8266 WIFI模块学习之路(6)——自写Android手机APP控制单片机LED灯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XiaoCaiDaYong/article/details/82289276

物联网的迅速发展,加上自己对这方面的好奇,于是买了ESP8266模块,已经学习了几天,写了几篇博客,感觉学习使人快乐。因为之前都是别人写的APP调试助手,或者别人写的APP(他们写的功能是挺好的),但自己想往深了学习就需要自己动手学习Android,写一个属于自己的APP,这样对以后才有更好的发展。因为Android程序刚开始学习,写的效果也不好,大家请看,^_^:

这样先点击连接,就可以连接到WIFI模块了,然后通过按键来操作单片机上的LED灯。

效果如图所示:

实现的代码如下:

硬件方面的:

#include <reg52.h>
#include <string.h>
#include <stdio.h>

sbit P20_LED=P2^0;
sbit P32=P3^2;


char Recive_table[20]="";  //接收缓冲,最大20个字节
char Recive_state = 0;   //接收完成标志
void WIFI_Init(void);
void Uart_Init(void);
void ms_delay(int t);
void LED(void);

int main (void)
{ 
	/********************功能初始化***********************/
	Uart_Init();//串口初始化,波特率为9600
	ms_delay(1000) ;
	WIFI_Init(); //wifi初始化
    P20_LED=0;
	/****************************************************/
	/**********************主循环************************/
	while(1)
	{ 
		ms_delay(10) ;
		if(Recive_state == 1)
		{
			ES=0;  //清空接收标志位 
			if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//接收到的字符串形式为+IPD,x,x:y
			{
			    if((Recive_table[3]=='D')&&(Recive_table[6]==','))
			    {   
			        if(Recive_table[9]=='0')
					P20_LED = 0;
					if(Recive_table[9]=='1')
					P20_LED = 1;
				}
			}
			memset(Recive_table,'\0',20);
			Recive_state = 0;
			ES=1;  //打开接收标志位
		}
        /*if(0 == P32)    //  通过串口给手机发送字符串   wantin
        {
            ms_delay(400);
            if(0 == P32)
            {
                ES = 0;
            	TI = 1; 
            	printf("AT+CIPSEND=?\r\n");
            	LED();
            	ms_delay(1000) ;
                printf("AT+CIPSEND=0,10\r\n");
            	LED();
            	ms_delay(1000) ;
                printf("wangting\r\n");
            	LED(); 
            	ms_delay(1000) ;
            	LED();
            	ms_delay(1000) ;
            	LED();
            	ms_delay(1000) ;
            	while(!TI);
            	TI = 0;
            	ES = 1;
            }
            while(0 == P32);
        } */
	}
	/****************************************************/
	  
}

/******************************************************************
函 数: void Uart_Interrupt() interrupt 4
功 能: 串口中断函数,将收到的字符存到Recive_table[]数组中
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Interrupt() interrupt 4         
{   
	static char i=0;  //因为是一位一位接收,所以用static
	if(RI==1)    
	{  
		ES = 0;
		RI=0;         
		Recive_table[i]=SBUF;        
		i++; 
		if((Recive_table[i-1] == '\n'))
		{ 
			Recive_table[i]='\0';
			i=0; 
			Recive_state = 1;
		}
		ES = 1;      
	}
	else
	TI = 0;     
} 

/******************************************************************
函 数: void Uart_Init(void)
功 能: 串口初始化,波特率为9600(这个不会,上网百度)
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Init(void)
{  
	TMOD=0x20;
	TH1=0xfD;
	TL1=0xfD;
	TR1=1;
	REN=1;
	SM0=0;
	SM1=1;
	EA=1;
	ES=1;
}

/******************************************************************
函 数: void ms_delay(int t)
功 能: 毫秒级延时
参 数: 无
返回值: 无
*******************************************************************/
void ms_delay(int t) 
{  
	int i,j; 
	for(i=t;i>0;i--)   
		for(j=110;j>0;j--); 
}

/******************************************************************
函 数: void LED(void)
功 能: 发送完命令后显示用的函数
参 数: 无
返回值: 无
*******************************************************************/
void LED(void)
{
	P2 = 0;
	ms_delay(100);
	P2 = 0xff;
	ms_delay(100);
}


/******************************************************************
函 数: void WIFI_Init(void)
功 能: wifi初始化(名字:esp8266;密码:1234567890)
参 数: 无
返回值: 无
*******************************************************************/
void WIFI_Init(void)
{
	ES = 0;
	TI = 1; 
	printf("AT+RST\r\n");
	LED();
	ms_delay(1000) ;
	printf("AT+CWMODE=3\r\n");
	LED();
	ms_delay(1000) ;
	printf("AT+CIPMUX=1\r\n");
	LED(); 
	ms_delay(1000) ;
	printf("AT+CIPSERVER=1,8080\r\n");        
	LED();
	ms_delay(1000) ;
    printf("AT+CIOBAUD=9600\r\n");   // 设置与单片机一致的波特率     
	LED();
	ms_delay(1000) ;
	while(!TI);
	TI = 0;
	ES = 1;
}

Android APP部分:

package com.open_open.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private EditText mIp;   //  IP
    private EditText mPort;     //  端口号
    private String mStrIp;      //  字符串类型ip
    private int miPort;    //  字符类型端口
    private Button mBtnConnect; //  连接
    private Button mLedON;      //  按钮LED灯开
    private Button mLedOFF;     //  按钮LED灯关
    private Socket mSocket;     //  套接字
    private PrintStream out;    //  打印输出流
    private ConnectThread mConnectThread;   //  TCP连接线程

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnConnect=(Button)findViewById(R.id.mBt1);
        mLedON=(Button)findViewById(R.id.mBt2);
        mLedOFF=(Button)findViewById(R.id.mBt3);
        mIp=(EditText)findViewById(R.id.mEtIP);
        mPort=(EditText)findViewById(R.id.mEtPort);
        mBtnConnect.setOnClickListener(this);
        mLedON.setOnClickListener(this);
        mLedOFF.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.mBt1:
                //  连接
                if(mSocket == null || !mSocket.isConnected()){
                    mStrIp=mIp.getText().toString();
                    miPort=Integer.valueOf(mPort.getText().toString());
                    mConnectThread = new ConnectThread(mStrIp,miPort);
                    mConnectThread.start();
                }
                if(mSocket != null && mSocket.isConnected()){
                    try{
                        mSocket.close();
                        mSocket=null;   //  清空mSocket
                        mBtnConnect.setText("连接");
                        Toast.makeText(MainActivity.this,"连接已关闭",Toast.LENGTH_LONG).show();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
                break;
            case R.id.mBt2:
                if(out!=null){
                    out.print("0");
                    out.flush();
                }
                break;
            case R.id.mBt3:
                if (out!=null){
                    out.print("1");
                    out.flush();
                }
                break;
        }

    }
    private class ConnectThread extends Thread{
        private String ip;
        private int port;
        public ConnectThread(String ip,int port){
            this.ip=ip;
            this.port=port;
        }
        @Override
        public void run(){
            try {
                mSocket=new Socket(ip,port);
                out = new PrintStream(mSocket.getOutputStream());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mBtnConnect.setText("断开");
                        Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_LONG).show();
                    }
                });
                //new HeartBeatThread().start();
            }catch (IOException e){
                e.printStackTrace();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"连接失败",Toast.LENGTH_LONG).show();
                    }
                });
            }
        }
    }
    /*
    private class HeartBeatThread extends Thread{
        @Override
        public void run(){
            while (true){
                try {
                    Thread.sleep(3000);
                    if (!mSocket.isConnected()){
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mBtnConnect.setText("连接");
                                Toast.makeText(MainActivity.this,"连接已关闭",Toast.LENGTH_LONG).show();
                            }
                        });
                    }
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }*/
}

还有布局和权限的就不多说了,很简单,只要有点Android基础就可以搞定了,学习一直在路上。

猜你喜欢

转载自blog.csdn.net/XiaoCaiDaYong/article/details/82289276