SPI sensor -> SD

Hi! I’m very new in the Arduino scene and I don’t know much about coding.

I’m trying to log data from MPL115A1 (baromteric pressure sensor) to my SD card but I’m really having a hard time.
The data I get is trash so most likely I guess its about the SPI thing since I can log nicely with an I2C accelerometer.

Here is the default code (w/o the calculation part) of the pressure sensor. Any comments/help/advice would be really much be appreciated! :slight_smile:

#include <SPI.h>

#define NWS_BARO 29.92 

// Pin definitions
#define MPL115A1_ENABLE_PIN 9
#define MPL115A1_SELECT_PIN 10

// Masks for MPL115A1 SPI i/o
#define MPL115A1_READ_MASK  0x80
#define MPL115A1_WRITE_MASK 0x7F 

void setup() {
    // initialize serial i/o
    // initialize SPI interface
    // these are the defaults
    //SPI.setClockDivider(SPI_CLOCK_DIV4);  // MPL115A1 supports up to 8MHz
    // initialize the chip select and enable pins
    pinMode(MPL115A1_SELECT_PIN, OUTPUT);
    pinMode(MPL115A1_ENABLE_PIN, OUTPUT);
    // sleep the MPL115A1
    digitalWrite(MPL115A1_ENABLE_PIN, LOW);
    // set the chip select inactive, select signal is CS LOW
    digitalWrite(MPL115A1_SELECT_PIN, HIGH);

void loop() {
    float pressure_pKa = 0;
    float temperature_c= 0;
    long altitude_ft = 0;
    // wake the MPL115A1
    digitalWrite(MPL115A1_ENABLE_PIN, HIGH);
    delay(20);  // give the chip a few ms to wake up
    pressure_pKa = calculatePressurekPa();
    temperature_c = calculateTemperatureC();
    altitude_ft = calculateAltitudeFt(pressure_pKa);
    // put the MPL115A1 to sleep, it has this feature why not use it
    // while in shutdown the part draws ~1uA
    digitalWrite(MPL115A1_ENABLE_PIN, LOW);
    // print table of altitude, pressures, and temperatures to console
    Serial.print(" ft | ");
    Serial.print(" m | ");
    Serial.print(KPA_TO_INHG(pressure_pKa), 2);
    Serial.print(" in Hg | ");
    Serial.print(KPA_TO_MMHG(pressure_pKa), 0);
    Serial.print(" mm Hg | ");
    Serial.print(KPA_TO_PSIA(pressure_pKa), 2);
    Serial.print(" psia | ");
    //Serial.print(KPA_TO_KGCM2(pressure_pKa), 3);
    ///Serial.print(" kg/cm2 | ");
    Serial.print(pressure_pKa, 1);
    Serial.print(" kPa | ");
    // At a res of -5.35 counts/°C, digits lower than 0.1°C are not significant
    Serial.print(temperature_c, 1);
    Serial.print(" C | ");
    Serial.print(DEGC_TO_DEGF(temperature_c), 1);
    Serial.print(" F\n");
    // wait a few seconds before looping

unsigned int readRegister(byte thisRegister) {
    byte result = 0;
    // select the MPL115A1
    digitalWrite(MPL115A1_SELECT_PIN, LOW);
    // send the request
    SPI.transfer(thisRegister | MPL115A1_READ_MASK);
    result = SPI.transfer(0x00);
    // deselect the MPL115A1
    digitalWrite(MPL115A1_SELECT_PIN, HIGH);
    return result;  

void writeRegister(byte thisRegister, byte thisValue) {
    // select the MPL115A1
    digitalWrite(MPL115A1_SELECT_PIN, LOW);
    // send the request
    SPI.transfer(thisRegister & MPL115A1_WRITE_MASK);
    // deselect the MPL115A1
    digitalWrite(MPL115A1_SELECT_PIN, HIGH);

What SD device do you have? A link to the hardware would help.

Sounds like you may have a slave select challenge. Which digital pin is the SD slave select on?

Thank you very much SurferTim! here is the link of the SD shield that I'm using

The SS pin the SD card uses is pin 4

OK. Try this. Disable the SD SPI for a test. Does the sensor respond correctly?

void setup() {
    // initialize serial i/o
    // disable SD SPI
    pinMode(4, OUTPUT);
    digitalWrite(4, HIGH);

    // initialize SPI interface
// rest of your setup

Thank you so much! That 1 line (digitalWrite(4, HIGH):wink: is the one that’s keeping me back for months now!
Thank you so much again! now I can log the data smoothly :slight_smile:
Sorry for the beginner post XD