Se afișează postările cu eticheta retea. Afișați toate postările
Se afișează postările cu eticheta retea. Afișați toate postările

miercuri, 18 martie 2015

Placa de retea cu ENC28J60 si Arduino

   Am testat si o placa de retea cu cipset ENC28J60. Pentru ea exista mai multe librarii pentru conectarea la Arduino, un rezumat l-am gasit in articolul Web-Enable your Arduino with an Arduino ENC28J60 Ethernet shield …
   Eu am ales libraria Ethercard, care se conecteaza diferit de celelalte, dupa cum e prezentat si in articolul mentionat mai sus:
   Am gasit, cu ajutorul lui Alex, un prieten care am reusit sa-l "virusez" cu Arduino, site-ul http://www.lucadentella.it, care are mai multe articole cu aceasta placa de retea, iar unul din ele este enc28J60 and Arduino (9), care prezinta modul de comanda al unui releu dintr-un buton virtual:
  Dupa mai multe zile de teste am constatat ca se blocheaza uneori dupa cateva deci de minute, alteori dupa zeci de ore, si cautand solutii, am dat de articolul An over engineered way to unlock a door in care se mentioneaza folosirea catelului de pasa (watchdog), care poate debloca microcontrolerul in caz de functionare anormala..
   Cateva poze cu de la testelele in care am pus partea de watchdog si de contorizarea a timpului cat functioneaza, deoarece la autoresetare se reia de la zero:
   Am facut un filmulet numit LED controlat prin retea sau wireless (5):
   Sketch-ul derivat din cel de pe site-l http://www.lucadentella.it/ la care am pus partea de contorizarea din exemplul RBBB_server al librariei Ethercard
//original sketch from http://www.lucadentella.it/2012/11/10/enc28j60-e-arduino-9/
// adapted sketch from http://nicuflorica.blogspot.ro/
#include <EtherCard.h>
#include <avr/wdt.h>
#define RELAY_PIN 2

//static byte mymac[]  = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x69};
static byte myip[]   = {192,168,0,251};
static byte gwip[] = {192,168,0,1};
byte Ethernet::buffer[700];
#define STATIC 0  // set to 1 to disable DHCP (adjust myip/gwip values below)

char* on  = "ON";
char* off = "OFF";

boolean relayStatus;
char* relayLabel;
char* linkLabel;

void setup () {
 
  Serial.begin(9600);
  Serial.println("WebRelay Demo");

//  if(!ether.begin(sizeof Ethernet::buffer, mymac, 10))
 if(ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( "Failed to access Ethernet controller");
  else
    Serial.println("Ethernet controller initialized");

 if (!ether.dhcpSetup())
    Serial.println("Failed to get configuration from DHCP");
 // if(!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");
 ether.printIp("My IP: ", ether.myip);
  // ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
  
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);  
  relayStatus = false;
  relayLabel = off;
  linkLabel = on;
  
  wdt_enable(WDTO_1S);//This start the watchdog timer with a 1 second timeout
}
  
void loop() {
wdt_reset();//This resets the timer

long t = millis() / 1000;
  word h = t / 3600;
  byte m = (t / 60) % 60;
  byte s = t % 60; 

  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if(pos) {
        
    if(strstr((char *)Ethernet::buffer + pos, "GET /?ON") != 0) {
      relayStatus = true;
      relayLabel = on;
      linkLabel = off;
    } else if(strstr((char *)Ethernet::buffer + pos, "GET /?OFF") != 0) {
      relayStatus = false;
      relayLabel = off;
      linkLabel = on;
    }
    digitalWrite(RELAY_PIN, relayStatus); 
  
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
    // from http://fabiotomio.com.br/blog/2014/05/07/arduino-modulo-ethernet-enc28j60/
 /*     "Content-Type: text/html\r\n"
      "Refresh: 5\r\n"
      "\r\n"
  */    
     
      "<html><head><meta name='viewport' content='width=200px'/></head><body>"
      "<div style='position:absolute;width:200px;height:200px;top:50%;left:50%;margin:-100px 0 0 -100px'>"
      "<div style='font:bold 14px verdana;text-align:center'>Relay is $S</div>"
      "<br><div style='text-align:center'>"
      "<a href='/?$S'><img src='http://www.lucadentella.it/files/bt_$S.png'></a>"
//      "<h2>$D$D:$D$D:$D$D</h2>"
//      "</div></div></body></html>"
//      "</body></html>"
      ), relayLabel, linkLabel, linkLabel);
