×
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Contact US

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Students Click Here

Internet of Things (IoT) General Discussion FAQ

Arduino & IoT

How to control Arduino projects from online webpages - Wi-fi Client by yhtomitsy
Posted: 14 Mar 15 (Edited 16 Mar 15)

We would all love to be able to switch on and off our living room lights or control our home air conditioning system from the office. Well, this is possible, thanks to Arduino and the IOT platform. To successfully control Arduino projects from online webpages, one has to understand what a Wi-Fi web client is and how to implement it.

Types of Data
There are two types of online data that you can get using your Arduino and wifi module. They include:
• Data displayed on a webpage
• Data stored in an online database

Therefore, if you want to control an Arduino project via the internet, either display the data on a webpage or store it in a database. Storing data in a database is better if your project is to be used by more than one person or to control more than one device.
For instance, if you want your project to only control your living room lights, you can easily accomplish that using a central webpage that displays the control command you enter. The Arduino can then read the control command from the webpage.

However, if your project is used by several people (A, B, C) to control their living room lights, it would be better to have a database that stores each person’s details and state of his or her lights as shown below. This way each Arduino device in the different homes can get the right commands that have been set by the home owners.


ID Name State
1 Timothy ON
2 Brian OFF
3 Peter ON

Unlike using the Arduino as a webserver, where you send data directly to the wifi module, here you have to fetch the data from the online server. To demonstrate how you can get this data onto your Arduino and use it to control your projects I am going to light and dim an LED from a webpage and database hosted online.

Requirements
For this project you will need the following things:
• Arduino board (Arduino Uno)
• Arduino compatible wifi module (wifly shield)
• 1 LED
• 1 220? resistor


Hardware connection
Mount the wifly shield onto the Arduino Uno and connect the LED to pin number 3. I already did this on a previous post on controlling an Arduino project using a Wi-Fi webserver, so please check it out and follow the instructions from there. Here is how the final setup should look like.





Using the Get Request
Before you start coding it is important for you to understand what the get request is. GET is a HTTP method that retrieves the information that is identified by the Request-URI. In layman’s language it is a HTTP method that one uses to get information from an online resource. It is considered safe for retrieval of data but unsafe for updating and adding data to online databases and resources. Therefore, use it only when you are retrieving online data. If you want to add data to an online database, it is advisable to use the POST method. All this is explained in the methods definition article.

So, to retrieve online data using an Arduino-compatible Wi-Fi module, we use the GET method.
NB: The wifly shield must be set to connect to a wifi hotspot that has internet connection. So, make sure you change the hotspot ssid and password in the code to match those of your wifi hotspot.

Reading Data Displayed on a Webpage
You can use your wifly module to read the contents of any kind of webpage. For this example I asked a friend of mine who is a web programmer (Brian Kisese) to create for me a simple page (www.kisese.byethost7.com/ar_test/test_a.php) where I could enter data and display the submitted data onto another URL (www.kisese.byethost7.com/ar_test/process.php).
The data entry page looks like this



You enter the data which in this case is LED and the value which in this case is either ON or OFF then click on submit. Once you click on submit the display page loads. It looks as shown below.



You will notice that there are dollar signs before LED and after ON. The reason is to enable me to differentiate the control data from the rest of the page data when I retrieve the page contents on my Arduino.

The wifly module will be retrieving the contents i.e. “welcome to the test page $LED=ON$” plus the code header and other php code that makes up the page. So, it is your job to sift the control data from all the rubble. I will show you how to do that when I explain how to parse the received data.

Code
Here is the code that will enable you to read the page data

CODE --> arduino

#include <SPI.h>
#include <WiFly.h>

WiFlyClient client("kisese.byethost7.com", 80); // declaring the client

void setup() {
  
  Serial.begin(9600);
  WiFly.begin();
  
  if (!WiFly.join("yhtomit", "12345678")) {
    Serial.println("Association failed.");
    while (1) {
      // Hang on failure.
    }
  }  

  Serial.println("connecting...");
  
}

