Internet das coisas com Android e Arduino: projeto IoT Arduino

Tempo de leitura: 4 minutes

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.