//  ), relayLabel, linkLabel, linkLabel, h/10, h%10, m/10, m%10, s/10, s%10);

bfill.emit_p(PSTR("<p>"
"<h2>$D$D:$D$D:$D$D</h2>"),
h/10, h%10, m/10, m%10, s/10, s%10);
//bfill.emit_p(PSTR(" ore de la pornire placa Arduino (actualizeaza la actionare buton)."));
 bfill.emit_p(PSTR("</body></html>"));   


      ether.httpServerReply(bfill.position());
    }
}

// note: for watchdog see https://hackaday.io/project/3731-open-z3zzvw3/log/12362-the-brain-of-the-thingy

   Pe ecranul de monitorizare vom gasi datele necesare pentru a putea accesa pagina:
   Pe site-ul italian e o coletie de articole numite ENC28J60-Arduino in care se gasesc, oana acum 20 de articole cu aceasta placa de retea... inclusiv comanda cu parola...

19.03.2015
   Cu ajutorul datelor de pe site-ul italian si cu informatii de la Alex si de la Andrei am pus si parola:
   Din pacate, cand accesez pagina de pe mai multe periferice (calculatoare, telefoane legate in retea prin cablu sau "uairles") se mai blocheaza...
   Am facut un filmulet numit LED controlat prin retea sau wireless (6) in care se vede cum reactioneaza pagina web in functie de parola introdusa corect sau gresit, in plus, informatiile sunt actualizate la cca. 30 secunde:
02.02.2016
   La adresa http://www.ec.in.th/index.php?route=cms/article&article_id=41 este o schema foarte frumos prezentata de conectare la o placa Arduino a unui placi de retea cu ENC28J60:
03.02.2016
   Am facut inca 2 filmulte, incarcand sketch-ul din articol, punand si un LED portocaliu de 10mm din generatia veche a Microelectronica la pinul A0:

joi, 19 februarie 2015

Placa de retea cu inscriptor SD si.. Arduino (partea a III-a: comanda periferice prin retea) - continuare

   Am zis sa continui testele pentru comanda unui led conectat la placa de retea pe care le-am prezentat in articolul precedent, de data asta sa am control din afara retelei.
   Furnizorul de internet, in cazul meu RCS&RDS, are un servicu de alocare a unui nume contului de acasa. Eu am ales numele de tehniq.go.ro:
   Alt pas care l-am facut este acela de a deschde un port, ales de mine ca 8081:
   Am schimbat si in sketch-ul prezentat in articolul precedent portul:
   La tastarea pentru prima data a adresei tehniq.go.ro:8081 pe ecranul calculatorului, a tabletei sau telefonului mobil vom avea urmatoarea imagine:
   Daca se apasa butonul virtual Turn on LED pe ecran va aparea situatia:
si led-ul verde se va aprinde.
   Daca se apasa butonul virtual Turn off LED pe ecran va aparea situatia:
iar led-ul verde se va stinge.

21.02.2015
   Am mai modificat sketch-ul in functie de observatiile celor care au testat pagina si am afisata temperatura microcontrolului ATmega328 pe pagina, am afisat numarul de aprinderi ale led-ului, am eliminat problemea cresterii nereale prin comanda de "refresh" sau apasare repeatata pe "on", se stocheaza in memoria EEPROM a microcontrolerului numarul de aprinderi si starea anteriora, pentru a nu se sterge datele la un restart sau pana de curent...
- led verde aprins:
- led verde stins:
   Am facut, in sfarsit, si un filmulet numit LED controlat prin internet in care se vede modul de control si ce cum reactioneaza montajul prin comanda de pe un telefon conectat la internet:

   Sketch-ul folosit de mine, ajuns la versiunea 3f3, este:
