Internet das coisas com Android e Arduino: projeto IoT Arduino
Este projeto IoT Arduino descreve como conectar Android e Arduino. Para simplificar, vamos supor que queremos controlar um LED conectado ao Arduino usando um aplicativo Android. Este é um cenário comum que requer a integração do Android e do Arduino em um projeto IoT Arduino. Hoje em dia, a Internet das Coisas (IoT) é uma tecnologia difundida que está mudando a maneira como vivemos e interagimos com os dispositivos. No projeto IoT, todos os objetos físicos (coisas) são conectados entre si usando a infraestrutura da Internet. A placa Arduino é um dos dispositivos mais importantes que nos permite prototipar projetos. Esta postagem explora como integrar o Android com o Arduino, dando a primeira etapa na IoT.
Internet das coisas com Android e Arduino: Visão geral do projeto Arduino IoT
A imagem abaixo mostra os principais objetos envolvidos no projeto Arduino IoT:
O que precisamos é:
- Arduino Uno
- Shield Ethernet
- Smartphone com Android
Esses dispositivos estão na mesma rede para simplificar. A ideia deste projeto Arduino e Android IoT é construir um aplicativo Android que troque dados com o Arduino. Para isso, o aplicativo Android se comunicará com o Arduino usando o protocolo HTTP. Um pequeno e simples servidor Web roda em Arduino, aceitando solicitações HTTP. Para simplificar, o aplicativo envia dados JSON que contêm o status do led. Abaixo, você pode verr o código-fonte do Arduino para este projeto Arduino IoT.
#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; // Pedido do Smartphone String header; int contentSize = -1; String CONTENT_LENGTH_TXT = "Content-Length: "; void setup() { Serial.begin(9600); pinMode(3, OUTPUT); // Defina o pino 3 para o modo OUTPUT Serial.print("Ready..."); // Ethernet.begin(mac, ip); server.begin(); Serial.println("Begin..."); } void loop() { Serial.println("Cliente..."); EthernetClient client = server.available(); // Existe um cliente (seu smartphone Android) Serial.println("Cliente pronto.."); if (client) { // Vamos começar a ler boolean isLastLine = true; boolean isBody = false; header = ""; reqData = ""; int contentLen = 0; Serial.print("Cliente conectado!"); while (client.connected()) { if (client.available()) { // Leia os dados 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(); // enviar página da web client.println("<!DOCTYPE html>"); client.println("<html>"); 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; } } } // Fechar conexão Serial.println("Stop.."); client.stop(); } }
Como construir um projeto Arduino IoT
A primeira etapa na construção de um projeto Arduino IoT que se conecta ao Android, portanto, estamos construindo um servidor Arduino que aceita conexão HTTP. Além disso, considerando que este projeto pretende controlar um LED simples usando um aplicativo Android, é necessário conectar o Arduino a um LED. O esquema abaixo mostra como fazer
Como você pode ver, a conexão é muito simples. O código do Arduino a seguir descreve como construir um servidor HTTP simples no Arduino para aceitar a conexão vinda do aplicativo Android.
Quase todo o código-fonte do arduino é usado para lidar com conexões HTTP. Observe que na linha 4 configuramos o endereço MAC do Shield Ethernet, enquanto na linha 5 configuramos o endereço IP. O servidor roda na porta 80, você pode mudar esta porta se quiser. Depois de criar este servidor, o Arduino pode trocar solicitações JSON com o aplicativo externo, incluindo um aplicativo executado em um smartphone.
Nesta primeira parte do projeto Internet das coisas com Android e Arduino, você ganhou o conhecimento sobre como lidar com solicitações HTTP no Arduino.
Cliente de aplicativo Android: enviar solicitação HTTP
Para completar nosso cenário de Internet das coisas com Android e Arduino, é necessário implementar um aplicativo Android que envie solicitações JSON.
No lado do código Android, as coisas são muito mais simples; a IU do Android é mostrada abaixo:
Existe um botão simples. Quando o usuário clica nele, o aplicativo envia uma solicitação HTTP ao Arduino, que executa o servidor web.
O layout do aplicativo é muito simples e não é abordado aqui, o núcleo do aplicativo é onde o clique do botão é tratado:
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); } });
Quando o usuário toca no botão, o aplicativo envia uma solicitação HTTP usando o cliente HTTP. Neste caso, este projeto usa OkHttp. O cliente HTTP é muito simples:
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() + "]"); } }); }
Abaixo algumas imagens do meu trabalho mostrando o Arduino em ambiente IoT:
Este projeto de Internet das coisas com Android e Arduino mostrou como integrar dois ecossistemas diferentes e fazê-los trabalhar juntos. Nesta postagem, você obteve uma compreensão básica de como criar um exemplo de servidor da web Arduino e como conectá-lo ao aplicativo Android. Este projeto pode ser estendido e pode ser usado como base para a automação residencial Arduino.