Getting hands on Arduino Ethernet Shield
-->Probably everyone knows Arduino and probably using it. Actually this development platform is worth its popularity. Probably the best thing about it is open-source ideology. Indeed it is great development platform that includes software and hardware solutions where even non electronics guru can master great projects very quickly. In a few years Arduino has grown in a great community around the world. And that is great – this means that you have access to endless resources, endless project ideas and lots of members that are willing to help if you are stuck with something. All basic information you can always find in http://www.arduino.cc/.
OK enough of talkies. Lets see what we have here. Thanks to SparkFun electronics, Arduino Duemilanove stands on my table fully assembled and ready to work.
I decided to give a try on Arduino Ethernet shield based on Wiznet W5100 chip. It has a library so you don’t need to think of details how Ethernet chip is controlled. Few lines and you have some info in your favorite browser.
Of course if you are using Arduino Pro minimal design, you may also need FTDI Basic Breakout – 5V board.
Now lets grab the newest stable Arduino software release from http://arduino.cc/en/Main/Software. And lets get ready for a simple test. To make things more interesting I decided to make a simple LED control in order to feel client-server and server-client communications. I hooked led to digital pin 4 while other end to GND via current limiting resistor. I have connected Ethernet shield to WRT54G router. As I used standard port 80 there were no need for additional configuration.
While programming you will ideally need one library
#include <Ethernet.h>
Of course you can also use additional like WString.h which I used for fetching data from HTTP request.
First thing is to assign MAC and IP addresses so the board was accepted to local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 110 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Wiznet type Ethernet shield doesn’t support dynamic address assign (dhcp)– so you have to do this manually. You may want to check out for DHCP library which is early alpha stage.
Printing simple text, drawing tables is really easy task as it ends with multiple lines of print functions like
client.println();
with HTML formatted lines inside. Different task is when you need to send some data to Arduino server itself. One of common methods is reading HTTP request by characters. Simply when sending address with additional parameters like /?L=1 Arduino can capture this line character by character with line
char c = client.read();
And then analyze it. In your selected way. In this case it is very convenient to use string functions like append and contains (refer to TextString )
Here is a program listing:
//*******************************
#include <WString.h>
#include <Ethernet.h>
/*
Simple Ethernet Test
Arduino server outputs simple text to browser
and controlling LED with simple checkbox
The circuit:
* Arduino Duemilanove
* Arduino Ethernet shield
* Basic FTDI breakout 5V
* LED connected to GND and digital pin 4 via resistor
By Minde
http://www.sciencprog.com/
*/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 110 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server port
byte sampledata=50; //some sample data – outputs 2 (ascii = 50 DEC)
int ledPin = 4; // LED pin
char link[]=”http://www.scienceprog.com/”; //link data
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //LED status flag
void setup(){
//start Ethernet
Ethernet.begin(mac, ip, gateway, subnet);
//Set pin 4 to output
pinMode(ledPin, OUTPUT);
//enable serial datada print
Serial.begin(9600); }
void loop(){
// Create a client connection
Client client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 30) {
//store characters to string
readString.append(c); }
//output chars to serial port
Serial.print(c);
//if HTTP request has ended
if (c == ‘\n’) {
//lets check if LED should be lighted
if(readString.contains(“L=1″)) {
//led has to be turned ON
digitalWrite(ledPin, HIGH); // set the LED on
LEDON = true;
}else{
//led has to be turned OFF
digitalWrite(ledPin, LOW); // set the LED OFF
LEDON = false; }
// now output HTML data starting with standart header
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println();
//set background to yellow
client.print(“<body style=background-color:yellow>”);
//send first heading
client.println(“<font color=’red’><h1>HTTP test routines</font></h1>”);
client.println(“<hr />”);
client.println(“<hr />”);
//output some sample data to browser
client.println(“<font color=’blue’ size=’5′>Sample data: “);
client.print(sampledata);//lets output some data
client.println(“<br />”);//some space between lines
client.println(“<hr />”);
//drawing simple table
client.println(“<font color=’green’>Simple table: “);
client.println(“<br />”);
client.println(“<table border=1><tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr>”);
client.println(“<tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr></table>”);
client.println(“<br />”);
client.println(“<hr />”);
//printing some link
client.println(“<font color=’blue’ size=’5′>Link: “);
client.print(“<a href=”);
client.print(link);
client.println(“>Visit Scienceprog!</a>”);
client.println(“<br />”);
client.println(“<hr />”);
//controlling led via checkbox
client.println(“<h1>LED control</h1>”);
//address will look like http://192.168.1.110/?L=1 when submited
client.println(“<form method=get name=LED><input type=checkbox name=L value=1>LED<br><input type=submit value=submit></form>”);
client.println(“<br />”);
//printing LED status
client.print(“<font size=’5′>LED status: “);
if (LEDON)
client.println(“<font color=’green’ size=’5′>ON”);
else
client.println(“<font color=’grey’ size=’5′>OFF”);
client.println(“<hr />”);
client.println(“<hr />”);
client.println(“</body></html>”);
//clearing string for next read
readString=”";
//stopping client
client.stop();
}}}}}
//*******************************
Test result on Firefox browser:
If any questions or comments regarding this – don’t hesitate to drop a comment.
Download project file here: ethtest
Blogsphere: TechnoratiFeedsterBloglines
Bookmark: Del.icio.usSpurlFurlSimpyBlinkDigg
RSS feed for comments on this post | TrackBack URI for this post
New on WinAVR Tutorial
Running TX433 and RX433 RF modules with AVR microcontrollers,Sometimes in embedded design you may want to go wireless. Might be you will want to log various readi …Programming AVR ADC module with WinAVR,Most of AVR microcontrollers have Analog to Digital Converter (ADC) integrated in to chip. Such solut … |
New on WinARM Tutorial
What are differences between WinARM and WinAVR,Everyone who is working with AVR microcontrollers knows this powerful tool – WinAVR (http://win …LPC2000 watchdog timer,As in all microcontrollers watchdog timers purpose isto reset microcontroller after reasonable amount … |

December 16th, 2009 at 2:24 pm
Where can I get WString.h?
Nice post!
December 16th, 2009 at 11:11 pm
Its here named string.zip
http://arduino.cc/en/Tutorial/TextString
January 8th, 2010 at 11:47 am
I,
Thanks for this great tutorial but I dont succed to make it work…
- I download all the necessary library
- I modify the ip and gateway according to my network
- I put one led on the arduino pin 4 as you describe
- I upload ethtest.pde in the arduino
And finaly I put the IP in a mozilla browser but it reply page not found…
Thank you by advance four your help,
PS : Sorry for my Frenchy English…
January 8th, 2010 at 5:42 pm
Are you using any routers?
Look again at:
byte ip[] = { 192, 168, 1, 110 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
Server server(80); //server port
could be that your router is blocking port 80, so you should use one that isn’t blocked. And of course double check ip and gateway.
January 10th, 2010 at 12:48 am
Doesn’t work.
when you compile, it says:
error: stray ‘\’ in program In function ‘void loop()’:
And it keeps on saying that.
Looks like a cool code, doe..
January 13th, 2010 at 12:02 pm
Thank’s you Scienceprog,
I dont really understand why but my rooter was blocking port 80, I try another and It’s now working well…
January 13th, 2010 at 12:11 pm
Another question…
I would like to modify the program in order to accept only connections from a list of clients, do you have any idea to make that kind of filter?
Thank’s by advance for your help.
January 17th, 2010 at 8:39 pm
@Lars:
You will get these errors if you copy and paste from this page directly to Arduino window. The single and double quotes are not rendered properly. Edit the file in gedit. Use the replace function to change the “open” and “close quotes” to just plain quotes. Same thing with the apostrophes.
Dan
January 20th, 2010 at 7:54 am
Is there a way to easily parse the values from the LED status? for example, if you had an RGB led and you could set the color by a drop down box? 1=red, 2=green, 3=blue. Once it’s in a variable it’s easy but It’s not clear on how to parse those values into a variable.
January 21st, 2010 at 12:54 am
All same – just use dropdown form instead of checkbox. Like:
and then same parsing method with readString.contains(), where you find value like saab.
January 30th, 2010 at 5:04 pm
Hallo
How can I come to that control page.
I can’t open that test page.
thanks
March 10th, 2010 at 1:07 am
How can I use to controll two servo for a pan tilt system?
April 12th, 2010 at 6:01 am
[...] Links: Exemplo de WEbServer do site Arduino.cchttp://arduino.cc/en/Reference/Ethernet Exemplo de Formulário no site ScienceProg http://www.scienceprog.com/getting-hands-on-arduino-ethernet-shield/ [...]
May 27th, 2010 at 11:43 am
Great you show us in detail how to set up a client- server-client on the ARduino shield.
I changed the IP address to 10.0.1.55 and I can ping the arduino shield from my computer but I cannot see anything in my browser. What Arduino sofware release did you use to make it work ? Does is work with release 18 ? I changed Arduino and Ethernet shields but still doesn’t work.
July 8th, 2010 at 1:10 am
Hi
Thanks for script, the sketch seem to only turn on the led momentary…is this suppose be the case? I was expecting when u tick led it turns on and when you remove the tick it turns off. Advise will be appreciated.
Cheers,
Ken
July 31st, 2010 at 12:22 pm
Thanks for this article.
I had to add the else section for it to work repeatedly or else after chars LED was not switching.
if (readString.length() < 30) {
//store characters to string
readString.append(c);
}else{
readString = readString.substring(1); //push left
readString.append(c);
}
August 1st, 2010 at 7:47 am
I put the above lines of code into my code and the led is still not staying lit. Has it worked for anyone else or are there any other suggestions.
August 2nd, 2010 at 10:56 pm
I wondering if this web-based arduino control work for a wifi arduino project!What do you think ? i can project a website that send de comand to the “server” that send the comand via wifi to arduino project.
I can use it to manage some sensor in the house and my robot project + android phone attached in the robot like a wificam
August 4th, 2010 at 7:48 am
Hey SciencePrg,
Some insanely nice work there, just the code i needed for a project i’m working on, switching a coffee machine on and off via the internet
Props
Rob.