void loop() {
  if (client.connect()) {
    Serial.println("connected");
    client.println("GET http://www.kisese.byethost7.com/ar_test/process.php HTTP/1.0"); // get request
    client.print("Host: www.kisese.byethost7.com");
    client.println("Connection: close");
    client.println();
    
    while (client.connected()) {
      if (client.available()){
         char c = client.read(); // read incoming page data
         Serial.print(c);
       }
    }
    delay(100); // give time for all page data to be displayed
    client.flush();
    client.stop(); // stop client after all data has been recieved
  } else {
    Serial.println("connection failed");// connection to client has failed
  }
} 

Once you upload the code run the serial monitor. The contents of the page should appear as shown below



Reading Data From an Online Database

The wifly module can also retrieve data directly from a database. My friend (Brian Kisese) also created a simple test database (http://kisese.byethost7.com/ar_test/test_b.php) that I could use to demonstrate this. This database contains the name of people and the state of their bulb/LED. At least that is how I used it. I used the previous submission form (www.kisese.byethost7.com/ar_test/test_a.php) to enter the database records. I entered the names in the data field and the state in the value field.

The database looks like this:



The Arduino code uses the get method to access the state of the LED for a specific person, when his or her unique ID provided.

Code

CODE --> arduino

#include <SPI.h>
#include <WiFly.h>

WiFlyClient client("kisese.byethost7.com", 80); // declaring the client

void setup() {
  
  Serial.begin(9600);
  WiFly.begin();
  
  if (!WiFly.join("yhtomit", "12345678")) {
    Serial.println("Association failed.");
    while (1) {
      // Hang on failure.
    }
  }  

  Serial.println("connecting...");
  
}

void loop() {
  if (client.connect()) {
    Serial.println("connected");
    client.println("GET http://www.kisese.byethost7.com/ar_test/viewer.php?id=6 HTTP/1.0"); // get request 
    client.print("Host: www.kisese.byethost7.com");
    client.println("Connection: close");
    client.println();
    
    while (client.connected()) {
      if (client.available()){
         char c = client.read(); // read incoming page data
         Serial.print(c);
       }
    }
    delay(100); // give time for all page data to be displayed
    client.flush();
    client.stop(); // stop client after all data has been recieved
  } else {
    Serial.println("connection failed");// connection to client has failed
  }
} 

This is what will be displayed on the serial monitor.



Parsing the received data
Once you receive the data you have to sift out the control parameters from the rest of the page code and content. That is why I used a dollar signs before and after the data I need. This way you can retrieve the data that is between the $ signs and save it as a string variable that you can manipulate.

I have added the parsing code onto both codes to demonstrate how you can get the control parameters from the incoming page data and use it to switch on and off an LED.

Code

CODE --> arduino

#include <SPI.h>
#include <WiFly.h>

WiFlyClient client("kisese.byethost7.com", 80); // declaring the client

String parsedParameters = ""; // stores incoming control parameters
String command = ""; // holds the incoming command
int ledPin = 3;

void setup() {
  
  Serial.begin(9600);
  pinMode(ledPin,OUTPUT);
  WiFly.begin();
  
  if (!WiFly.join("yhtomit", "12345678")) {
    Serial.println("Association failed.");
    while (1) {
      // Hang on failure.
    }
  }  

  Serial.println("connecting...");
  
}

void loop() {
  uint8_t counter = 0;
  if (client.connect()) {
    Serial.println("connected");
    client.println("GET http://www.kisese.byethost7.com/ar_test/process.php HTTP/1.0"); // get request
    client.print("Host: www.kisese.byethost7.com");
    client.println("Connection: close");
    client.println();
    
    while (client.connected()) {
      if (client.available()){
         char c = client.read(); // read incoming page data
         Serial.print(c);
         if (c == '$')counter++; // increase counter by 1 if c = $
         if (counter == 1 && c != '$') parsedParameters += c; // get control parameters
       }
    }
    delay(100); // give time for all page data to be displayed
    client.flush();
    client.stop(); // stop client after all data has been recieved
    
    retrieveCommand(); //get the command
    
    //display the parsed parameters and command
    Serial.println("");
    Serial.print("Control Parameters: ");Serial.println(parsedParameters);
    Serial.print("Command: ");Serial.println(command);
    parsedParameters = ""; // clear parameters and wait for others
  } else {
    Serial.println("connection failed");// connection to client has failed
  }
  controlLED();
  delay(100);
}

void retrieveCommand(){
  parsedParameters.trim(); // removes any spaces
  Serial.println(parsedParameters);
  int startIndex = parsedParameters.indexOf("=");
  Serial.println(startIndex);
  int endIndex = parsedParameters.indexOf("/n", startIndex);
  Serial.println(endIndex);
  command = parsedParameters.substring(startIndex+1, endIndex);
}

void controlLED(){
  if (command == " ON") digitalWrite(ledPin, HIGH);
  else digitalWrite(ledPin, LOW);
} 


CODE --> arduino

#include <SPI.h>
#include <WiFly.h>

WiFlyClient client("kisese.byethost7.com", 80); // declaring the client

String parsedParameters = ""; // stores incoming control parameters
int ledPin = 3;

void setup() {
  
  Serial.begin(9600);
  pinMode(ledPin,OUTPUT);
  WiFly.begin();
  
  if (!WiFly.join("yhtomit", "12345678")) {
    Serial.println("Association failed.");
    while (1) {
      // Hang on failure.
    }
  }  

  Serial.println("connecting...");
  
}

void loop() {
  uint8_t counter = 0;
  if (client.connect()) {
    Serial.println("connected");
    client.println("GET http://www.kisese.byethost7.com/ar_test/viewer.php?id=6 HTTP/1.0"); // get request 
    client.print("Host: www.kisese.byethost7.com");
    client.println("Connection: close");
    client.println();
    
    while (client.connected()) {
      if (client.available()){
         char c = client.read(); // read incoming page data
         Serial.print(c);
         if (c == '$')counter++; // increase counter by 1 if c = $
         if (counter == 1 && c != '$') parsedParameters += c; // get control parameters
       }
    }
    delay(100); // give time for all page data to be displayed
    client.flush();
    client.stop(); // stop client after all data has been recieved
    
    //display the parsed parameters and command
    Serial.println("");
    Serial.print("Control Parameters: ");Serial.println(parsedParameters);
  } else {
    Serial.println("connection failed");// connection to client has failed
  }
  controlLED(); // control LED
  parsedParameters = ""; // clear parameters and wait for others
  delay(100);
}
void controlLED(){
  if (parsedParameters == "ON") digitalWrite(ledPin, HIGH);
  else digitalWrite(ledPin, LOW);
} 

In the first code all characters between the two $ signs are stored in the string parsedParameters. The control command is the retrieved from the parsedParameters variable and stored on the string command. If the command is ON the LED goes on otherwise it goes off.
In the second code the characters between the two $ signs are stored in the parsedParameters string. Since the string between the two $ signs is the control command, we use the string parsedParameters to control the LED. If the value is ON the LED goes on, otherwise it stays off.

Explanation
Here is a summary of how the project operates. The wifi module sends a get request to the online server. It then receives the requested page data and the Arduino retrieves the control parameters from the received page data. The control parameters are then used to cause the desired action.

Application
You can manipulate this tutorial to do many things in the corporate world. For instance you can use it in home automation, to control field parameters such as opening valves in a pipeline etc. I once used it to get the results of an online poll and display the winner of the poll on an LED screen. Therefore, the applications are numerous. In fact most IOT projects use the methods described in this tutorial.

Recommendations
There are many other wifi modules that you can use to control Arduino projects from online webpages. I have had experience using the arduino redback and I must admit it is better than the wifly shield when doing this kind of project. However, its code is not that flexible and therefore not a good board to use for tutorials. You can check it out if you want.

Back to Internet of Things (IoT) General Discussion FAQ Index
Back to Internet of Things (IoT) General Discussion Forum

My Archive

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close