No puede ser más sencillo añadir la posibilidad de que los datos se guarden en la tarjeta sd (ciertamente es sencillo porque esta placa arduino lo facilita todo. Al final de la serie veremos qué hay que modificar para usar otra placa arduino).

La idea es usar los datos en tiempo real para mostrarlos a quien los solicite por internet y de paso guardar cada cierto tiempo los datos para que con posterioridad pudiéramos realizar estudios históricos con esos datos, eso sí, desde un PC que leyera los datos de la tarjeta directamente.

Basta con seguir el ejemplo de Tom Igoe de como hacer un datalogger con arduino ethernet: incluímos la libreria SD, abrirmos el fichero y escribimos en él:

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

dht11 DHT11;

#define nSensores 3
int puertos[nSensores];
float fHumedades[nSensores];
float fTemperaturas[nSensores];

int nFilas=0;
int nFiles=0;

File file;

int iNVisitas=0; //guardaremos el número de visitas a modo de contador

// Ponemos la direccion MAC y la direccion IP que asignaremos a nuestra placa
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xEE, 0xEE };
byte ip[] = { 192,168,1, 177 };

// Initializamos la librería Ethernet
// con la ip y el puerto elegido 666
// (puerto 80 por defecto para HTTP):
EthernetServer server(666); // En arduino 1.0 es  EthernetServer, en las versiones anteriores sólo Server
void setup()
{
 
  Ethernet.begin(mac, ip); // Arrancamos el ethernet
  server.begin(); //Arrancamos el servidor

  Serial.begin(115200); //Arrancamos el serial para depuracion
  puertos={2,3,4}; // Puertos en los que están conectados los sensores

   pinMode(10, OUTPUT);
  if (!SD.begin(4))
  {
    Serial.println("Error inicializando SD");
    nFiles=-1;
  }
  else
  {
    nFiles=0;
    Serial.println("SD initializada.");
  }

}

void getdata(int iIndice)
{
  int chk = DHT11.read(puertos[iIndice]);
  fHumedades[iIndice]=-1;
  fTemperaturas[iIndice]=-1;

  Serial.print("Sensor ");
  Serial.print(iIndice);
  Serial.print(" ");
  switch (chk)
  {
    case 0:
      fHumedades[iIndice]=(float)DHT11.humidity;
      Serial.print(fHumedades[iIndice], 2);
      Serial.print(" % ");
      fTemperaturas[iIndice]=(float)DHT11.temperature;
      Serial.print(fTemperaturas[iIndice], 2);
      Serial.println(" o C");
        break;
    case -1: Serial.println(" Error en el chequeo"); break;
    case -2: Serial.println(" Error de espera"); break;
    default: Serial.println(" Error desconocido"); break;
  }

}

void loop()
{
  // escuchamos a clientes
  EthernetClient client = server.available(); // Antes de arduino 1.0 era Client
  if (client) {
    // las peticiones terminan con la una línea en blanco
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {

        char c = client.read();
        // Un fin de linea y una linea en blanco indica que la peticion ha terminado
        if (c == '\n' && currentLineIsBlank) {
          // enviamos la cabecera HTTP estandar
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
           // mostramos los valores de los sensores
          for(int i=0;i<nSensores;i++){
            client.print("sensor ");
            client.print(i);
            client.print(": ");
            if(fHumedades==-1)
              client.print(" error leyendo el sensor");
            else
            {
              client.print(fHumedades, 2);
              client.print(" % ");
              client.print(fTemperaturas, 2);
              client.println(" o C");
            }
            client.println("<br />");
          }
          client.print((iNVisitas++)/2);
          client.println(" visitas <br />");

          break;
        }
        if (c == '\n') {
          // empezamos una nueva linea
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // hemos recibido un caracter de la nueva linea
          currentLineIsBlank = false;
        }
      }
    }
     // damos tiempo al navegador tiempo para recibir los datos
    delay(1);
     // cerramos la conexion:
    client.stop();
  }
  else
  {
    //if(nFiles>=0 && file)
    {
       file= SD.open("datalog.txt", FILE_WRITE);
    }
    String data="";
    for(int i=0;i<nSensores;i++)
    {
      getdata(i);

      data+=String(nFilas)+";"+String(i)+";"+String((int)fHumedades)+";"+String((int)fTemperaturas)+"\n";
    }
    if(file)
    {
      file.print(data);
      Serial.print(data);
      file.close();
      nFilas++;
    }
    delay(200);
  }
}
DHT11 en arduino ethernet 5: guardando datos en SD
Etiquetado en:            

