Introduction: Easy Basic Arduino Ethernet Controller

Picture of Easy Basic Arduino Ethernet Controller

I recently went out and bought an Arduino Ethernet Shield but couldnt really put it to use as i couldnt find any easy tutorials so i started to try to code by myself.I was able to come up with a simple section of code which turned on a LED from your internet broweser.Unfortunatly so far i have not been able to control the LED from outside of my home network.


Step 1: Parts

An Arduino
An Arduino Ethernet Shield
A Breadboard
An LED
Connecting Wires
An Ethernet cable 

Step 2: Initial Hardware Set Up

Picture of Initial Hardware Set Up

If you have one of the newer Arduino Ethernet Shields,it will come with the Mac Address writen on the back of it.
Write that down seperatly before attaching your Shield to the Arduino Board.

To set up,just plug in the header pins from the shield into your Arduino.

Use the ethernet cable to conect your Arduino Ethernet Shield to your Network via your Router.

Note that The Ethernet shield is attached to pins 10, 11, 12, 13 so those cannot be used.

Connect the Positive end of the LED on a breadboard and in turn to Pin 8 and the negative end of the LED to Ground on the Ethernet shield.





Step 3: Acquiring the Basic Info (MAC Address,IP Address,Port Number)

If you have one of the newer Shields it should come with the Mac adress written on the back.

The IP address will be dependent on your local network and to find that out you can use Comamnd Promt.
Open up command promt and type in "ipconfig"

It should then show you your IP Address,default gateway and your subnet mask

You will also need the port you want to use.Port 80 is default for HTTP but since my internet provider had it blocked i ended up using port 8081.

Step 4:

Picture of

/*
  Web Server
A simple web server
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
*/
//-------------------------------------------------------------------------------------------------------
#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x48, 0xD3 };

// The IP address will be dependent on your local network:
// assign an IP address for the controller:

IPAddress ip(192,168,1,20);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255, 255, 255, 0);

// Initialize the Ethernet server library with the port you want to use.
EthernetServer server(8081);
String readString;
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------
// Any extra codes for Declaration :

// Declare Pin 8 as an LED because thats what we will be connecting the LED to.You could use any other pin and would then have to change the pin number.
int led = 8;

//-------------------------------------------------
//-------------------------------------------------------------------------------------------------------
void setup()
{
//-------------------------------------------------

// Extra Set up code:
pinMode(led, OUTPUT); //pin selected to control

//-------------------------------------------------
//-------------------------------------------------------------------------------------------------------
//enable serial data print
  Serial.begin(9600);

  //start Ethernet
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("Server is at ");
  Serial.println(Ethernet.localIP());
  Serial.println("LED Controller Test 1.0");
}
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------

void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client)

  {
    Serial.println("new client");

    while (client.connected())
    {
      if (client.available())

      {
        char c = client.read();

        //read char by char HTTP request
        if (readString.length() < 100)

        {

          //store characters to string
          readString += c;
          //Serial.print(c);


          Serial.write(c);
          // if you've gotten to the end of the line (received a newline
          // character) and the line is blank, the http request has ended,
          // so you can send a reply
          //if HTTP request has ended
          if (c == '\n') {
            Serial.println(readString); //print to serial monitor for debuging
//--------------------------------------------------------------------------------------------------------
// Needed to Display Site:
client.println("HTTP/1.1 200 OK"); //send new page
            client.println("Content-Type: text/html");
            client.println();
            client.println("<HTML>");
            client.println("<HEAD>");

//--------------------------------------------------------------------------------------------------------
//-------------------------------------------------

// what is being Displayed :     
        
            client.println("<TITLE>Home Automation</TITLE>");
             client.println("<center>");
            client.println("</HEAD>");
            client.println("<BODY>");
            client.println("<H1>Home Automation</H1>");
            client.println("<hr />");
            client.println("<center>");

            client.println("<a href=\"/?lighton\"\">Turn On Light</a>");
            client.println("<br />");
            client.println("<br />");
            client.println("<a href=\"/?lightoff\"\">Turn Off Light</a><br />");     

            client.println("</BODY>");
            client.println("</HTML>");

            delay(1);
            //stopping client
            client.stop();

            //-------------------------------------------------
            // Code which needs to be Implemented:
            if(readString.indexOf("?lighton") >0)//checks for on
            {
              digitalWrite(8, HIGH);    // set pin 8 high
              Serial.println("Led On");
            }
            else{
              if(readString.indexOf("?lightoff") >0)//checks for off
              {
                digitalWrite(8, LOW);    // set pin 8 low
                Serial.println("Led Off");
              }
            }
            //clearing string for next read
            readString="";

            // give the web browser time to receive the data
            delay(1);
            // close the connection:
            client.stop();
            Serial.println("client disonnected");

          }
        }
      }
    }
  }
}

