Hello everyone,
I am trying to read a bunch of DHT sensors, send the data to a web server, and back up the data to an SD card. I am using an Arduino MEGA Pro and a standard Ethernet shield. The Ethernet portion works just fine.
The problem I am having is I can open or create the data file, add the headers, and even enter the time stamp. When it comes to storing the actual data values, it only catches 1 out of maybe 200 attempts.
Here are my relevant code pieces, I think, if I missed something let me know:
#include <EEPROM.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <SD.h>
#include <MemoryFree.h>
#include <Adafruit_AM2315.h>
#include <DHT.h>
#include <RTClib.h>
const int chipSelect = 4;
File dataFile;
char filename[] = "D_Data.csv";
char transmission1[450];
void setup()
{
pinMode(SS, OUTPUT);
if (!SD.begin(chipSelect)) Serial.println("Card failed, or not present");
if (!SD.exists(filename)) {
// only open a new file if it doesn't exist
dataFile = SD.open(filename, FILE_WRITE);
delay(100);
dataFile.print(F("Date,Time,"));
dataFile.print(F("Temp1,Hum1,Temp2,Hum2,Temp3,Hum3,Temp4,Hum4,Temp5,Hum5,"));
dataFile.print(F("Temp6,Hum6,Temp7,Hum7,Temp8,Hum8,Temp9,Hum9,Temp10,Hum10,"));
dataFile.print(F("Temp11,Hum11,Temp12,Hum12,Temp13,Hum13,Temp14,Hum14,Temp15,Hum15,"));
dataFile.println(F("Temp16,Hum16,Temp17,Hum17,Temp18,Hum18,Temp19,Hum19,Temp20,Hum20,ExtTemp,ExtHum"));
dataFile.close();
}
if (currentTime.unixtime() - lastConnectionTime.unixtime() > updateEmoncmsInterval)
{
startEthernet();
for (int i = 0; i < NUM_DHTS; i++)
{
// Read value from DHT Sensor
float h = dhtList[i]->readHumidity();
float t = dhtList[i]->readTemperature();
if (isnan(t) || isnan(h))
{
memset(numhum[i], '\0', 6);
memset(numtemp[i], '\0', 6);
}
else
{
dtostrf(h, 6, 1, numhum[i]);
dtostrf(t, 6, 1, numtemp[i]);
trim(numhum[i]);
trim(numtemp[i]);
}
strcat(transmission1,numtemp[i]);
strcat(transmission1, ",");
strcat(transmission1, numhum[i]);
strcat(transmission1, ",");
Serial.print(i); Serial.print(" ");
Serial.print((char*)numhum[i]); Serial.print(" ");
Serial.println((char*)numtemp[i]);
memset(numhum[i], '\0', 6);
memset(numtemp[i], '\0', 6);
}
float eh = am2315.readHumidity();
float et = am2315.readTemperature();
if (isnan(et) || isnan(eh))
{
memset(exthum, '\0', 6);
memset(exttemp, '\0', 6);
}
else
{
dtostrf(et, 6, 1, exttemp);
dtostrf(eh, 6, 1, exthum);
trim(exthum);
trim(exttemp);
}
Serial.print("Ext Temp: ");
Serial.println(exttemp);
Serial.print("Ext Humidity: ");
Serial.print(exthum);
strcat(transmission1,exttemp);
strcat(transmission1,",");
strcat(transmission1,exthum);
Serial.print(F("At the end of DHT read freeRam ="));
Serial.println(freeRam());
// Update Emoncms
if(!client.connected())
{
Serial.println(transmission1);
updateEmoncms(transmission1, writeNode);
delay(100);
client.stop();
dataFile = SD.open(filename, FILE_WRITE);
saveSDtime();
dataFile.println(transmission1);
delay(100);
dataFile.close();
void saveSDtime()
{
dataFile.print(currentTime.year(), DEC);
dataFile.print(F("/"));
dataFile.print(currentTime.month(), DEC);
dataFile.print(F("/"));
dataFile.print(currentTime.day(), DEC);
dataFile.print(F(", "));
dataFile.print(currentTime.hour(), DEC);
dataFile.print(F(":"));
if (currentTime.minute() < 10) dataFile.print(F("0"));
dataFile.print(currentTime.minute(), DEC);
dataFile.print(F(":"));
if (currentTime.second() < 10) dataFile.print(F("0"));
dataFile.print(currentTime.second(), DEC);
dataFile.print(F(", "));
}
This is the original code. I am working also with another forum, but haven’t found a fix yet. I have also tried this code thinking maybe I needed to just print one value at a time:
float h = dhtList[i]->readHumidity();
float t = dhtList[i]->readTemperature();
if (isnan(t) || isnan(h))
{
//memset(numhum[i], '\0', 6);
//memset(numtemp[i], '\0', 6);
h=0.0;
t=0.0;
}
// else
// {
dtostrf(h, 6, 1, numhum[i]);
dtostrf(t, 6, 1, numtemp[i]);
trim(numhum[i]);
trim(numtemp[i]);
// }
strcat(transmission1,numtemp[i]);
strcat(transmission1, ",");
strcat(transmission1, numhum[i]);
strcat(transmission1, ",");
//skip to this part
saveSDtime();
char* sddata;
sddata = strtok(transmission1,",");
while (sddata != NULL)
{
dataFile.print(sddata);
dataFile.print(",");
sddata = strtok(NULL,",");
dataFile.flush();
delay(10);
}
dataFile.println();
delay(1000);
dataFile.close();
I have included a sample data file to show what exactly I am talking about.
My string that gets sent to both the HTML call and the SD card generally looks like this:
21.1,90.6,21.4,83.8,0.0,0.0,21.4,71.4,20.9,81.4,21.6,63.7,21.6,68.3,21.6,65.1,21.7,72.5,21.8,69.7,21.3,71.7,21.4,81.5,21.0,83.1,21.7,63.9,21.2,72.1,21.4,66.4,21.7,67.5,21.5,66.2,21.3,69.7,21.2,70.1,20.6,65.5
Let me know your thoughts. Thanks.
Tim
D_DATA.csv (79.6 KB)