12 thoughts on “DHT11 en arduino ethernet 5: guardando datos en SD

  • 1 agosto, 2012 a las 21:07
    Enlace permanente

    Una pregunta, este archivo monitorea temperatura y humedad y veo que lo guardas todo en un archivo de texto, lo que no entiendo bien es la parte central, estas monitoreando estos datos via internet leyendo el archivo de texto o como le haces

    Responder
    • 1 agosto, 2012 a las 21:31
      Enlace permanente

      Los datos se leen y en tiempo real se muestran por internet a quien los solicite. Por otro lado cada cierto tiempo se guardan en un fichero para con posterioridad poder procesar los datos históricos, pero ya en un pc. Creo que hay que revisar la explicación global del proyecto para clarificar este punto.

      Gracias por la pregunta

      Responder
  • 6 septiembre, 2012 a las 0:08
    Enlace permanente

    Hola, ¿se puede definir una puerta de enlace determinada y como se hace?.
    Lo que sucede que mi red la hice con los aparatos que tenia a mano y de un moden (ip: 10.0.0.2) se conecta mi vecino quien paga internet por usb y me tira un cable a mi, de ahí lo conecto a otro moden (si moden no switch, cuya ip es 10.0.0.3) yo para conectarme a internet me conecto a mi moden por cable red o wifi pero configurando siempre que la puerta de enlace es 10.0.0.2 no la 10.0.0.3 que la que me da si pongo ip automatica.
    Por ende lo que haga con andruino en este tipo escenario debo decirle que la puerta de enlace predeterminada es 10.0.0.2 se puede hacer eso, con que instrucción.
    Desde ya muchas gracias.

    Responder
    • 8 septiembre, 2012 a las 9:43
      Enlace permanente

      Hasta donde yo sé, puedes configurar sin problema la puerta de enlace de tu red normalmente, como harías en un pc. La parte dificil de tu montaje la hace el modem que une tus dos redes.
      Lo que no tengo claro es si no sería mejor que usares redes distintas (es decir 10.0.0.x y 10.0.1.x) para simplificar un poco más el montaje.
      Saludos y cuentanos como termina todo.

      Responder
  • 8 septiembre, 2012 a las 23:51
    Enlace permanente

    ¿Qué modificaciones tendría que hacerle al código si lo que busco es que el arduino lea la temperatura y la guarde en la SD. Sin Ethernet.

    Gracias de antemano.

    Responder
  • 4 octubre, 2012 a las 0:13
    Enlace permanente

    hola, tengo una duda con el codigo. es necesario tener conectado la tarjeta al puerto usb en la PC, es decir que si es posible que trabaje solo con la entrada de voltaje.

    Responder
    • 4 octubre, 2012 a las 20:18
      Enlace permanente

      Para nada es necesario tener conexión con el USB. Solo hace falta alimentación

      Responder
  • 25 enero, 2014 a las 14:26
    Enlace permanente

    Haciendo un par de modificaciones he logrado que funcione con Arduino 1.05. Inicialmente me daba un problema con la asignación de puertos. En parte sintaxis, en parte definición de los puertos.
    Resulta conveniente omitir el puerto 4 para un sensor DHT11, ya que algunas tarjetas con SD utilizan este puerto como selector de la tarjeta SD. Al menos por lo que he visto en varios modelos y ejemplos.

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *