Web + datalogger

Después de unos ajustes al programa he podido realizar lo que me proponía.

Se trata de poder mostrar via HTTP a través de una Ethernet Shield valores de temperatura y humedad, tal que así:

Los valores se refrescan cada 15 segundos.

Tengo dos sensores DS18S20, un sensor de humedad DHT11 y un reloj DS1307.

Muestro los valores vía web y cada hora guardo los valores de temperatura exterior y humedad exterior en una micro SD con este formato:

19:00 , 20/12/2014, 12,38 , 45
20:00, 20/12/2014, 11,58 , 49

También tengo un led RGB para mostrar un poco las diferencias de temperatura exterior y interior.
En arduino UNO no he podido implementarlo por falta de recursos (SRAM), al final he utilizado arduino DUE.

Aquí está el código ( está adaptado para Arduino Due pero creo que funciona con todos los modelos modificando las librerías):

No me cabía todo en un post, os pongo el código aquí.

Un saludo.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <dtostrf.h>
#include "RTCdue.h"
#define SPI_SD 4
#define SPI_ETHERNET 10 




#define DHTPIN 6
byte bGlobalErr;
byte DHTDAT[5];
int hum;



#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress S1 = {0x28, 0xD7, 0x96, 0x4A, 0x03, 0x00, 0x00, 0x6B};  //Sensor Interior  0x28 0xB5 0x98 0x1A 0x03 0x00 0x00 0xBC 
DeviceAddress S2 = {0x28, 0xFF, 0x14, 0x17, 0x44, 0x04, 0x00, 0x01};  //Sensor Exterior 0x28 0xFF 0x14 0x17 0x44 0x04 0x00 0x01

int diferencia;
float te;
float ti;
float tmax=-20;
float tmin=60;

String dataT;
String dataH;
File filedata;
long millis_anteriors = 0;
long interval = 3600000;// Tiempo de muestreo del datalogger

#define ledv 36
#define ledr 37
#define leda 44



byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 164);
EthernetServer server(80);


RTC_DS1307 rtc;

void setup() {
   
Serial.begin(9600);
pinMode(ledv,OUTPUT);
pinMode(ledr,OUTPUT);
pinMode(leda,OUTPUT);
digitalWrite(ledr, LOW);
digitalWrite(leda, LOW);
digitalWrite(ledv, LOW);

sensors.begin();
pinMode(DHTPIN,OUTPUT);
digitalWrite(DHTPIN,HIGH);
rtc.begin();
       
       
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
}
    
Ethernet.begin(mac, ip);
server.begin();
Serial.print("Servidor en ");
Serial.println(Ethernet.localIP());
   
pinMode(SPI_SD, OUTPUT);
 
if (!SD.begin(SPI_SD)) {
Serial.println("Fallo de inicio o tarjeta no insertada:"); 
return;
}else {
Serial.println("Inicio completado."); 
}
}