Step 5: Feedback

Try the steps and see if it works out if it doesnt work i will try to figure out what went wrong and do leaves comments so i can improve.

Comments

alexandreb78 (author)2017-09-20

I did it and added multiple output (2,3,4,5,6)

The only problem I have is that the outputs blinks when it'S ON (HIGH). Is there a way to solve the problem?

Never mind! Turns out I had flashing LEDs.... With standards LED it works great!

Humera fathima (author)2017-03-23

Hi,

Iam new to arduino ,i tried executing the same code but iam not getting the gui page and the blink of led too.Can you please help me.I have put the screen shot of com3 too.

D6equj5 (author)2016-08-23

Hi,

nice instructable.

How could I access different arduinos via my ethernet? EG five arduinos, accessible from the web via port forwarded IP through my router - or would I have to use one arduino to route appropriate traffic to relevant arduinos?

Many thanks

D6

Radu-CostinN (author)2016-07-24

If you want to use an adress from "the outside of your network" you need to portforward your router. So you may ask yourself what is portforwarding? For example http servers uses port 80. In your house you have let's say 5 PCs, each with a different internal IP adress. The router needs to know where to transfer the info from port 80 because when you use the ip provided by the internet provider you contact the router not the arduino/pc. If you want to acces your arduino, you have to say the router to which computer he has to redirect that port. Something like: Internet -> router -> tell the router to send the information to arduino (portforward)->arduino. I never used a ethernet shield on my arduino and never dealt with ethernet on arduino, but I think that is your problem.

AsAdK14 (author)2016-03-03

Hello everyone,

I am a beginner with Arduino, actually, I want to use an ethernet shield with Arduino. but there is one question my mind.

Can the ethernet shield attached with Arduino be used as OUTPUT to collect the data from sensors or always it only works as an INPUT for the internet connection?

Thank you in advance for your precious time.

MikeT14 made it! (author)2015-06-29

Very nice! As a beginner, this taught me a lot. I reworked the code to control a SainSmart 8ch relay board with momentary and latching contacts over the web.

Philippe31470 (author)MikeT142016-02-12

Hi MikeT14!

I am interested by your code. Could you share it with us?

Thank you!

MikeT14 (author)Philippe314702016-02-12

This is what I use to this day and it works flawlessly for control of my home with my phone.

Philippe31470 (author)MikeT142016-02-13

Dear Mike,

Thank you very much for your prompt answer!

This is very close to what I need! I have to change high by low and low by high because relay from my board turn ON with a 5 volts signal!

I will let you know if it works well, but not tomorrow, I am waiting for my Arduino board....I will normally receive it soon....

Thank you again to share your work, it will help me for sure!

Regards

MikeT14 (author)Philippe314702016-02-13

very good, like I said this works perfectly for me. let me know your outcome! good luck!

Philippe31470 (author)MikeT142016-02-14

OK, I will tell you as soon as I receive my arduino!

MikeT14 (author)Philippe314702016-02-12

//----------------------------------------------------------------------------------------------
/*
A customized home automation web server to control burglar alarm and a few doors.
* Ethernet Shield attached to pins 10, 11, 12, 13 - DO NOT USE Shield pins!
* Much thanks to NIkheel94!
*/
//----------------------------------------------------------------------------------------------
// Device Init.
#include <SPI.h>
#include <Ethernet.h>
boolean reading = false;

#define REQ_BUF_SZ 8

// MAC setting.
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// IP setting.
IPAddress ip(127, 0, 0, 1);
IPAddress gateway(255, 255, 255, 0);
IPAddress subnet(127, 0, 0, 0);