/*
 Created by Rui Santos
 Visit: http://randomnerdtutorials.com for more arduino projects
 Modified by Nicu Florica aka niq_ro
 visit http://nicuflorica.blogspot.ro/
 or http://arduinotehniq.blogspot.com
 or http://www.tehnic.go.ro

 Arduino with Ethernet Shield
 */

#include <SPI.h>
#include <Ethernet.h>
int led = 9;
int pos = 0; 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = { 192, 168, 2, 178 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 2, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(8081);                             //server port     
String readString;

int clic; // number of mouse clicks
int clic1; // number of recovered mouse clicks
byte stare; // 0 is OFF, 1 is ON
byte stare0; // before state
int a = 0;  // decinal value
int b = 0;  // unitar value
int a1 = 0;  // recovered decimal value
int b1 = 0;  // recovered unitar value

// http://tronixstuff.com/2011/03/16/tutorial-your-arduinos-inbuilt-eeprom/
#include <EEPROM.h>


void setup() {
  
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
   
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());

a1 = EEPROM.read(100);
b1 = EEPROM.read(101);
// recover number of mouse click
clic = a1*256 + b1;

stare0 = EEPROM.read(102);  
  
}


void loop() {
  // Create a client connection
  EthernetClient client = server.available();
  if (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);
         }

         //if HTTP request has ended
         if (c == '\n') {          
           Serial.println(readString); //print to serial monitor for debuging
     
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();     
           client.println("<HTML>");
           // add a meta refresh tag, so the browser pulls again every 10 seconds:
           client.println("<meta http-equiv=\"refresh\" content=\"10\">");
           client.println("<HEAD>");
           client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
           client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
           client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
           client.println("<TITLE>Arduino with Ethernet Shield</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.println("<H2>tehniq.go.ro by niq_ro</H1>");
           client.println("<hr />");
         //  client.println("<br />");  
           client.println("<H1>Arduino with Ethernet Shield</H2>");
           client.println("<br />");  
           client.println("<a href=\"/?button1on\"\">Turn On LED</a>");
           client.println("<a href=\"/?button1off\"\">Turn Off LED</a><br />");   
           client.println("<br />");     
         //  client.println("<br />"); 
           client.println("<H2>");
 
 if (readString.indexOf("?button1on") >0){
           stare = 1;        
          // client.print("<p>LED is ON</p>");
          // digitalWrite(led, HIGH);
          //     clic = clic + 1;
           }
 if (readString.indexOf("?button1off") >0){
            stare = 0;
           //client.print("<p>LED is OFF</p>");
           //digitalWrite(led, LOW);
           //     clic = clic + 1;
           }
// read old state:
stare0 == EEPROM.read(102);

if (stare == 1) {
           client.print("<p>LED is ON</p>");
           digitalWrite(led, HIGH);
           if (stare0 == 0) {clic = clic + 1; }
}

if (stare == 0) {
           client.print("<p>LED is OFF</p>");
           digitalWrite(led, LOW);
//           if (stare0 == 1) {clic = clic + 1; }
}


//if (stare0 =! stare) {clic = clic + 1; }
stare0 = stare;

// write & read data in/from internal EEPROM
// calculate the unitar and zecinal units
a = clic/256;
b = clic - a*256;
// write in internal eeprom
EEPROM.write(100,a);
EEPROM.write(101,b);
// read from internal eeprom
a1 = EEPROM.read(100);
b1 = EEPROM.read(101);
// recover number of mouse click
clic1 = a1*256 + b1;
// write state in internal eeprom 
EEPROM.write(102,stare0); 

           client.print("<p>LED was on ");
           client.print(clic1);
           client.print(" times from 13:33 (21.febr.2015)<p>");

           client.print("<p>Internal temperature of ATmega328P from Arduino board is ");
           client.print(readTemp()/10000);
           client.print("<sup>o</sup>");
           client.print("C<p>");
           
//           client.println("<br />");     
//           client.println("<br />"); 
           client.println("<H4>");
           client.println("<p>Created by Rui Santos. Visit <a href=http://randomnerdtutorials.com target=blank>http://randomnerdtutorials.com</a> for more projects!</p>");  
//           client.println("<br />"); 
           client.println("<p>Tested by Nicu Florica aka niq_ro. Visit <a href=http://www.tehnic.go.ro target=blank>http://www.tehnic.go.ro</a> for more projects!</p>");  
           client.println("<br />"); 
           client.println("<H5>");
           client.println("version. 3e2 / 21.02.2015<p>");
           client.println("</BODY>");
           client.println("</HTML>");
     
     //  readString="";  
           delay(1);
           //stopping client
           client.stop();
             //clearing string for next read
           readString="";  
     
         }
       }
    }
}
}

