/* This Arduino sketch reads DS18B20 "1-Wire" digital temperature sensors. Copyright (c) 2010 Mark McComb, hacktronics LLC License: http://www.opensource.org/licenses/mit-license.php (Go crazy) Tutorial: http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html modernised, compacted, and metricated by Nick Pyner code uses Arduino LCD stuff, for shield on Freetronics EtherTen. Serial print commands are for PLX-DAQ From cosm library example and lifts from a lot of others particularly from Stanley in Kuala Lumpur. Use your own DS18B20 addresses, keys etc. Note that the feed id is in line 42, or somewhere nearby... */ #include #include #include #include // Ethernet #include // Cosm lib #include // Cosm lib #include // Nokia 5110 #include // SD card #include // from Date As Filename #include "RTClib.h" // from Date As Filename #include "Wire.h" // Original RTC lib for LCD disp, SD card, and serial #define DS1307_ADDRESS 0x68 RTC_DS1307 RTC; static PCD8544 lcd; File myFile; char filename[] = "00000000.CSV"; // Custom symbols static const byte DEGREES_CHAR = 1; static const byte degrees_glyph[] = { 0x00, 0x07, 0x05, 0x07, 0x00 }; static const byte SLASH_CHAR = 2; static const byte slash_glyph[] = {0x00,0x20,0x10,0x08}; byte InThermo[8] = { 0x28, 0x69, 0xC2, 0xB0, 0x03, 0x00, 0x00, 0X9F}; byte OutThermo[8] = { 0x28, 0x7A, 0x8B, 0xC0, 0x03, 0x00, 0x00, 0x2F}; byte DrainThermo[8] = { 0x28, 0x09, 0xA9, 0xC0, 0x03, 0x00, 0x00, 0x95}; #define ONE_WIRE_BUS 3 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; char cosmKey[] = "l6absmJtblah blah blah 0Zz0g"; int second, minute, hour, weekDay, monthDay, month, year; int k=0; float InTemp, OutTemp, DrainTemp; // used for SD write only // Define the strings for our datastream IDs char sensorId0[] = "InThermo"; char sensorId1[] = "OutThermo"; char sensorId2[] = "DrainThermo"; char calcId1[] = "diff"; const int bufferSize = 140; char bufferValue[bufferSize]; // enough space to store the string we're going to send CosmDatastream datastreams[] = { CosmDatastream(sensorId0, strlen(sensorId0), DATASTREAM_FLOAT), CosmDatastream(sensorId1, strlen(sensorId1), DATASTREAM_FLOAT), CosmDatastream(sensorId2, strlen(sensorId2), DATASTREAM_FLOAT), CosmDatastream(calcId1, strlen(calcId1), DATASTREAM_FLOAT), }; // Finally, wrap the datastreams into a feed CosmFeed feed(83153, datastreams, 4 /*put your number here */); EthernetClient client; CosmClient cosmclient(client); void setup() { lcd.begin(84, 48); // Register the custom symbols... lcd.createChar(DEGREES_CHAR, degrees_glyph); lcd.createChar(SLASH_CHAR, slash_glyph); Wire.begin(); Serial.begin(9600); Serial.print(" filename "); delay(300);//Wait for newly restarted system to stabilize lcd.setCursor (0,0); lcd.print("Initializing"); delay(2000); lcd.setCursor (0,1); pinMode(10, OUTPUT); if (!SD.begin(4)) { Serial.println("failed!"); return; } lcd.print("init. OK!"); delay(2000); getFileName(); Serial.println(filename); lcd.clear(); Serial.println("LABEL,Time,InTemp,OutTemp,diff,DrainTemp"); sensors.setResolution(InThermo, 12); sensors.setResolution(OutThermo, 12); sensors.setResolution(DrainThermo, 12); Serial.println("Starting multiple datastream upload to Cosm..."); Serial.println(); while (Ethernet.begin(mac) != 1) { Serial.println("Error getting IP address via DHCP, trying again..."); delay(10000); } } void loop() { running(); GetClock(); myFile = SD.open(filename, FILE_WRITE);//<<<<<<<<<<<<< OPEN if (hour == 0 && minute == 0 && second <2) { getFileName(); } Serial.print("DATA,TIME, "); Serial.print(monthDay); Serial.print("/"); Serial.print(month); Serial.print("/"); Serial.print(year); Serial.print(" "); Serial.print(hour); Serial.print(":"); Serial.print(minute); Serial.print(":"); if ((second) < 10) { Serial.print("0"); }; Serial.print(second); Serial.print(" "); int ret=0; //get the values from the DS8B20's sensors.requestTemperatures(); float InTemp = (sensorValue(InThermo)); float OutTemp = (sensorValue(OutThermo)); float DrainTemp = (sensorValue(DrainThermo)); float diff = OutTemp - InTemp; datastreams[0].setFloat(InTemp); datastreams[1].setFloat(OutTemp); datastreams[2].setFloat(DrainTemp); datastreams[3].setFloat(diff); Serial.print(InTemp); Serial.print(" , "); Serial.print(OutTemp); Serial.print(" , "); Serial.print(DrainTemp); Serial.println(" , "); lcd.setCursor(49,0); lcd.print(InTemp); lcd.setCursor(49,1); lcd.print (OutTemp); lcd.setCursor(49,2); lcd.print(DrainTemp); k=k+1; if (k>9 ) { myFile.print(monthDay); myFile.print("/"); myFile.print(month); myFile.print("/"); myFile.print(year); myFile.print(", "); myFile.print(hour); myFile.print(":"); myFile.print(minute); myFile.print(":"); myFile.print(second); myFile.print(", "); myFile.print(InTemp); myFile.print(", "); myFile.print(OutTemp); myFile.print(", "); myFile.print(DrainTemp); myFile.print(", "); // ++++++++++++++++++++++++++++++++ feed section ret = cosmclient.put(feed, cosmKey); // SEND FEED TO COSM //lcd.setCursor(6,1); // lcd.print(ret); // Serial.print(" cosmclient replies .put returned (see 200?) "); // Serial.println(ret); // Serial.println(" "); //+++++++++++++++++++++++++++++++++ end feed section myFile.println(); k=0; } myFile.close();//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>CLOSE delay(850); } // loop ends here //sensorValue function float sensorValue (byte deviceAddress[]) { float tempC = sensors.getTempC (deviceAddress); return tempC; } byte bcdToDec(byte val) { // Convert binary coded decimal to normal decimal numbers return ( (val/16*10) + (val%16) ); } void GetClock(){ // Reset the register pointer Wire.beginTransmission(DS1307_ADDRESS); byte zero = 0x00; Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); second = bcdToDec(Wire.read()); minute = bcdToDec(Wire.read()); hour = bcdToDec(Wire.read() & 0b111111); //24 hour time weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday monthDay = bcdToDec(Wire.read()); month = bcdToDec(Wire.read()); year = bcdToDec(Wire.read()); } void getFileName(){ DateTime now = RTC.now(); filename[0] = (now.year()/1000)%10 + '0'; //To get 1st digit from year() filename[1] = (now.year()/100)%10 + '0'; //To get 2nd digit from year() filename[2] = (now.year()/10)%10 + '0'; //To get 3rd digit from year() filename[3] = now.year()%10 + '0'; //To get 4th digit from year() filename[4] = now.month()/10 + '0'; //To get 1st digit from month() filename[5] = now.month()%10 + '0'; //To get 2nd digit from month() filename[6] = now.day()/10 + '0'; //To get 1st digit from day() filename[7] = now.day()%10 + '0'; //To get 2nd digit from day() myFile = SD.open(filename, FILE_WRITE); myFile.close(); } void running(){ lcd.setCursor(0,0); lcd.print("In"); lcd.setCursor(31,0); lcd.print("\001C "); lcd.setCursor(0,1); lcd.print("Out"); lcd.setCursor(31,1); lcd.print("\001C "); lcd.setCursor(0,2); lcd.print("Drain"); lcd.setCursor(31,2); lcd.print("\001C "); lcd.setCursor(0,3); lcd.print("F"); lcd.setCursor(5,3); lcd.print("l"); lcd.setCursor(10,3); lcd.print("ow"); lcd.setCursor(24,3); lcd.print("l"); lcd.setCursor(28,3); lcd.print("\002"); lcd.print("m"); lcd.setCursor(39,3); lcd.print("i"); lcd.setCursor(44,3); lcd.print("n"); lcd.setCursor(14,4); lcd.print("Conv %"); lcd.setCursor(21,5); lcd.print("kW"); } void standing(){ lcd.setCursor(10, 0); lcd.print("kWh"); lcd.setCursor(6,1); lcd.print("PREVIOUS DAY"); lcd.setCursor(0,2); lcd.print("kWh"); lcd.setCursor(0,3); lcd.print("kW max"); lcd.setCursor(0,4); lcd.print("max flow"); lcd.setCursor(0,5); lcd.print("max rise"); lcd.setCursor(66,5); lcd.print("54"); lcd.setCursor(77,5); lcd.print("."); lcd.setCursor(79,5); lcd.print("9"); }