They won't let me post all my code (9500 character limit). I will post as much as I can with as little editing as possible.
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <SD.h>
#include <Adafruit_AM2315.h>
#include <DHT.h>
#include <RTClib.h>
RTC_DS1307 rtc;
const int chipSelect = 4;
File dataFile;
// Box D Settings
byte mac[] = {0xZZ, 0xAA, 0xDD, 0xFF, 0xD7, 0xWB};
char writeNode[] = "node=3&csv=";
char filename[] = "D_Data.csv";
char transmission1[450];
const long updateEmoncmsInterval = 90; // Time interval in seconds to update Emoncms
DateTime lastConnectionTime = 0;
DateTime currentTime;
boolean lastConnected = false;
int failedCounter = 0;
EthernetClient client;
//DHT Settings
#define DHTTYPE DHT21
DHT dht01(23, DHTTYPE);DHT dht02(22, DHTTYPE);DHT dht03(31, DHTTYPE);DHT dht04(30, DHTTYPE);
DHT dht05(25, DHTTYPE);DHT dht06(24, DHTTYPE);DHT dht07(29, DHTTYPE);DHT dht08(28, DHTTYPE);
DHT dht09(27, DHTTYPE);DHT dht10(26, DHTTYPE);DHT dht11(36, DHTTYPE);DHT dht12(37, DHTTYPE);
DHT dht13(34, DHTTYPE);DHT dht14(35, DHTTYPE);DHT dht15(38, DHTTYPE);DHT dht16(39, DHTTYPE);
DHT dht17(32, DHTTYPE);DHT dht18(33, DHTTYPE);DHT dht19(40, DHTTYPE);DHT dht20(41, DHTTYPE);
DHT* dhtList[] = {&dht01, &dht02, &dht03, &dht04, &dht05, &dht06, &dht07, &dht08,
&dht09, &dht10, &dht11, &dht12, &dht13, &dht14, &dht15, &dht16, &dht17, &dht18, &dht19, &dht20};
#define NUM_DHTS (sizeof(dhtList)/sizeof(DHT*))
typedef char humStr[7]; //4 digits + decimal point + 1 decimal + null terminator
typedef char tempStr[7]; //4 digits + decimal point + 1 decimal + null terminator
Adafruit_AM2315 am2315;
humStr numhum[NUM_DHTS];
tempStr numtemp[NUM_DHTS];
char exttemp[7];
char exthum[7];
void setup()
{
Serial.begin(9600);
pinMode(SS, OUTPUT);
Wire.begin();
rtc.begin();
am2315.begin();
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();
}
Serial.println(F("SD card initialized."));
for (int i=0; i < NUM_DHTS; i ++)
{
dhtList[i]->begin();
}
Serial.print(F("After Setup freeRam ="));
Serial.println(freeRam());
}
void loop()
{
currentTime = rtc.now();
Serial.print(F("freeRam ="));
Serial.println(freeRam());
Serial.print(F("lastupdate:"));
Serial.println(currentTime.unixtime() - lastConnectionTime.unixtime());
serialprinttime();
if (currentTime.unixtime() - lastConnectionTime.unixtime() > updateEmoncmsInterval)
{
startEthernet();
for (int i = 0; i < NUM_DHTS; i++)
{
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, ",");
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.println(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(1000);
client.stop();
dataFile = SD.open(filename, FILE_WRITE);
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();
Serial.println(F("Sent Transmission"));
}
memset(transmission1, '\0', 300);
}
if (!client.connected() && lastConnected)
{
Serial.println(F("...disconnected"));
Serial.println();
client.stop();
}
if (failedCounter > 3 )
{
Serial.println(F("Checking failed counter"));
startEthernet();
}
lastConnected = client.connected();
delay(1000);
}
void updateEmoncms(char emData[450] , char writeNode[12])
{
if (client.connect("mywebsite.com", 80))
{
client.print(F("GET "));
client.print(F("/emoncms/input/post.json?"));
client.print(writeNode);
client.print(emData);
client.print(F("&apikey=dfXCXCXCXCXCXCXCXCXCXCXC2f29"));
client.println(F(" HTTP/1.1"));
client.println(F("Host: mywebsite.com"));
client.print(F("User-Agent: Arduino-ethernet"));
client.println(F("Connection: close"));
client.println();
lastConnectionTime = rtc.now();
Serial.print(F("After Emoncms transmission freeRam ="));
Serial.println(freeRam());
memset(emData, '\0', 325);
if (client.connected())
{
Serial.println(F("Connecting to Emoncms..."));
Serial.println();
failedCounter = 0;
}
else
{
failedCounter++;
Serial.println("Connection to Emoncms failed ("+String(failedCounter, DEC)+")");
Serial.println();
}
}
else
{
failedCounter++;
Serial.println("Connection to Emoncms Failed ("+String(failedCounter, DEC)+")");
Serial.println();
}
}
void startEthernet()
{
client.stop();
Serial.println(F("Connecting Arduino to network..."));
Serial.println();
delay(1000);
// Connect to network amd obtain an IP address using DHCP
if (Ethernet.begin(mac) == 0)
{
Serial.println(F("DHCP Failed, reset Arduino to try again"));
Serial.println();
}
else
{
Serial.println(F("Arduino connected to network using DHCP"));
Serial.println();
}
delay(1000);
}
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void serialprinttime()
{
Serial.print(currentTime.year(), DEC);
Serial.print('/');
Serial.print(currentTime.month(), DEC);
Serial.print('/');
Serial.print(currentTime.day(), DEC);
Serial.print(' ');
Serial.print(currentTime.hour(), DEC);
Serial.print(':');
if (currentTime.minute() < 10) Serial.print(F("0"));
Serial.print(currentTime.minute(), DEC);
Serial.print(':');
if (currentTime.second() < 10) Serial.print(F("0"));
Serial.print(currentTime.second(), DEC);
Serial.println();
}
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(", "));
}
void trim(char* _str)
{
while( (strlen(_str) > 0) && (_str[0] == 32) )
{
strcpy(_str,&_str[1]);
}
while( (strlen(_str) > 0) && (_str[strlen(_str) - 1] == 32) )
{
_str[strlen(_str) - 1] = 0;
}
}
numhum and numtemp are typedef char. It wouldn't serial.print until I cast them as char*.
I'm using both the W5100 and the SD card SPI, do I need to explicitly activate/deactivate each system before and after using it?
T