¿Qué tal? Estoy intentando realizar un datalogger con un DHT11, un DS1307 y un módulo micro SD Catalex. He probado cada uno de ellos por separado y perfecto, DHT11 + DS1307 también funciona, DHT11 + SD perfecto; pero cuando intento juntar el DS1307 y la SD siempre me da error al intentar abrir el archivo. He buscado todo lo posible en el foro y otros sitios, pero no he encontrado solución al problema. Seguramente será una tontería, pero muchos ojos ven más que dos, así que os pido ayuda.
Os dejo las URL en las que más me he apoyado y el código del programa con los tres módulos juntos:
https://forum.arduino.cc/index.php?topic=443140.0
https://forum.arduino.cc/index.php?topic=357438.0
/*
* BUS SPI
* SCK-----> 13(UNO) 52(MEGA)
* MOSI----> 11(UNO) 51(MEGA)
* MISO----> 12(UNO) 50(MEGA)
* CS------> 8(UNO) 8(MEGA)
*
* BUS I2C
* SDA-----> A4(UNO) 20(MEGA)
* SCL-----> A5(UNO) 21(MEGA)
*/
// 1.- LIBRERIAS INCLUIDAS
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RTClib.h>
#include <DHT.h>
// 2.- CREACIÓN DE OBJETOS Y DEFINICIÓN DE PINES
RTC_DS1307 RTC;
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const int CS = 8; // Para este módulo.
// 3.- VARIABLES A CREAR
byte temperatura = 0; // Recoge los datos de temperatura cada minuto.
byte humedad = 0; // Recoge los datos de humedad cada minuto.
// 4.- SETUP
void setup()
{
// Inicialización de dispositivos
Serial.begin(9600);
dht.begin();
Wire.begin();
RTC.begin();
// Se establece fecha y hora sólo la primera vez, una vez hecho se comenta esta línea
RTC.adjust(DateTime(__DATE__,__TIME__));
if(!RTC.isrunning())
{
Serial.println("RTC no listo");
delay(3000);
}
pinMode(53, OUTPUT);
Serial.print("Inicializando SD...");
// Mira si la tarjeta está presente y puede ser inicializada
if (!SD.begin(CS))
{
Serial.println("Fallo o tarjeta no presente");
return;
}
Serial.println("Tarjeta SD OK");
delay(2000);
}
// 5.- LOOP
void loop()
{
DateTime now = RTC.now(); // Coge la fecha y la hora del reloj
Serial.print(now.day(),DEC);
Serial.print("/");
Serial.print(now.month(),DEC);
Serial.print("/");
Serial.print(now.year(),DEC);
Serial.print(" ");
Serial.print(now.hour(),DEC);
Serial.print(":");
Serial.println(now.minute(),DEC);
Serial.println("");
File archivo;
// Se guardan los datos cada 10 minutos en la SD y se imprime la fecha y la hora al principio de la lectura.
if(archivo) // Si el archivo existe...
{
if(now.minute() == 0 && now.second() == 0)
{
temperatura = leerTemp();
humedad = leerHum();
archivo = SD.open("datos.txt", FILE_WRITE);
archivo.print(now.day(),DEC);
archivo.print("/");
archivo.print(now.month(),DEC);
archivo.print("/");
archivo.print(now.year(),DEC);
archivo.print(" ");
archivo.print(now.hour(),DEC);
archivo.print(":");
archivo.println(now.minute(),DEC);
archivo.println("");
archivo.print("Temperatura: ");
archivo.print(temperatura);
archivo.println("ºC");
archivo.print("Humedad: ");
archivo.print(humedad);
archivo.println("%");
archivo.println("");
archivo.close();
}
if(now.minute() == 10 && now.second() == 0)
{
temperatura = leerTemp();
humedad = leerHum();
archivo = SD.open("datos.txt", FILE_WRITE);
archivo.print(now.hour(),DEC);
archivo.print(":");
archivo.println(now.minute(),DEC);
archivo.println("");
archivo.print("Temperatura: ");
archivo.print(temperatura);
archivo.println("ºC");
archivo.print("Humedad: ");
archivo.print(humedad);
archivo.println("%");
archivo.println("");
archivo.close();
}
else if(now.minute() == 20 && now.second() == 0)
{
temperatura = leerTemp();
humedad = leerHum();
archivo = SD.open("datos.txt", FILE_WRITE);
archivo.print(now.hour(),DEC);
archivo.print(":");
archivo.println(now.minute(),DEC);
archivo.println("");
archivo.print("Temperatura: ");
archivo.print(temperatura);
archivo.println("ºC");
archivo.print("Humedad: ");
archivo.print(humedad);
archivo.println("%");
archivo.println("");
archivo.close();
}
else if(now.minute() == 30 && now.second() == 0)
{
temperatura = leerTemp();
humedad = leerHum();
archivo = SD.open("datos.txt", FILE_WRITE);
archivo.print(now.hour(),DEC);
archivo.print(":");
archivo.println(now.minute(),DEC);
archivo.println("");
archivo.print("Temperatura: ");
archivo.print(temperatura);
archivo.println("ºC");
archivo.print("Humedad: ");
archivo.print(humedad);
archivo.println("%");
archivo.println("");
archivo.close();
}
else if(now.minute() == 40 && now.second() == 0)
{
temperatura = leerTemp();
humedad = leerHum();
archivo = SD.open("datos.txt", FILE_WRITE);
archivo.print(now.hour(),DEC);
archivo.print(":");
archivo.println(now.minute(),DEC);
archivo.println("");
archivo.print("Temperatura: ");
archivo.print(temperatura);
archivo.println("ºC");
archivo.print("Humedad: ");
archivo.print(humedad);
archivo.println("%");
archivo.println("");
archivo.close();
}
else if(now.minute() == 50 && now.second() == 0)
{
temperatura = leerTemp();
humedad = leerHum();
archivo = SD.open("datos.txt", FILE_WRITE);
archivo.print(now.hour(),DEC);
archivo.print(":");
archivo.println(now.minute(),DEC);
archivo.println("");
archivo.print("Temperatura: ");
archivo.print(temperatura);
archivo.println("ºC");
archivo.print("Humedad: ");
archivo.print(humedad);
archivo.println("%");
archivo.println("");
archivo.close();
}
}
else
{
Serial.println("Error abriendo datos.txt");
}
delay(1000);
}
// 6.- FUNCIONES EXTERNAS
byte leerTemp()
{
byte temp;
temp = dht.readTemperature();
return temp;
}
byte leerHum()
{
byte hum;
hum = dht.readHumidity();
return hum;
}
Espero que podáis ver algo que a mi se me escapa. Gracias por anticipado y perdón por el tocho.