// Server port init.
EthernetServer server(80);
String readString;
//----------------------------------------------------------------------------------------------
// Device Init.
void setup()
{
// Set digi. pins 02-09 to OUTPUTS and set pins HIGH to turn off relays:
pinMode(2, OUTPUT); // ~ Relay 1
pinMode(3, OUTPUT); // ~ Relay 2
pinMode(4, OUTPUT); // ~ Relay 3
pinMode(5, OUTPUT); // ~ Relay 4
pinMode(6, OUTPUT); // ~ Relay 5
pinMode(7, OUTPUT); // ~ Relay 6
pinMode(8, OUTPUT); // ~ Relay 7
pinMode(9, OUTPUT); // ~ Relay 8
//----------------------------------------------------------------------------------------------
digitalWrite(2, HIGH); // Pins set to HIGH to turn off relays
digitalWrite(3, HIGH); // ~
digitalWrite(4, HIGH); // ~
digitalWrite(5, HIGH); // ~
digitalWrite(6, HIGH); // ~
digitalWrite(7, HIGH); // ~
digitalWrite(8, HIGH); // ~
digitalWrite(9, HIGH); // ~
//----------------------------------------------------------------------------------------------
// Start Ethernet
Ethernet.begin(mac, ip, gateway, subnet, dns);
server.begin();
delay(1000); // Give time to init.
}
//----------------------------------------------------------------------------------------------
// Main loop
void loop()
{
// Listen for incoming clients
EthernetClient client = server.available();
if (client)

boolean currentLineIsBlank = true;
boolean sentHeader = false;

{
while (client.connected())
{
if (client.available())
{
char c = client.read();

//read char. by char. HTTP request
if (readString.length() < 250)
{
//store characters to string
readString += c;
if (c == '\n')
{
//----------------------------------------------------------------------------------------------
// Site Init:
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");

//----------------------------------------------------------------------------------------------
// WEB txt:
client.println("<TITLE>awtomazzjoni</TITLE>"); // Basic HTML
client.println("<center>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<style>");
client.println("body {background-color:darkgrey}");
client.println("h1 {color:blue}");
client.println("p {color:yellow}");
client.println("</style>");
client.println("<H1>Remote Controls</H1><hr />");
client.println("<center>");
client.println("<p>If you know the drill, make it happen.</p><br />");
client.println("<p>Otherwise, you can leave this page by clicking below:</p><br />");
client.println("<a href=\"https://www.google.com/\"\">Go to Google</a><br /><br />");
client.println("<a href=\"https://www.yahoo.com/\"\">Go to Yahoo!</a><br /><br />");
client.println("</BODY>");
client.println("</HTML>");

// Stop client
delay(250);
client.stop();
//----------------------------------------------------------------------------------------------
// Begin "ALARM" relay control:
if(readString.indexOf("?RELAY_1") >0) // Momentarily Activate Relay 1 for 2.5 secs.
{
digitalWrite(2, LOW);
delay(2500);
digitalWrite(2, HIGH);
}
if(readString.indexOf("?RELAY_2") >0) // Momentarily Activate Relay 2 for 2.5 secs.
{
digitalWrite(3, LOW);
delay(2500);
digitalWrite(3, HIGH);
}
if(readString.indexOf("?RELAY_3") >0) // Momentarily Activate Relay 3 for 2.5 secs.
{
digitalWrite(4, LOW);
delay(2500);
digitalWrite(4, HIGH);
}
if(readString.indexOf("?RELAY_4") >0) // Momentarily Activate Relay 4 for 2.5 secs.
{
digitalWrite(5, LOW);
delay(2500);
digitalWrite(5, HIGH);
}
if(readString.indexOf("?RELAY_5") >0) // Momentarily Activate Relay 5 for 2.5 secs.
{
digitalWrite(6, LOW);
delay(2500);
digitalWrite(6, HIGH);
}
// Begin "Door" relay control:
if(readString.indexOf("?RELAY_6") >0) // Momentarily Activate Relay 6 for 2.5 secs.
{
digitalWrite(7, LOW);
delay(2500);
digitalWrite(7, HIGH);
}
if(readString.indexOf("?RELAY_7") >0) // Momentarily Activate Relay 7 for 2.5 secs.
{
digitalWrite(8, LOW);
delay(2500);
digitalWrite(8, HIGH);
}
if(readString.indexOf("?RELAY_8") >0) // Momentarily Activate Relay 8 for 2.5 secs.
{
digitalWrite(9, LOW);
delay(2500);
digitalWrite(9, HIGH);
}
//----------------------------------------------------------------------------------------------
// Begin "LATCHING" relay control:
if(readString.indexOf("?LATCH_R1") >0) // Latch Relay 1
{
digitalWrite(2, LOW);
}
// if(readString.indexOf("?LATCH_R2") >0) // SPARE-Latching Uncomment to activate, dupe as needed
// {
// digitalWrite(X, LOW);
// }
// All latching reset
if(readString.indexOf("?RST_LATCH") >0) // Checks LR activation VIA WEB
{
delay(1000);
digitalWrite(2, HIGH); // Resets all latching, turns off all relays
digitalWrite(3, HIGH); // ~
digitalWrite(4, HIGH); // ~
digitalWrite(5, HIGH); // ~
digitalWrite(6, HIGH); // ~
digitalWrite(7, HIGH); // ~
digitalWrite(8, HIGH); // ~
digitalWrite(9, HIGH); // ~
}
{
// clear string for next read
readString="";

// Give the web browser time to receive the data
delay(250); // close the connection:
readString="";
client.stop();
}
}
}
}
}
}
}
// END---------------------------------------------------------------------------------------END

NIkheel94 (author)MikeT142015-07-06

Nice one Mate :)
I was planning on doing something similar, just haven't had a chance to get to it yet.

Kaji_fi (author)2016-01-17

Got it working on Arduino Nano with UIPEthernet library! Thanks!

https://twitter.com/Kaji_fi/status/688701859125678...

https://github.com/ntruchsess/arduino_uip

