Arduino开发板与Android之间通信

发布于 2020-11-5 18:18
浏览
0收藏

 •  关于Arduino开发板


Arduino是一款开源电子原型平台,硬件部分是可以用来做电路连接的Arduino电路板。可以通过编写程序,最后烧写入开发板,配合上一些传感器,以及富有创造力的设计可以创造出很多神奇的东西。 

Arduino开发板与Android之间通信-开源基础软件社区

在大三的时候,对物联网的感兴趣,让我直接省吃俭用在网络买了个Arduino开发板(Arduino入门套装160),然后个人在寝室瞎折腾~ 
就像大多数人说的那样,物联网会在将来掀起大浪潮,本人也是这么认为,开始在寝室折腾,然后就有了这篇博客的内容。

 
这里我们将Arduino开发板读取到的温度传输到Android端,这样的设计类似与智能手表(吐槽一句,这样的技术并不高明,手表卖那么贵,实在坑人),如果我们将温度传感器绑在身上,那么我们这样就可以实时的看到自己的体温,想必这样的东西会有很大的用途吧。 
大致上我们可以分以下几步: 
* Arduino开发板与温度传感器连接(这里选择的传感器是LM35) 
* Arduino开发板通过Wifi或蓝牙连接Android

 

1.对接LM35温度传感器

Arduino开发板与Android之间通信-开源基础软件社区

LM35温度传感器的特点: 
1、有较好的线性度和较高的灵敏度。 
2、传感器的输出电压与摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv。 
3、与Arduino专用传感器扩展板结合使用,可以非常容易地实现与环境温度感知相关的互动效果。 
所以选择LM35是比较正确的。 
对接方式如下: 

Arduino开发板与Android之间通信-开源基础软件社区

接着是烧写代码

int potPin = 4;                     //设置模拟口4为LM35的信号输入端口
float temperature = 0;                //设置temperature为浮点变量
long val=0;                       //设置val为长整数变量

void setup()
{
Serial.begin(9600);//设置波特率
}

void loop ()                     
{
   val=analogRead(potPin);//温度传感器LM35接到模拟PIN4上;val变量为从LM35信号口读取到的数值
  temperature = (val*0.0048828125*100);   //把读取到的val转换为温度数值,系数一:0.00488125=5/1024,0~5V对应模拟口读数1~1024,系数二:100=1000/10,1000是毫伏与伏的转换;10是每10毫伏对应一度温升。
   Serial.print("Tep=  ");
   Serial.print(temperature);
   Serial.println(" C");
    delay(500);//延时500毫秒,这里也就是刷新速度。

}

完成以上,温度基本可以成功获取到。 
下一步,连接Android手机。 
按照原本的设定,我们需要再买个Wifi模块,将Wifi模块连在Arduino开发板上,这样就具备了WIFI通信的资本,但是当时比较穷,没有去买WIFI模块。采用的是以下方案:

  1.将Arduino开发板与PC机用USB线连接,PC机监听端口输出。
  2.PC机将监听到的数据,通过socket通信发出去
  3.Android端通过socket接收数据 

Arduino开发板与Android之间通信-开源基础软件社区

这样Android就可以获取到传感器的温度了,那么接下来的要做的是,PC监听端口。

 

2.PC机监听固定串口


这里我用的是C#编写的程序。 

Arduino开发板与Android之间通信-开源基础软件社区

如图,我们对端口号和波特率进行设置(要和Arduino开发板烧写的一致),然后就可以得到监听到的数据

 

3.PC机利用C#实现Socket通信


主要实现Service端,如下代码:

namespace SocketServer  
{  
    class Program  
    {  
        private static byte[] result = new byte[1024];  
        private static int myProt = 8885;   //端口  
        static Socket serverSocket;  
        static void Main(string[] args)  
        {  
            //服务器IP地址  
            IPAddress ip = IPAddress.Parse("127.0.0.1");  
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
            serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口  
            serverSocket.Listen(10);    //设定最多10个排队连接请求  
            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());  
            //通过Clientsoket发送数据  
            Thread myThread = new Thread(ListenClientConnect);  
            myThread.Start();  
            Console.ReadLine();  
        }  

        /// <summary>  
        /// 监听客户端连接  
        /// </summary>  
        private static void ListenClientConnect()  
        {  
            while (true)  
            {  
                Socket clientSocket = serverSocket.Accept();  
                clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));  
                Thread receiveThread = new Thread(ReceiveMessage);  
                receiveThread.Start(clientSocket);  
            }  
        }  

        /// <summary>  
        /// 接收消息  
        /// </summary>  
        /// <param name="clientSocket"></param>  
        private static void ReceiveMessage(object clientSocket)  
        {  
            Socket myClientSocket = (Socket)clientSocket;  
            while (true)  
            {  
                try  
                {  
                    //通过clientSocket接收数据  
                    int receiveNumber = myClientSocket.Receive(result);  
                    Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));  
                }  
                catch(Exception ex)  
                {  
                    Console.WriteLine(ex.Message);  
                    myClientSocket.Shutdown(SocketShutdown.Both);  
                    myClientSocket.Close();  
                    break;  
                }  
            }  
        }  
    }  
}  

这样Service这端就准备好了,接下来就剩Android端了。

 

4.安卓端实现Socket通信

 

这里Android端只需要充当客户端就可以了。部分实现代码如下:

package com.amaker.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class SocketDemo extends Activity implements Runnable {
    private TextView tv_msg = null;
    private EditText ed_msg = null;
    private Button btn_send = null;
    // private Button btn_login = null;
    private static final String HOST = "10.0.2.2";
    private static final int PORT = 9999;
    private Socket socket = null;
    private BufferedReader in = null;
    private PrintWriter out = null;
    private String content = "";
    //接收线程发送过来信息,并用TextView显示
    public Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            tv_msg.setText(content);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv_msg = (TextView) findViewById(R.id.TextView);
        ed_msg = (EditText) findViewById(R.id.EditText01);
        btn_send = (Button) findViewById(R.id.Button02);

        try {
            socket = new Socket(HOST, PORT);
            in = new BufferedReader(new InputStreamReader(socket
                    .getInputStream()));
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream())), true);
        } catch (IOException ex) {
            ex.printStackTrace();
            ShowDialog("login exception" + ex.getMessage());
        }
        btn_send.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String msg = ed_msg.getText().toString();
                if (socket.isConnected()) {
                    if (!socket.isOutputShutdown()) {
                        out.println(msg);
                    }
                }
            }
        });
        //启动线程,接收服务器发送过来的数据
        new Thread(SocketDemo.this).start();
    }
    /**
     * 如果连接出现异常,弹出AlertDialog!
     */
    public void ShowDialog(String msg) {
        new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                }).show();
    }
    /**
     * 读取服务器发来的信息,并通过Handler发给UI线程
     */
    public void run() {
        try {
            while (true) {
                if (!socket.isClosed()) {
                    if (socket.isConnected()) {
                        if (!socket.isInputShutdown()) {
                            if ((content = in.readLine()) != null) {
                                content += "\n";
                                mHandler.sendMessage(mHandler.obtainMessage());
                            } else {

                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 

利用以上方法就实现了Arduino开发板到Android方向的通信
 

原文作者:Delevin_C

 

 

 

已于2020-11-5 18:18:58修改
收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