// https://code.google.com/p/tinkerit/wiki/SecretThermometer
long readTemp() {
  long result;
  // Read temperature sensor against 1.1V reference
  ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = (result - 125) * 1075;
  return result;
}
   
22.02.2015
   Am realizat un filmulet in limba engleza, numit control a LED from Anywhere in the World in care se vede ca am pus si un senzor de umiditate si temperatura de tip DHT11:
25.02.2015
   Cu ajutorul lui Cosmin, un coleg de servici, am pus si partea de parola, dupa cum se vede in filmuletul LED controlat prin internet (2)

vineri, 24 mai 2013

Placa de retea cu inscriptor SD si.. Arduino (partea I - webserver cu informatii despre temperatura si umiditate oferite de senzorul DHT11)

   Am achizitionat o placa de retea cu inscriptor de memorii SD (de fapt micro SD) de pe ebay asa ca trebuie s-o testez si pe aceasta...
   Ea se cupleaza direct pe placa mea compatibila Arduino Uno:
   Dupa cum se observa, aceasta placa este o clona (reproducere) a placii de retea oficiale Arduino (Arduino Ethernet Shield).
   La Arduino pe site se gaseste un articol numit Ethernet library in care se face o prezentare a placii si a comenzilor uzuale, de asemenea, aflam rapid ca pini digitali 4, 10, 11, 12 si 13 sunt folositi pentru comunicatie intre Arduino si placa de retea, respectiv inscriptorul de memorii micro SS:
   Am incarcat in Arduino un sketch din exemplele Ethernet numit WebServer, fara a modifica nimic in el (se gaseste prezentare si in articolul http://arduino.cc/en/Tutorial/WebServer):
acesta citeste valorile intrarilor analogice AN0..AN5 si le afiseaza pe o pagina, care adresa 192.168.1.177.
   Am conectat cablul de retea la placa mea si imediat s-au aprins o multime de LED-uri:
   Intrarile analogice sunt in aer, asa ca rezultatul este:

   Avand senzorul DHT11 care indica temperatura si umiditatea (vezi articolul Ministatie meteo cu senzorul DHT11 si.. Arduino), l-am conectat si pe el:

si am modificat sketch-ul din exemplu, punadu-i si partea de senzor DHT11, rezultandu-mi:

/*
  Web Server

 A simple web server that shows the temperature & humidity from
 a DHT11 sensor using an Arduino Wiznet Ethernet shield. 

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Data from DHT11 is at A2 (analog input 2)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 adapted 24 may 2013

 */

#include <DHT.h>

#define DHTPIN A2     // what pin we're connected the DHT output
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>


#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  dht.begin();  
  
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        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 (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          
          // output the value of temperature and humuidity from DHT
          client.print("Senzorul DHT11 al lui Nicu arata:");
          client.println("<br />");
                  
          client.print("temperatura=");
          client.print(t);
          client.print("gr.C");
          client.println("<br />");
          client.print("umiditate=");
          client.print(h);
          client.print("%");
          client.println("<br />");
           
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

   Rezultatul este:
 
 
   Cu mici modificari in programior, pagina se prezinta astfel:
/*
  Web Server
 A simple web server that shows the temperature & humidity from
 a DHT11 sensor using an Arduino Wiznet Ethernet shield. 

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Data from DHT11 is at A2 (analog input 2)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 adapted 24 may 2013
 by Nicu FLORICA (niq_ro) - http://www.tehnic.go.ro
 niq_ro's version is 1m1

 */

#include <DHT.h>

#define DHTPIN A2     // what pin we're connected the DHT output
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>


#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  dht.begin();  
  
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        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 (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          
          // output the value of temperature and humuidity from DHT
          client.print("www.tehnic.go.ro & nicuflorica.blogspot.com");
          client.println("<br />");
          client.println("<br />");
          client.print("Senzorul DHT11 al lui Nicu arata:");
          client.println("<br />");
                  
          client.print("temperatura=");
          client.print(t);
          client.print("<sup>0</sup>");
          client.print("C");
          client.println("<br />");
          client.print("umiditate=");
          client.print(h);
          client.print("%");
          client.println("<br />");
           
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

25.mai.2013
   Am refacut testele in alta parte, unde este o retea de casa cu un router Edimax, si a trebuit sa schimb adresa paginii, de la 192.168.1.177 la 192.168.2.177, deoarece asa era configurata reteaua:
   Modificarile sunt minine in sketch, doar schimband linia
IPAddress ip(192,168,1, 177);
in
IPAddress ip(192,168,2, 177);

  Am realizat un mic filmulet cu functionarea, numit DHT11 with Ethernet shield and Arduino (1).

  Am modificat sketch-ul, pentru a avea o alta prezentare:
apoi 

   Noua varianta de prezentare a paginii are urmatorul sketch (versiunea 1m2):
/*
  Web Server
 A simple web server that shows the temperature & humidity from
 a DHT11 sensor using an Arduino Wiznet Ethernet shield. 

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Data from DHT11 is at A2 (analog input 2)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 adapted 25 may 2013
 by Nicu FLORICA (niq_ro) - http://www.tehnic.go.ro
 http://nicuflorica.blogspot.ro
 niq_ro's version is 1m2

 */

#include <DHT.h>

#define DHTPIN A2     // what pin we're connected the DHT output
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>


#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,2, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
  dht.begin();  
  
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        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 (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          
          // output the value of temperature and humidity from DHT
          client.println("<h1>");
          client.println("<body style=background:#80BFFF>");
          
          client.print("www.tehnic.go.ro & nicuflorica.blogspot.com");
          client.println("<br />");
          client.println("<br />");
          client.print("Senzorul DHT11 al lui Nicu arata:");
          client.println("<br />");
                  
          client.print("temperatura=");
          client.print(t);
          client.print("<sup>o</sup>");
          client.print("C");
          client.println("<br />");
          client.print("umiditate=");
          client.print(h);
          client.print("%");
          client.println("<br />");
          client.println("</h1>");
          client.println("<h4>");
          client.print("versiune 1m2");
           
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
    Serial.println("======================");
    
  }
}
   Filmuletul care prezinta functionare se numeste DHT11 with Ethernet shield and Arduino (2)!!!

28.5.2013
   Urmand exemplul din articolul Give Your Arduino Project Its Own Mini-Webserver, With An Ethernet Shield am facut o modificare in skecht, inlocuind linia 

EthernetServer server(80);
cu
EthernetServer server(8081);

apoi am incarcat sketch-ul in Arduino si am obtinut informatia la adresa 192.168.2.177:8081:

   Am deschis portul 8081 de la router, bifand si optiunea ENABLE PORT FORWARDING (in poza nu e bifat):
   Am verificat in router ce IP mi s-a alocat la acea conectare (doarece se schimba la fiecare conectare):
   Am folosit si indicatia din articol intrand la http://www.whatismyip.com/:
  Am tastat adresa in alt browser (Internet Explorer) comparand-o cu indicatia de pe pagina locala (Google Chrome) - exista diferenta de indicatie datorita faptului ca valorile se schimba la 5 secunde si senzorul DHT11 are doar numere intregi, fara zecimale:
  Am solicitat si unor prieteni sa verifica adresa si mi-au spus ca era ok, vazand temperatura si umiditatea.. primind si un "print screen":
.. si la finalul articolului, am pus un filmulet explicativ, care se numeste DHT11 with Ethernet shield and Arduino (3):