sury.korivipadu (author)2016-01-09

Hi,

I am having Arduino Uno board with me. Which ethernet shield is compatible with Arduino Uno?

Thanks.

Genius 470 (author)2015-11-12

Hi,

good tutorial, i found it very useful, however i was wondering could you write me a code example, so it could control 9 LED's?

Thank you.

harshitg9 (author)2015-10-22

I want to know does i need to make server or webpage additionaly for controlling my led or i can access my led through this program only over the internet

ElvisB2 (author)2015-09-26

How to connect Independent 5 leds, please help me this is my project for school, Thanks

WilliamE2 (author)2015-05-10

worked fine on win 7 with internet explorer 8.0.7601..... , but not on win 7 with chrome Version 42.0.2311.135 M

Strange - will look into it.

NIkheel94 (author)WilliamE22015-05-12

If i remember correctly when i tried it i think it worked on all browsers.
I dont remember the exact version i was using at the time.
Unfortunately this is not my field of expertise so i have no idea why it may not have worked.

PetervdPol made it! (author)2015-03-09

Cool instructable! I added a resistor to the LED so I didn't fry it and added a motor for max effect. Now let's do something useful with it!

NIkheel94 (author)PetervdPol2015-05-12

Cool stuff. Smart putting the resistor.
Yeah i forgot to add the resistor to mine. I was really exited and in rush to get it to work that i forgot about the resistor. Fail.

IbrahimA5 (author)2014-12-31

the question is , how can the arduino work as a MAC chip?

nurizzatimdz (author)2014-10-23

Hello AgentWolf :)

I have a few question to ask. Currently now I'm on my progress to finish up my final year bachelor degree project. My project title namely as, a web based controlling home equipment using Arduino.

So, may I know, the suitable programming language to develop my web based software? and the list of programming or library that I may used for my Arduino and my project.

:)

NIkheel94 (author)nurizzatimdz2014-11-16

I am not an expert but only an enthusiast so i am not the best person to ask. I would suggest you do the research on your own because its better than me giving you the wrong information. I apologize in advance.

You can Use Just the Arduino language on its own as i did using the following libraries depending on what you want to achieve:

Ethernet - for connecting to the internet using the Arduino Ethernet Shield

WiFi - for connecting to the internet using the Arduino WiFi shield

LiquidCrystal - for controlling liquid crystal displays (LCDs)

Servo - for controlling servo motors

Stepper - for controlling stepper motors

Best Place of Reference would be the Arduino Website and Github and other similar projects. I have seen alot of people use Python and HTML in conjunction with the Arduino Platform.

You can take what i have and edit/add on to it to fit your needs. You can change the code for the LED section to work with Relays.

Once again my apologies. Good Luck.

Birixidor (author)2013-10-18

Nice job!
Have been tinkering with a similar project that lets you control relays in the same manner if you want this to work over the internet you have to route the port you are using to the arduinos local IP address. I have a dlink router and use the virtual server section to map the public port comming from the internet to my arduino's local ip and port (can use the same or different ports, i use the same to make it simpler).
Do bear in mind that anyone in the world could potentially have access to it tho as there's no authentication portal to keep out unwanted guests.

To answer the question from yyyazj, yes chrome or any other web browser becomes the client

NIkheel94 (author)Birixidor2013-10-20

Thanks for you input and answering that Question.
I am currently busy with school so i haven't had the chance to experiment with Relays but i did think about tinkering with it.I am planning it out in my head and i just need to implement it.As for controlling it from outside my network i have failed to make it work.I just need to keep trying till i finally get it.

yyyyazj (author)2013-10-17

I have a question, because the Arduino is working as the websever, so everytime we open the Chrome, and type the IP and the port of Arduino, is the time we use the Chrome as the client ? Right?

mastelios (author)2013-07-23

Nice instructable!test it and works great!thumbs up!

NIkheel94 (author)mastelios2013-08-20

Thanks.
Glad it worked.

Computothought (author)2013-08-03

To have it controlled form the outside you have to open a port on your router. Not recommended unless you really know what you are doing. You may want to add a resistor in series with the led for safety reasons on your Arduino.

The code obviously took some to to prepare. Must have been a big job for you.

NIkheel94 (author)Computothought2013-08-20

Thanks.
I dont know if its bad but for a "Noob" it took me about a Month to figure everything out and understand what i was doing and finally have it working.
I tired to open up a port and have it work from the outside but unfortunately failed to do so.Thanks for the tip i will keep the resistor in mind for next time.

About This Instructable

52,464views

109favorites

License:

More by NIkheel94:Streaming the Xbox 360 to Twitch using an older VGA/DVI PC Monitor with Seperate Sound (Monitor Without Speakers)Easy Basic Arduino Ethernet ControllerMost Basic Form of Hydroponics
Add instructable to: