Internet of Things with Android and Arduino: Control remote Led

Nowadays a new emerging technology is Internet of Things (IoT): this post describes how to create Internet of things with Android and Arduino. In IoT project, all the physical objects (things) are connected together using internet infrastructure. Arduino borard is one of the most important object in this ecosystem. In this post, we will explore how to integrate Android with Arduino making the first step in IoT.Even Google at io15 presented its new IoT infrastructure called Brillo.
This  tutorial describes how to create an Internet of things with Android and Arduino project: android app to control a remote Led.

Internet of things with Android and Arduino

Internet of Things with Android and Arduino : Overview

The picture below shows the main objects involved in the IoT project:

Internet of Things with Android and Arduino

What we need is:

  • Arduino Uno
  • Ethernet shield
  • Smartphone with Android
All the objects are in the same network for simplicity. The idea is that the smartphone sends an HTTP request to the Arduino. A very small and simple Web server runs on Arduino, accepting HTTP request. For simplicity, the app sends JSON data that holds the led status.

Arduino: Web server and connections

In the Internet of things context (IoT), on the Arduino side, we simply need to connect the led to Arduino main board and control it using one of the Arduino output. The most complex part is creating a Web server that handles HTTP request. The image below shows how Arduino is connected to the led:
arduino breadboard with led
As you can see the connection is very simple. The Arduino sketch that implements the web server is shown below:
#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() {
  // Is there a client (Our Android smartphone)
  EthernetClient client = server.available(); 

  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();

     if (contentSize == contentLen) {
       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());
   int pos1 = tmp.indexOf("rn");
   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();
}
}

Almost all the arduino source code is used to handle HTTP connection. Notice that at line 4 we set the MAC Address of the ethernet shield while at line 5 we set the IP address.
In this way Arduino is ready to be integrated inside our internet of things world, it can exchange JSON request with external application including an app that runs on a smartphone. In this first part of Internet of things with Android and Arduino project, you gained the knowledge how to handle HTTP request in Arduino.

You can use other IoT protocols to exchange data between Arduino and Android app.

Android client: Send HTTP request

To complete our Internet of things with Android and Arduino scenario, it is necessary to implement an Android app that sends JSON request.
On Android code side, the things are much more simpler; the Android UI is shown below:

android app programming for internet of things

There is one simple button when the user clicks on it, the app sends an HTTP request to Arduino, that runs the web server.
If you want to know more about HTTP look at making HTTP request in Android.
The app layout is very simple and it is not covered here, the core of the app is where the button click is handled:

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);

  }
});

When the user touches the button, the app sends an HTTP request using HTTP client. In this case, this project uses OkHttp. The HTTP client is very simple:

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() + "]");
   }
  });

}
Create your first Internet of things project integrating #Arduino and #Android. #IoT Click To Tweet

Below some images of my work showing arduino in IoT enviroment :

Internet of Things with Android and Arduinoarduino ethernet example

In this post you gained a basic understanding about how to create arduino webserver example and how to connect it to android app. This project can be extended and could be used as a base for arduino home automation. It is possible to make even more complex project that uses Android app and Arduino to control an RGB led.

This Internet of things project with Android and Arduino showed how to integrate two different ecosystems and make them working together.

 

  • Joseph McKenna

    Any way to impliment this with Outlook. Say, whenever you have an unopened email in your inbox, the light goes on?

    • bhaskar

      can anyone tell me why im getting an
      error : #include expects “FILENAME” or
      on the arduino sketch on line 2.

      • Hi, it was an error when copying the source code. I corrected it and now should be ok. Let me know if you experience any other issue. Thank you for your time.

  • The idea is the same, you should check, using some Mail Api, if there is an unopened email and contact arduino to turn on the light.

  • Bongjun Hur

    it's very simple and good project for starter.
    so, If you don't mind, I would like to introduce on WIZnet museum (http://wiznetmuseum.com) for everyone.
    WIZnet produce the W5100 chipset on Ethernet shield. Hopefully, you will allow this.
    Thanks.~

  • shehab

    can you please give me the android Source code ,please
    as i’m facing some errors with my project .
    thanks

  • Mainak Dev

    Sir, i am getting error in the arduino code at line no 63 saying, “amp was not declared in its scope”, my question is what is amp, can you please help me remove this error. Thank You

    • Yes you are right the mistake is caused by escaping char. Please read & ;as &. Thank you for spotted it

      • Mainak Dev

        Thank You for your reply, just to be sure you mean in line 63 instead of
        if (c == ‘n’ && isLastLine)
        we will use
        if (c == ‘n’ && isLastLine)
        right?

  • kareem

    Is there any example about how to send an email by using Ethernet shield , like when motion sensor detects motion the arduino send me email , helping me will be appreciated

    • To send a message I used parse.com and Temboo. Give a look at How to send notification using Arduino

      • Anonymous

        hi, senior thank you for helping me ,
        sir i had a problem with the way you showed to me , that the parse .com they are no longer accepting new accounts and i do not have one , i’m winder if there is another solution < thank you

        • As far as I know i don’t know an alternative, you could search it and if you find please write it the link so you can help other readers! Thank you

      • kareem

        hi, senior thank you for helping me ,
        sir i had a problem with the way you showed to me , that the parse .com they are no longer accepting new accounts and i do not have one , i’m winder if there is another solution < thank you

  • Hi sir,
    i am kannadhasan very interest to create android application development with internet of thing(IoT )
    project.How to create .I need help sir

  • Vaishak

    Hello Sir! I’m Vaishak. I have planned for an IoT project with agricultural applications. Will you help me out with it?

    • You should tell me more about this project so that i can have an idea.

      • Vaishak

        Now I’ve decided to use humidity sensor, soil moisture sensor, and temperature sensor and a water pump which works depending on the criteria of these sensors and carries out drip irrigation. I’ll the Arduino microcontroller.

      • Vaishak

        The name of my project is “ENHANCEMENT OF AGRICULTURAL APPLICATIONS USING IoT”. The whole system is controlled through GSM or Wifi.

  • Vivek anand

    Hello sir,
    I am vivek anand from india. I just want to know that which bluetooth module is better with Arduino for multiple command.
    Thanks

    • Hi Vivek,

      as far as i know you can use every bluetooth module you like. You could prefer a bluetooth shield that is connected on top of arduino board or a external module. It is up to you.
      For my project i use an external module.

  • Usmar Ismail

    hello sir,
    i’m usmar ismail from indonesia.
    this is awesome,
    i have project that i have to create program like this, can you give me a tutorial for android session in this project. i dont get it, please,
    i apologize for my english
    thankyouuuu
    email :[email protected]

    • Hi Usmar,

      the android part is in the tutorial. Are you looking for a complete android app source code? If so tell me, i will add it to Github repository.

  • Liltunechi Chygrynskiychichari

    nice tutorial link of your github repository

  • Aditya Verma

    sir i’m using enc28j60 with uipethernet shield.and control lights via android apk.
    but problem is that when i press button for led onn/off it will react after 2 to 3 second later.
    if i use same apk with wi-fly module rn-171.it reacts within milisecond.
    how can i improve speed in ethernet.