【安卓与物联网】Arduino开发板与Android之间通信
2016-04-23 10:49
681 查看
关于Arduino开发板
Arduino是一款开源电子原型平台,硬件部分是可以用来做电路连接的Arduino电路板。可以通过编写程序,最后烧写入开发板,配合上一些传感器,以及富有创造力的设计可以创造出很多神奇的东西。
在大三的时候,对物联网的感兴趣,让我直接省吃俭用在网络买了个Arduino开发板(Arduino入门套装160),然后个人在寝室瞎折腾~
就像大多数人说的那样,物联网会在将来掀起大浪潮,本人也是这么认为,开始在寝室折腾,然后就有了这篇博客的内容。
这里我们将Arduino开发板读取到的温度传输到Android端,这样的设计类似与智能手表(吐槽一句,这样的技术并不高明,手表卖那么贵,实在坑人),如果我们将温度传感器绑在身上,那么我们这样就可以实时的看到自己的体温,想必这样的东西会有很大的用途吧。
大致上我们可以分以下几步:
* Arduino开发板与温度传感器连接(这里选择的传感器是LM35)
* Arduino开发板通过Wifi或蓝牙连接Android
LM35温度传感器的特点:
1、有较好的线性度和较高的灵敏度。
2、传感器的输出电压与摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv。
3、与Arduino专用传感器扩展板结合使用,可以非常容易地实现与环境温度感知相关的互动效果。
所以选择LM35是比较正确的。
对接方式如下:
接着是烧写代码
完成以上,温度基本可以成功获取到。
下一步,连接Android手机。
按照原本的设定,我们需要再买个Wifi模块,将Wifi模块连在Arduino开发板上,这样就具备了WIFI通信的资本,但是当时比较穷,没有去买WIFI模块。采用的是以下方案:
将Arduino开发板与PC机用USB线连接,PC机监听端口输出。
PC机将监听到的数据,通过socket通信发出去
Android端通过socket接收数据
这样Android就可以获取到传感器的温度了,那么接下来的要做的是,PC监听端口。
参考博客:
http://www.cnblogs.com/sunxiaonan/archive/2010/10/23/1609449.html
如图,我们对端口号和波特率进行设置(要和Arduino开发板烧写的一致),然后就可以得到监听到的数据
这样Service这端就准备好了,接下来就剩Android端了。
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 {
参考博客:
http://www.cnblogs.com/devinzhang/archive/2012/10/04/2711763.html
利用以上方法就实现了Arduino开发板到Android方向的通信
Arduino是一款开源电子原型平台,硬件部分是可以用来做电路连接的Arduino电路板。可以通过编写程序,最后烧写入开发板,配合上一些传感器,以及富有创造力的设计可以创造出很多神奇的东西。
在大三的时候,对物联网的感兴趣,让我直接省吃俭用在网络买了个Arduino开发板(Arduino入门套装160),然后个人在寝室瞎折腾~
就像大多数人说的那样,物联网会在将来掀起大浪潮,本人也是这么认为,开始在寝室折腾,然后就有了这篇博客的内容。
这里我们将Arduino开发板读取到的温度传输到Android端,这样的设计类似与智能手表(吐槽一句,这样的技术并不高明,手表卖那么贵,实在坑人),如果我们将温度传感器绑在身上,那么我们这样就可以实时的看到自己的体温,想必这样的东西会有很大的用途吧。
大致上我们可以分以下几步:
* Arduino开发板与温度传感器连接(这里选择的传感器是LM35)
* Arduino开发板通过Wifi或蓝牙连接Android
1.对接LM35温度传感器
LM35温度传感器的特点:
1、有较好的线性度和较高的灵敏度。
2、传感器的输出电压与摄氏温度呈线性关系,0℃时输出为0V,每升高1℃,输出电压增加10mv。
3、与Arduino专用传感器扩展板结合使用,可以非常容易地实现与环境温度感知相关的互动效果。
所以选择LM35是比较正确的。
对接方式如下:
接着是烧写代码
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模块。采用的是以下方案:
将Arduino开发板与PC机用USB线连接,PC机监听端口输出。
PC机将监听到的数据,通过socket通信发出去
Android端通过socket接收数据
这样Android就可以获取到传感器的温度了,那么接下来的要做的是,PC监听端口。
2.PC机监听固定串口
这里我用的是C#编写的程序。参考博客:
http://www.cnblogs.com/sunxiaonan/archive/2010/10/23/1609449.html
如图,我们对端口号和波特率进行设置(要和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端只需要充当客户端就可以了。部分实现代码如下: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(); } }
参考博客:
http://www.cnblogs.com/devinzhang/archive/2012/10/04/2711763.html
利用以上方法就实现了Arduino开发板到Android方向的通信
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories