arduino小车
这篇文章描述了如何使用Arduino和Android控制远程LED 。 如今,一项新兴的技术是物联网( IoT ):换句话说,所有物理对象(物)都使用Internet基础结构连接在一起。 Arduino是该生态系统中最重要的对象之一。 在本文中,我们将探讨如何将IoT与Arduino集成到Android.io15上的Goole甚至介绍了其新的物联网基础设施Brillo 。
如前所述,我们想使用Android智能手机控制连接到Arduino Uno的远程Led。
物联网概述
下图显示了IoT项目涉及的主要对象:
我们需要的是:
- Arduino Uno
- 以太网屏蔽
- 具有Android的智能手机
为了简单起见,所有对象都在同一网络中。 这个想法是智能手机向Arduino发送一个HTTP请求。 一个非常小而简单的Web服务器在Arduino上运行,接受HTTP请求。 为简单起见,该应用程序发送保存led状态的JSON数据。
Arduino:Web服务器和连接
在Arduino方面,我们只需要将led连接到Arduino主板并使用Arduino输出之一进行控制即可。 最复杂的部分是创建一个处理HTTP请求的Web服务器。 下图显示了Arduino如何连接到LED
如您所见,连接非常简单。 实现Web服务器的Arduino草图如下所示:
#include
#include
IPAddress ip(192, 168, 1, 130); // Arduino IP Add
EthernetServer server(80); // Web server// Http data
String reqData; // Request from Smartphone
String header;
int contentSize = -1;
String CONTENT_LENGTH_TXT = "Content-Length: ";void setup() {// put your setup code here, to run once:Serial.begin(9600);pinMode(3, OUTPUT); // Set Pin 3 to OUTPUT ModeSerial.print("Ready...");//Ethernet.begin(mac, ip); server.begin();
}void loop() {EthernetClient client = server.available(); // Is there a client (Our Android smartphone)if (client) {// Let's start readingboolean isLastLine = true;boolean isBody = false;header = "";reqData = "";int contentLen = 0;Serial.print("Client connected!");while (client.connected()) {if (client.available()) { // Read datachar c = client.read(); // Serial.print(c);if (contentSize == contentLen) {// Serial.println("Body ["+reqData+"]");int idx = reqData.indexOf(":");String status = reqData.substring(idx + 1, idx + 2);Serial.println("Status : " + status);if (status.equals("1")) {digitalWrite(3, HIGH);}else {digitalWrite(3, LOW);}client.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html");client.println("Connection: close");client.println();// send web pageclient.println("");client.println("");delay(1);break;}if (c == '\n' && isLastLine) {isBody = true;int pos = header.indexOf(CONTENT_LENGTH_TXT);String tmp = header.substring(pos, header.length());//Serial.println("Tmp ["+tmp+"]");int pos1 = tmp.indexOf("\r\n");String size = tmp.substring(CONTENT_LENGTH_TXT.length(), pos1);Serial.println("Size ["+size+"]");contentSize = size.toInt();}if (isBody) {reqData += c;contentLen++;}else {header += c; }if (c == '\n' ) {isLastLine = true;}else if (c != '\r' ) {isLastLine = false;}}}// Close connectionSerial.println("Stop..");client.stop();}
}
几乎所有的arduino源代码都用于处理HTTP连接。 注意,在第4行,我们设置了以太网屏蔽的MAC地址,而在第4行,我们设置了IP地址。
通过这种方式,Arduino已准备好集成到我们的物联网世界中,它可以与外部应用程序(包括在智能手机上运行的应用程序)交换JSON请求。
Android客户端:发送HTTP请求
要完成我们的物联网架构,有必要在Android中启用发送JSON请求的应用。
在他这一边,事情要简单得多。 Android UI如下所示:
有一个简单的按钮,当用户单击它时,应用程序将向运行Web服务器的Arduino发送HTTP请求。
如果您想了解更多有关HTTP的信息,请查看在Android中发出HTTP请求。
该应用程序的布局非常简单,这里不做介绍,该应用程序的核心是按钮单击的处理位置:
ledView = (ImageView) findViewById(R.id.ledImg);
// Set default image
ledView.setImageResource(R.drawable.white_circle);// Init HTTP client
client = new HttpClient();ledView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {client.doRrequest(status ? "1" : "0");status = !status;if (status)ledView.setImageResource(R.drawable.white_circle);elseledView.setImageResource(R.drawable.red_circle);}
});
当用户触摸按钮时,该应用会使用HTTP客户端发送HTTP请求。 在这种情况下,该项目使用OkHttp 。 HTTP客户端非常简单:
public void doRrequest(String status) {initClient();Log.d("AA", "Making request..["+status+"]");Request req = new Request.Builder().url(URL).post(RequestBody.create(JSON, createJSON(status))).build();client.newCall(req).enqueue(new Callback() {@Overridepublic void onFailure(Request request, IOException e) { }@Overridepublic void onResponse(Response response) throws IOException {Log.d("AA", "resp [" + response.body().string() + "]");}});}
在我的一些图片中显示了IoT环境中的arduino:
翻译自: https://www.javacodegeeks.com/2015/06/internet-of-things-android-arduino-control-remote-led.html
arduino小车