During the last two months I have been working on a project that consists of using a Seeeduino Stalker V2.3, two AM2305 sensors, a TSL2561 sensor, an HC-05 XBee module, a 1,800 mAh 3.7V LiPo, a 7 cm x 7 cm 5V solar cell, and a waterproof suction box, to assemble a portable and waterproof environmental data logger that can be used to take samples on a continuous basis (1 sample every 30 minutes, 48 samples per day).
After struggling to make my logger work, I finally did it last week. It all runs fine, except that the intervals between readings are incorrect. When I program my board to store samples every 30 minutes (1,800,000), it takes them every 30 minutes and some extra seconds. When I try the same but with a rate of 1 sample every 10 seconds, my device logs data every 13 seconds more or less...
Here is the code I have been using:
#include "SPI.h"
#include "Wire.h"
#include "SD.h"
#include "DS3231.h"**
DS3231 clock;
RTCDateTime dt;
#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT21
DHT dht1(DHTPIN, DHTTYPE);
#define DHTPIN2 7
DHT dht2(DHTPIN2, DHTTYPE);
#include "TSL2561.h"
TSL2561 tsl(TSL2561_ADDR_FLOAT);
const int chipSelect = 10;
int XBEE = 5;
int FLASH = 4;
void setup() {
pinMode(5, OUTPUT);
digitalWrite(XBEE, HIGH);
Serial.begin(9600);
Wire.begin();
clock.begin();
analogReference(INTERNAL);
pinMode(10, OUTPUT);
pinMode(4, INPUT);
SD.begin(10);
dht1.begin();
dht2.begin();
Serial.println("EcoLOGGER DE PRUEBA PARA GENERACION DE DATOS ...");
Serial.println(" ");
delay(3000);
Serial.println("RECUERDA QUE ESTE PROYECTO NO HUBIERA SIDO POSIBLE SIN LA AYUDA DE LA COMUNIDAD ARDUINO...");
Serial.println(" ");
delay(3000);
}
int counter = 0;
void loop() {
float h = dht1.readHumidity();
float t = dht1.readTemperature();
float f = dht1.readTemperature(true);
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
float f2 = dht2.readTemperature(true);
dt = clock.getDateTime();
if (tsl.begin()) {
} else {
while (1);
}
tsl.setGain(TSL2561_GAIN_0X);
tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS);
uint16_t x = tsl.getLuminosity(TSL2561_FULLSPECTRUM);
uint32_t lum = tsl.getFullLuminosity();
uint16_t ir, full;
ir = lum >> 16;
full = lum & 0xFFFF;
float vis = full-ir;
Serial.print("Muestreo: ");
Serial.println(counter);
Serial.print("Fecha: ");
Serial.print(dt.day);
Serial.print('/');
Serial.print(dt.month);
Serial.print('/');
Serial.println(dt.year);
Serial.print("Hora: ");
Serial.print(dt.hour);
Serial.print(':');
Serial.print(dt.minute);
Serial.print(':');
Serial.println(dt.second);
Serial.print("Temperatura sistema: ");
Serial.print(clock.readTemperature());
Serial.println("*C ");
Serial.print("Voltaje bateria: ");
Serial.print(analogRead(A7) * (1.1 / 1024)* (10+2)/2);
Serial.println(" V ");
Serial.print("Carga bateria: ");
Serial.print(-149.4 + 59.52 * (analogRead(A7) * (1.1 / 1024)* (10+2)/2));
Serial.println("% ");
Serial.print("Luz FULL: ");
Serial.println(full);
Serial.print("Temperatura ambiente: ");
Serial.print(t);
Serial.println(" *C ");
Serial.print("Humedad relativa: ");
Serial.print(h);
Serial.println("%");
Serial.print("Temperatura suelo: ");
Serial.print(t2);
Serial.println(" *C ");
Serial.print("Humedad suelo: ");
Serial.print(h2);
Serial.println("%");
Serial.println(" ");
digitalWrite (FLASH, HIGH);
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(" Muestreo: ");
dataFile.print(counter);
dataFile.print(",");
dataFile.print(" Fecha: ");
dataFile.print(dt.day);
dataFile.print('/');
dataFile.print(dt.month);
dataFile.print('/');
dataFile.print(dt.year);
dataFile.print(",");
dataFile.print(" Hora: ");
dataFile.print(dt.hour);
dataFile.print(':');
dataFile.print(dt.minute);
dataFile.print(':');
dataFile.print(dt.second);
dataFile.print(",");
dataFile.print(" Temperatura sistema: ");
dataFile.print(clock.readTemperature());
dataFile.print("*C ");
dataFile.print(",");
dataFile.print(" Voltaje bateria: ");
dataFile.print(analogRead(A7) * (1.1 / 1024)* (10+2)/2);
dataFile.print(" V ");
dataFile.print(",");
dataFile.print(" Porcentaje carga: ");
dataFile.print(-149.4 + 59.52 * (analogRead(A7) * (1.1 / 1024)* (10+2)/2));
dataFile.print("% ");
dataFile.print(",");
dataFile.print(" Luz FULL: ");
dataFile.print(full);
dataFile.print(",");
dataFile.print(" Temperatura ambiente: ");
dataFile.print(t);
dataFile.print(" *C ");
dataFile.print(",");
dataFile.print(" Humedad relativa: ");
dataFile.print(h);
dataFile.print("%");
dataFile.print(",");
dataFile.print(" Temperatura suelo: ");
dataFile.print(t2);
dataFile.print(" *C ");
dataFile.print(",");
dataFile.print(" Humedad suelo: ");
dataFile.print(h2);
dataFile.print("%");
dataFile.println("");
dataFile.close();
digitalWrite (FLASH, LOW);
} else {
Serial.println("");
Serial.println("IMPOSIBLE GUARDAR DATOS");
Serial.println("");
}
counter++;
if (counter > 5) {
delay (1000);
digitalWrite (XBEE, LOW);
delay (1799000);
} else
digitalWrite (XBEE, HIGH);
delay (10000);
}
I have been trying to find possible solutions, but I am just lost. Do any of you have an idea of what could be going on?
Thank you in advance :)