Having a little issue with SD and OneWire. I have started over about 3 times and every approach fails.
Hardware is working. I have verified this with individual sketches only dealing with either SD or Temp Sensors. The connections should be obious via my code.
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <SD.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 10
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
//SD Card
// ** MOSI - pin 11
// ** MISO - pin 12
// ** CLK - pin 13
// ** CS - pin 4
const int chipSelect = 4;
void setup(void)
{
Serial.println(freeRam());
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
Serial.println(freeRam());
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
Serial.println(freeRam());
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
Serial.println(freeRam());
}
void loop(void)
{
Serial.println(freeRam());
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.println(freeRam());
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("data.csv", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.print(sensors.getTempFByIndex(0));
dataFile.print(",");
dataFile.print(sensors.getTempFByIndex(1));
dataFile.print(",");
dataFile.println(sensors.getTempFByIndex(2));
dataFile.close();
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening file");
}
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempFByIndex(0));
Serial.print("Temperature for the device 2 (index 1) is: ");
Serial.println(sensors.getTempFByIndex(1));
Serial.print("Temperature for the device 3 (index 2) is: ");
Serial.println(sensors.getTempFByIndex(2));
delay(1000);
}
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
I was originally thinking i was running out of ram but it doesn't look to be the case.
This is my serial output when i run the above code.
Dallas Temperature IC Control Library Demo
822
Locating devices...Found 3 devices.
822
Initializing SD card...card initialized.
822
793
Requesting temperatures...DONE
793
error opening file
Temperature for the device 1 (index 0) is: -196.60
Temperature for the device 2 (index 1) is: -196.60
Temperature for the device 3 (index 2) is: -196.60
793
Requesting temperatures...DONE
793
error opening file
Temperature for the device 1 (index 0) is: -196.60
Temperature for the device 2 (index 1) is: -196.60
Temperature for the device 3 (index 2) is: -196.60
793
Requesting temperatures...DONE
If I comment out the SD portion, this is my output.
// // see if the card is present and can be initialized:
// if (!SD.begin(chipSelect)) {
// Serial.println("Card failed, or not present");
// // don't do anything more:
// return;
// }
// Serial.println("card initialized.");
Output
Dallas Temperature IC Control Library Demo
869
Locating devices...Found 3 devices.
869
Initializing SD card...869
840
Requesting temperatures...DONE
840
error opening file
Temperature for the device 1 (index 0) is: 76.10
Temperature for the device 2 (index 1) is: 99.84
Temperature for the device 3 (index 2) is: 56.41
840
Requesting temperatures...DONE
840
error opening file
Temperature for the device 1 (index 0) is: 76.10
Temperature for the device 2 (index 1) is: 99.61
Temperature for the device 3 (index 2) is: 56.41
840
Requesting temperatures...DONE
Temp Values are correct. Ambient, Near Candle, Was ice water.
Did i miss something about using OneWire and SD not getting along?