I am having trouble making a pressure sensor work.
It's this guy;
I can't seem to make it work with the Wi-Fi shields micro SD logger. I don't know much about SPI and I am pretty certain that is my problem. Basically I can log from just about any sensor besides ones that are SPI and I would really like to make the SPI work.
Here is my code for the pressure sensor. Let me know. I am pretty sure that it's pretty easy. I know that I have to send the SS for the SD card low and the SS for the pressure sensor high and then pull the data off the pressure sensor and then set the SS for the pressure sensor low and the SS for the SD card high and then write to the SD card. But it's not as easy as
SPI.end(SSpin) or as easy as analogWrite(SSPin, LOW)
Here is the code that I am working on for just the pressure sensor.
include <SPI.h>
//for the SD logger//
#include <SD.h>
// generate a MCKL signal pin
const int PRCS = 9; //was called clock in a previous version
// for the chipselect on the SD card//
const int SDCS = 4; //This was ChipSelect in a previous version
void resetsensor() //this function keeps the sketch a little shorter
{
SPI.setDataMode(SPI_MODE0);
SPI.transfer(0x15);
SPI.transfer(0x55);
SPI.transfer(0x40);
}
void setup() {
Serial.begin(9600);
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(SDCS)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
//This code starts the SPI with the diddling pressure sensor
SPI.begin(); //see SPI library details on arduino.cc for details
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV32); //divide 16 MHz to communicate on 500 kHz
pinMode(PRCS, OUTPUT);
}
void loop() {
//need to talk to the pressure sensor....
analogWrite(SDCS,LOW);
analogWrite (PRCS,HIGH);
//For the pressure sensor now.
TCCR1B = (TCCR1B & 0xF8) | 1 ; //generates the MCKL signal
analogWrite (PRCS, 128) ;
resetsensor();//resets the sensor - caution: afterwards mode = SPI_MODE0!
//Calibration word 1
unsigned int result1 = 0;
unsigned int inbyte1 = 0;
SPI.transfer(0x1D); //send first byte of command to get calibration word 1
SPI.transfer(0x50); //send second byte of command to get calibration word 1
SPI.setDataMode(SPI_MODE1); //change mode in order to listen
result1 = SPI.transfer(0x00); //send dummy byte to read first byte of word
result1 = result1 << 8; //shift returned byte
inbyte1 = SPI.transfer(0x00); //send dummy byte to read second byte of word
result1 = result1 | inbyte1; //combine first and second byte of word
Serial.print("Calibration word 1 =");
Serial.println(result1);
resetsensor();//resets the sensor
//Calibration word 2; see comments on calibration word 1
unsigned int result2 = 0;
byte inbyte2 = 0;
SPI.transfer(0x1D);
SPI.transfer(0x60);
SPI.setDataMode(SPI_MODE1);
result2 = SPI.transfer(0x00);
result2 = result2 <<8;
inbyte2 = SPI.transfer(0x00);
result2 = result2 | inbyte2;
Serial.print("Calibration word 2 =");
Serial.println(result2);
resetsensor();//resets the sensor
//Calibration word 3; see comments on calibration word 1
unsigned int result3 = 0;
byte inbyte3 = 0;
SPI.transfer(0x1D);
SPI.transfer(0x90);
SPI.setDataMode(SPI_MODE1);
result3 = SPI.transfer(0x00);
result3 = result3 <<8;
inbyte3 = SPI.transfer(0x00);
result3 = result3 | inbyte3;
Serial.print("Calibration word 3 =");
Serial.println(result3);
resetsensor();//resets the sensor
//Calibration word 4; see comments on calibration word 1
unsigned int result4 = 0;
byte inbyte4 = 0;
SPI.transfer(0x1D);
SPI.transfer(0xA0);
SPI.setDataMode(SPI_MODE1);
result4 = SPI.transfer(0x00);
result4 = result4 <<8;
inbyte4 = SPI.transfer(0x00);
result4 = result4 | inbyte4;
Serial.print("Calibration word 4 =");
Serial.println(result4);
//now we do some bitshifting to extract the calibration factors
//out of the calibration words; read datasheet AN510 for better understanding
long c1 = result1 >> 3 & 0x1FFF;
long c2 = ((result1 & 0x07) << 10) | ((result2 >> 6) & 0x03FF);
long c3 = (result3 >> 6) & 0x03FF;
long c4 = (result4 >> 7) & 0x07FF;
long c5 = ((result2 & 0x003F) << 6) | (result3 & 0x003F);
long c6 = result4 & 0x007F;
Serial.println(c1);
Serial.println(c2);
Serial.println(c3);
Serial.println(c4);
Serial.println(c5);
Serial.println(c6);
resetsensor();//resets the sensor
//Temperature:
unsigned int tempMSB = 0; //first byte of value
unsigned int tempLSB = 0; //last byte of value
unsigned int D2 = 0;
SPI.transfer(0x0F); //send first byte of command to get temperature value
SPI.transfer(0x20); //send second byte of command to get temperature value
delay(35); //wait for conversion end
SPI.setDataMode(SPI_MODE1); //change mode in order to listen
tempMSB = SPI.transfer(0x00); //send dummy byte to read first byte of value
tempMSB = tempMSB << 8; //shift first byte
tempLSB = SPI.transfer(0x00); //send dummy byte to read second byte of value
D2 = tempMSB | tempLSB; //combine first and second byte of value
Serial.print("Temperature raw =");
Serial.println(D2); //voilá!
resetsensor();//resets the sensor
//Pressure:
unsigned int presMSB = 0; //first byte of value
unsigned int presLSB =0; //last byte of value
unsigned int D1 = 0;
SPI.transfer(0x0F); //send first byte of command to get pressure value
SPI.transfer(0x40); //send second byte of command to get pressure value
delay(35); //wait for conversion end
SPI.setDataMode(SPI_MODE1); //change mode in order to listen
presMSB = SPI.transfer(0x00); //send dummy byte to read first byte of value
presMSB = presMSB << 8; //shift first byte
presLSB = SPI.transfer(0x00); //send dummy byte to read second byte of value
D1 = presMSB | presLSB; //combine first and second byte of value
Serial.print("Pressure raw =");
Serial.println(D1);
//calculation of the real values by means of the calibration factors and the maths
//in the datasheet. const MUST be long
const long UT1 = (c5 << 3) + 10000;
const long dT = D2 - UT1;
const long TEMP = 200 + ((dT * (c6 + 100)) >> 11);
const long OFF = c2 + (((c4 - 250) * dT) >> 12) + 10000;
const long SENS = (c1/2) + (((c3 + 200) * dT) >> 13) + 3000;
long PCOMP = (SENS * (D1 - OFF) >> 12) + 1000;
float TEMPREAL = TEMP/10;
Serial.print("Real Temperature in °C=");
Serial.println(TEMPREAL);
Serial.print("Compensated pressure in mbar =");
Serial.println(PCOMP);
//2nd order compensation only for T > 0°C
const long dT2 = dT - ((dT >> 7 * dT >> 7) >> 3);
const float TEMPCOMP = (200 + (dT2*(c6+100) >>11))/10;
Serial.print("2nd order compensated temperature in °C =");
Serial.println(TEMPCOMP);
//now talk to the SD logger
analogWrite(SDCS,HIGH);
analogWrite (PRCS, LOW);
File dataFile1 = SD.open("PressureData",FILE_WRITE);
if (dataFile1) {
dataFile1.println(PCOMP);
dataFile1.println(",");
dataFile1.close();
}
else {
Serial.println("error opening PressureData.txt");
}
delay(1000); //just here to slow down the output so it is easier to read
}/code]
The pressure sensor code came from this forum http://forum.arduino.cc/index.php/topic,90025.msg675730.html
and the SD code is from the Arduino Libraries.