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

joi, 17 decembrie 2015

Prezentare si stocare date pe pagina ThingSpeak

   Dupa ce m-am tot "jucat" cu minipagini web tip server, cu stil classic si Ajax, am decis sa incerc si folosirea paginii ThingSpeak, care ofera prezentare grafica a unor date si, mai ales, stocare date, care pot fi ulterior prelucrate.
   Prima incercare am facut-o folosindu-ma de o placa Arduino Mega cu placa de retea tip shield (Ethernet shield cu W5100) la care am conectat un sensor AM2302 (DHT22):
   Sketch-ul folosit se gaseste pe GitHub fiind cel numit ThingSpeak_DHT22_ver1a.ino, in care trebuie sa puneti Write API Key-ul canalului pe care il postati:

   Pe canalul ThingSpeak cu 2 valori, cum este facut si sketch-ul, la setari avem:

   In articolul http://community.thingspeak.com/documentation/api/ gasiti toate informatiile necesare...la mine arata asa:
   Montajul de test arata asa:
 
   Am facut si un filmulet, numit Arduino cu placa de retea si senzor DHT22 pe pagina ThingSpeak
19.12.2015
   Deoarece am avut surpriza neplacuta ca la reincarcarea sketch-ului de pe versiunea Arduino IDE 1.6.5 sa pot trimite date abia la 7 minute (in ecranul serial comenzile se trimiteau litera cu litera), nu la 20 secunde ca de obicei, am modificat sketch-ul pentru versiuni mai stabile (1.0.3..1.0.5), acest sketch fiind ThingSpeak_DHT22_ver1a_ide10.ino .

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)

luni, 16 februarie 2015

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

poze pierdute repostate in 06.10.2015

   Acum ceva timp am folosit placa de retea cu cipset W5100 de tip shield (se aseaza direct pe Arduino Uno, fara alte legaturi) pentru a avea informatii in retea despre temperatura si umiditate (vezi articolul Webserver cu informatii despre temperatura si umiditate oferite de senzorul DHT11), apoi am scris date pe un card SD (vezi Memorare date pe cardul micro SD), acum voi aprinde si stinge un LED.
   Fizic, placa de retea "shield" cu W5100, arata asa:
   Pentru experimente, am folosit ca baza articolul Arduino Webserver Control Lights, Relays, Servos, etc... care are are sursa pe blogul http://randomnerdtutorials.com/, mai precis articolul Arduino – Webserver with an Arduino + Ethernet Shield
   La montajul meu am folosit un led multicolor, comandand doar led-ul verde, care e conectat la D9 nefolosit de placa de retea, iar cel rosu si cel albastru sunt conectate pe pini folositi si de placa de retea (D10 si D11):
   Starile sunt:
- led verde stins:
- led verde aprins:
   Pentru comanda am folosit un telefon conectat prin wireless la retea... dar merge foarte bine si de pe calculator, vedeti in filmuletul LED controlat prin retea sau wireless unde este o varianta simplificata de pagina, doar buton de aprindere si buton de stingere LED, cu indicare stare LED si linkuri la pagina autorului si la a mea:

   Poze cu cele 2 stari si pagina nefinisata:
- led verde stins:
- led verde aprins:
   Pentru a stii cum e configurata reteaua, se cauta IP-ul calculatorului fix, cu care se face si incarcarea sketch-ului, gasind ca IP-ul este 192.168.2.17, Subset Mask e 255.255.255.1 si Default gateway este 192.168.2.1.. pentru placa de retea folosita la Arduino o sa aloc 192.168.2.178...
   Sketch-ul folosit de mine 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(80);                             //server port     
String readString;



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);
  
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


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>");
           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>Random Nerd Tutorials Project</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
   
           client.println("<H2>Random Nerd Tutorials Project</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){
           client.print("<p>LED is ON</p>");
           }
 if (readString.indexOf("?button1off") >0){
           client.print("<p>LED is OFF</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("</BODY>");
           client.println("</HTML>");
     
           delay(1);
           //stopping client
           client.stop();
           //controls the Arduino if you press the buttons
           if (readString.indexOf("?button1on") >0){
               digitalWrite(led, HIGH);
           //    client.print("<p>LED is ON</p>");
           }
           if (readString.indexOf("?button1off") >0){
               digitalWrite(led, LOW);
           //    client.print("<p>LED is OFF</p>");
           }
              //clearing string for next read
            readString="";  
     
         }
       }
    }
}
}
   

