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 <spi.h>
#include <ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
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 Mode
Serial.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 reading
boolean isLastLine = true;
boolean isBody = false;
header = "";
reqData = "";
int contentLen = 0;
Serial.print("Client connected!");
while (client.connected()) {
if (client.available()) {
// Read data
char 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 page
client.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 connection
Serial.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() {
@Override
public void onClick(View v) {
client.doRrequest(status ? "1" : "0");
status = !status;
if (status)
ledView.setImageResource(R.drawable.white_circle);
else
ledView.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() {
@Override
public void onFailure(Request request, IOException e) { }
@Override
public 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小车