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[i]==-1) client.print(" error leyendo el sensor"); else { client.print(fHumedades[i], 2); client.print(" % "); client.print(fTemperaturas[i], 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[i])+";"+String((int)fTemperaturas[i])+"\n"; } if(file) { file.print(data); Serial.print(data); file.close(); nFilas++; } delay(200); } }
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
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
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.
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.
¿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.
Sólo tienes que omitir lo que se comentó en el anterior post sobre el tema http://blog.elcacharreo.com/2011/10/30/dht11-en-arduino-ethernet-4-por-fin-internet-http/
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.
Para nada es necesario tener conexión con el USB. Solo hace falta alimentación
Podrias comentar el programa en españoL?
Hecho David, espero que te sea útil.
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.
Gracias Javier, intentaré revisarlo