joi, 13 iunie 2013

Placa de retea cu inscriptor SD si.. Arduino (partea a II-a: memorare date pe cardul micro SD)

   In prima parte m-am ocupat de folosirea partii de retea a placii "Ethernet shield", acum vreau sa "atat" si partea de scriere si citire pe o memorie microSD, asa ca intai m-am dus la articolul numit Some things to keep in mind when using the SD Library pe care l-am gasit pe site-ul Arduino.
   Primul programior (sketch) pe care l-am testat este "ReadWrite", cel in care se creeaza un fisier text, se scrie in el ceva, se salveaza, apoi se deschide si se citeste textul..
am modificat repede textul de scris, obtinand:
  Am deschis si programiorul din exemplele librariei SD, numit "CardInfo":
   Avand deja realizata partea de indicare pe ecranul LCD 16x2 a temperaturii si umiditatatii oferite de senzorul DTH11, a orei si datei oferite de ceasul de timp real DS1307, am conectat si placa de retea care are si inscriptor de memorie microSD.
   Dupa combinarea mai multor sketch-uri si ceva "sudoare", am realizat partea de scriere pe monitorizarea seriala si intr-un fisier pe cardul de memorie microSD:
   Sketch-ul meu este:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
// add part wirh LCD special character http://www.roroid.ro/wiki/pmwiki.php/Main/KitLCDUtilizare
// adapted sketch for DHT11 by by niq_ro from http://nicuflorica.blogspot.ro/
// version 5.0

#include <SD.h>
const int chipSelect = 4;
#include <DHT.h>
#define DHTPIN A2     // what pin we're connected DHT11
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);


#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // 0x20 is adresss for LCC 16x2
RTC_DS1307 RTC;

byte picatura[8] = {
  0b00100, 0b00100, 0b01010, 0b01010, 0b10001, 0b10001, 0b10001, 0b01110
};//Definim imaginea ce dorim sa o reprezentam in binar

void setup () {
  dht.begin();
  lcd.init(); 
  lcd.createChar(0, picatura);//Se creeaza caracterul nostru
  lcd.backlight(); //backlight is now ON
  // set up the LCD's number of columns and rows: 

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

  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
// }


  lcd.begin(16, 2);
  // Print a logo message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (2500);
  lcd.clear();
  
  lcd.setCursor(0, 0);
  lcd.print("ceas cu calendar");  
  lcd.setCursor(0, 1);
  lcd.print("temp. si umidit.");
  delay (2500);
  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("ceas cu calendar"); 
  lcd.setCursor(2, 1);
  lcd.print("versiunea 5.1");
  delay (2500);
  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("scriere date pe"); 
  lcd.setCursor(0, 1);
  lcd.print("card microSD");
  delay (2500);
  lcd.clear();  
  
  Wire.begin();
  
Wire.beginTransmission(0x68);
Wire.write(0x07); // move pointer to SQW address
Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
Wire.endTransmission();
// end part code from http://tronixstuff.wordpress.com/

    RTC.begin();
// RTC.adjust(DateTime(__DATE__, __TIME__));
// if you need set clock... just remove // from line above this
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

}
int qiu=1;

void loop () {
  qiu = qiu + 1;
  DateTime now = RTC.now();
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  int hz = h/10;
  int hu = h - hz*10;
   lcd.setCursor(1, 0);
   if ( now.hour() < 10)
   {
     lcd.print(" "); 
     lcd.print(now.hour(), DEC);
   }
   else
   {
   lcd.print(now.hour(), DEC);
   }
   lcd.print(":");
   if ( now.minute() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.minute(), DEC);
   }
   else
   {
   lcd.print(now.minute(), DEC);
   }
   lcd.print(":");
   if ( now.second() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.second(), DEC);
   }
   else
   {
   lcd.print(now.second(), DEC);
   }
   lcd.print(" "); 
   
   lcd.setCursor(12, 0);
    if ( t < 10)
   {
     lcd.print(" "); 
     lcd.print(t);
   }
   else
   {
   //lcd.print(qiu);
   lcd.print(t);
   }
   lcd.write(0b11011111);
   lcd.print("C");
    
   lcd.setCursor(0, 1);
   if ( now.day() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.day(), DEC);
   }
   else
   {
   lcd.print(now.day(), DEC);
   }
   lcd.print("/");
   if ( now.month() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.month(), DEC);
   }
   else
   {
   lcd.print(now.month(), DEC);
   }
   lcd.print("/");
   lcd.print(now.year(), DEC);
   lcd.print(""); 
   
  
   lcd.setCursor(12, 1);
   lcd.print(hz);
   lcd.print(hu);
   lcd.print("%");
   lcd.print(char(0));//tiparim caracterul nou creat 