void loop() {
DateTime now = rtc.now();
  
sensors.requestTemperatures();

ti = sensors.getTempC(S1); 
te = sensors.getTempC(S2); 
  
if(te>tmax) tmax=te;  
if(te<tmin) tmin=te;
   
ReadDHT();
hum=DHTDAT[0];

diferencia = ti - te;
     
     
     if (diferencia <= 7 ){
      digitalWrite(ledr, HIGH);
      digitalWrite(leda, LOW);
      digitalWrite(ledv, LOW);
      } 
      if (diferencia >= 7 && diferencia <= 8.5 ){  
      digitalWrite(ledr, LOW);
      digitalWrite(leda, HIGH);
      digitalWrite(ledv, LOW);
      }
         if (diferencia > 8.5)  {  
      digitalWrite(ledr, LOW);
      digitalWrite(leda, LOW);
      digitalWrite(ledv, HIGH);
      }
         
     
     
     
   
    EthernetClient client = server.available();
    if (client) { 
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) { 
              
        char c = client.read();
        Serial.write(c);
        
        if (c == '\n' && currentLineIsBlank) {
          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>");
 
          client.println("<head>");
          client.println("<link href=\'http://fonts.googleapis.com/css?family=Roboto+Condensed\' rel=\'stylesheet\' type=\'text/css\'>");
          client.println("<style type=\"text/css\">p {font-size:150px;margin:0px} body {font-size:60px;text-align:center; font-family: \'Roboto Condensed\', sans-serif;}</style>");
          client.println("<meta http-equiv=\"refresh\" content=\"15\" >"); // refresco de valores cada 15 segundos
          client.println("</head>");
          client.println("<hr>");
          
         
           client.print("Temperatura exterior   ");
           client.print(te); 
           client.println(" &ordm;C");
           client.println("
"); 
           client.println("
"); 
           client.print("Temperatura maxima  ");
           client.print(tmax); 
           client.println(" &ordm;C");
           client.println("
"); 
           client.print("Temperatura minima ");
           client.print(tmin); 
           client.println(" &ordm;C");
           client.println("
"); 
           client.println("
"); 
           client.print("Temperatura interior  ");
           client.print(ti); 
           client.println(" &ordm;C");
           client.println("
"); 
           client.println("
"); 
           client.print("Humitat    ");
           client.print(hum); 
           client.println(" %");
           client.println("
"); 
           client.println("
"); 
           client.println("
"); 
           client.println("
"); 
           client.println("<hr>"); 
           client.println("</html>");
          break;
        }
        
        
        if (c == '\n') currentLineIsBlank = true;
          else if (c != '\r')  currentLineIsBlank = false;
      }
        }
        delay(1);
        client.stop();
    }
    
    else{
      
      unsigned long millis_actuals = millis();
       
       if(millis_actuals - millis_anteriors > interval){
       
         millis_anteriors = millis_actuals; 
      
char tempe[6];
      
String dataT ="";
dtostrf(te,4,2,tempe);
dataT = String(tempe);
       
String dataH ="";
dataH += String(hum);
    
        
String dateString="";
dateString += String(now.day())+ String("/") + String(now.month()) + String("/") + String(now.year()) ;
   
String timeString="";
timeString += String(now.hour())+ String(":") + String(now.minute()) + String(":") + String(now.second());
    
filedata = SD.open("datalog.txt", FILE_WRITE);
      
if (filedata) {
                      
     filedata.print(timeString);
     filedata.print(" ,");
     filedata.print(dateString);
     filedata.print(" ,");
     filedata.print(dataT);
     filedata.print(" ,");
     filedata.println(dataH);
     filedata.close();
                     }
                }

    }
    
}



void ReadDHT(){
  bGlobalErr=0;
  byte dht_in;
  byte i;
  // Enviamos el comando "start read and report" al sensor
  // Primero: ponemos a "0" el pin durante 18ms
  digitalWrite(DHTPIN,LOW);
  delay(18);
  delay(5);//TKB, frm Quine at Arduino forum
  //Segundo: ponemos a "1" el pin durante 40us,enviamos el comando de "start read" al sensor
  digitalWrite(DHTPIN,HIGH);
  delayMicroseconds(40);
  //Tercero: Cambiamos el pin de Arduino a entrada de datos
  pinMode(DHTPIN,INPUT);
  delayMicroseconds(40); //Esperamos 40 us
  dht_in=digitalRead(DHTPIN);
  //si hay un 1 en la lectura del pin, indicamos que hay error de tipo 1
  if(dht_in)
  {
    bGlobalErr=1;
    return;
  }
  delayMicroseconds(80); //Esperamos 80us
  dht_in=digitalRead(DHTPIN); 
  //si no hay un 1 en la lectura del pin, indicamos que hay error de tipo 2
  if(!dht_in){
    bGlobalErr=2;
    return;
  }
  /*Despues de 40us a nivel bajo, el pin deberia de estar durante 80us a nivel alto.
  Despues de esto comienza el envio del primer bit hasta alcanzar los 40 bits enviados.
  The routine "read_dht_dat()" expects to be called with the system already into this low.*/
  delayMicroseconds(80); //Esperamos 80us
  //Ahora comienza la recepcion de datos, son 5 bytes de datos, es decir 40 bits, almacenamos en un array de 5 bytes
  for (i=0; i<5; i++)
    DHTDAT[i] = read_dht_dat();
  //Cuarto: Volvemos a configurar el pin del arduino como salida
  pinMode(DHTPIN,OUTPUT);
  //Quinto:Ponemos a "1" el pin de salida
  digitalWrite(DHTPIN,HIGH);
  //Comprobamos si los datos recibidos coinciden con el checksum recibido
  byte DHTCHECKSUM = DHTDAT[0]+DHTDAT[1]+DHTDAT[2]+DHTDAT[3];
  //Si no coincide el byte recibido de checksum con la suma de los 4 primeros bytes enviamos error tipo 3
  if(DHTDAT[4]!= DHTCHECKSUM)
    bGlobalErr=3;
  };
 
 
 
 
 
 
byte read_dht_dat()
{
  //Cogemos 8 de los bits recibidos y los devolvemos como un byte.
  //Si por ejemplo recibimos 00000100 , devolvemos en decimal 4
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    //Entramos mientras dura el primer bit de start (a nivel bajo durante 50us) del byte
    //Esperamos hasta que el pin se pone a nivel alto señalizando fin del la transmision del bit de start
    while(digitalRead(DHTPIN)==LOW);
    //La linea de datos debera estar ahora a nivel alto durante 27 o 70us, 
    //dependiendo si un "0" o un "1" esta siendo enviado respectivamente
    delayMicroseconds(30);  //Esperamos 30 us
    if (digitalRead(DHTPIN)==HIGH)
      result |=(1<<(7-i));  //Si despues de los 30us el pin permanece a "1" añadimos un 1 al byte, sino queda un "0" 
    //Esperamos hasta que el pin se vuelve a poner a nivel bajo,
    // el cual indica la señal de start del siguiente bit de la transmision
    while (digitalRead(DHTPIN)==HIGH);
  }
  return result; //devolvemos el resultado
}

Si cabe pero no en el post que esta limitado a 9000 caracteres sino abajo del editor donde dice Attachments. Ahi puedes subir directamente el código cuando es grande. De todos modos esta bien.

y tu problema es?

Gracias por el detalle, para la próxima lo tendré en cuenta.

No tengo ningún problema, simplemente quería mostrar el código por si a alguien le interesa, ¿lo debo de postear en otro apartado?

Nooo postealo acá, pero como dije si no entra en un post, usa el attachment Trata de explicar bien lo que has hecho como si fuera una guia para entender.

ok , cuando tenga mas tiempo haré un programa bien explicado!!