if (qiu > 60)
{
 // this is part who I, niq_ro, work hard :-)))))))))
// make a string for name of txt file
String fisier = "";
    // put the year
    fisier += String(now.year(), DEC);
    fisier += "/";
    // put the month
    fisier += String(now.month(), DEC);
    fisier += "/";
    // put the day
    fisier += String(now.day(), DEC);
    fisier += "-";
String fisier2 = "";
    // put the hour
    fisier2 += String(now.hour(), DEC);
    fisier2 += ":";
    // put the minute
    fisier2 += String(now.minute(), DEC);
    fisier2 += ":"; 
    // put the second
    fisier2 += String(now.second(), DEC);
    fisier2 += "- ";
   
 // make a string for assembling the data to log:
  String dataString = "";

    // put the temperature
    dataString += "t=";
    dataString += String(t);
    dataString += "^C";

    // put the humidity
    dataString += " h=";
    dataString += String(h);
    dataString += "%";
    
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("fisier10.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(fisier);
    dataFile.print(fisier2);
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.print(fisier);
    Serial.print(fisier2);
    Serial.println(dataString);
    //Serial.println(qiu);
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening fisier10.txt");
  }
 qiu = 0;
 }

   delay(500);
}

vineri, 14.iuni.2013
   Dupa ce am lasat conectat montajul mai multe ore, am constatat uneori ca apar erori la citirea datelor din RTC (ore si minute) si apoi la scriere, m-am gandit e cam mare consumul, asa ca am inlocuit cablul usb cu prelungitor cu un cablu de cca. 1m de la un scanner si, totodata, sting  lumina de fundal al afisajului cu cristale lichide cand se face scrierea...
   O alta solutie, pentru reducerea consumului, este aceea in care sa folosesc doar un modul de microSD...
   Sketch-ul modificat este:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
// add part wirh LCD special character http://www.roroid.ro/wiki/pmwiki.php/Main/KitLCDUtilizare
// adapted sketch for DHT11 by by niq_ro from http://nicuflorica.blogspot.ro/
// version 5.3

#include <SD.h>
const int chipSelect = 4;
#include <DHT.h>
#define DHTPIN A2     // what pin we're connected DHT11
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);


#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // 0x20 is adresss for LCC 16x2
RTC_DS1307 RTC;

byte picatura[8] = {
  0b00100, 0b00100, 0b01010, 0b01010, 0b10001, 0b10001, 0b10001, 0b01110
};//Definim imaginea ce dorim sa o reprezentam in binar

void setup () {
  dht.begin();
  lcd.init(); 
  lcd.createChar(0, picatura);//Se creeaza caracterul nostru
  lcd.backlight(); //backlight is now ON
  // set up the LCD's number of columns and rows: 

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


  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
// }


  lcd.begin(16, 2);
  // Print a logo message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (2500);
  lcd.clear();
  lcd.noBacklight(); //backlight is now OFF
  lcd.clear();
  delay(200);
  lcd.setCursor(0, 0);
  lcd.print("ceas cu calendar");  
  lcd.setCursor(0, 1);
  lcd.print("temp. si umidit.");
  delay (2500);
  lcd.noBacklight(); //backlight is now OFF
  lcd.clear();
  delay(200);
  lcd.backlight(); //backlight is now OFF
  lcd.setCursor(0, 0);
  lcd.print("ceas cu calendar"); 
  lcd.setCursor(2, 1);
  lcd.print("versiunea 5.3");
  delay (2500);
  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("scriere date pe"); 
  lcd.setCursor(0, 1);
  lcd.print("card microSD");
  delay (2500);
  lcd.clear();  
  
  Wire.begin();
  
Wire.beginTransmission(0x68);
Wire.write(0x07); // move pointer to SQW address
Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
Wire.endTransmission();
// end part code from http://tronixstuff.wordpress.com/

    RTC.begin();
// RTC.adjust(DateTime(__DATE__, __TIME__));
// if you need set clock... just remove // from line above this
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

}
int qiu=1;

void loop () {
  qiu = qiu + 1;
  DateTime now = RTC.now();
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  int hz = h/10;
  int hu = h - hz*10;
   lcd.setCursor(1, 0);
   if ( now.hour() < 10)
   {
     lcd.print(" "); 
     lcd.print(now.hour(), DEC);
   }
   else
   {
   lcd.print(now.hour(), DEC);
   }
   lcd.print(":");
   if ( now.minute() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.minute(), DEC);
   }
   else
   {
   lcd.print(now.minute(), DEC);
   }
   lcd.print(":");
   if ( now.second() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.second(), DEC);
   }
   else
   {
   lcd.print(now.second(), DEC);
   }
   lcd.print(" "); 
   
   lcd.setCursor(12, 0);
    if ( t < 10)
   {
     lcd.print(" "); 
     lcd.print(t);
   }
   else
   {
   //lcd.print(qiu);
   lcd.print(t);
   }
   lcd.write(0b11011111);
   lcd.print("C");
    
   lcd.setCursor(0, 1);
   if ( now.day() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.day(), DEC);
   }
   else
   {
   lcd.print(now.day(), DEC);
   }
   lcd.print("/");
   if ( now.month() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.month(), DEC);
   }
   else
   {
   lcd.print(now.month(), DEC);
   }
   lcd.print("/");
   lcd.print(now.year(), DEC);
   lcd.print(""); 
   
  
   lcd.setCursor(12, 1);
   lcd.print(hz);
   lcd.print(hu);
   lcd.print("%");
   lcd.print(char(0));//tiparim caracterul nou creat 

if (qiu > 60)

{
 // this is part who I, niq_ro, work hard :-)))))))))
// make a string for name of txt file
String fisier = "";
    // put the year
    fisier += String(now.year(), DEC);
    fisier += "/";
    // put the month
    fisier += String(now.month(), DEC);
    fisier += "/";
    // put the day
    fisier += String(now.day(), DEC);
    fisier += "-";
String fisier2 = "";
    // put the hour
    fisier2 += String(now.hour(), DEC);
    fisier2 += ":";
    // put the minute
    fisier2 += String(now.minute(), DEC);
    fisier2 += ":"; 
    // put the second
    fisier2 += String(now.second(), DEC);
    fisier2 += "- ";
   
 // make a string for assembling the data to log:
  String dataString = "";

    // put the temperature
    dataString += "t=";
    dataString += String(t);
    dataString += "^C";

    // put the humidity
    dataString += " h=";
    dataString += String(h);
    dataString += "%";
  
  // background should be off to reduce power consumption
  lcd.noBacklight(); //backlight is now OFF
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("fisier19.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(fisier);
    dataFile.print(fisier2);
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.print(fisier);
    Serial.print(fisier2);
    Serial.println(dataString);
    //Serial.println(qiu);
    lcd.backlight(); //backlight is now ON
    lcd.setCursor(0, 0);
    lcd.print("*");
    delay(500);
    lcd.setCursor(0, 0);
    lcd.print(" ");
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening fisier19.txt");
    lcd.backlight(); //backlight is now ON
    lcd.setCursor(0, 0);
    lcd.print("!");
    delay(100);
    lcd.setCursor(0, 0);
    lcd.print(" ");
  }
 qiu = 0;
  }

   delay(500);
}

   Filmuletul, care prezinta cum se comporta acest montaj, se numeste humidity, temperature, hour and data recorded on microSD using Ethernet shield with Arduino (II):

PS: daca se doreste salvarea datelor mai rar sau mai des, schimbati valoarea parametrulului qiu din linia cu if.
if (qiu > 60)
   Daca valoarea se pune 600, salvarea se va face la cca. 60 de secunde (10 minute)....

PS: schema de conectare este clasica, doar ca am folosit suplimentar shield-ul de retea si inscriptorde memmorii SD: