// MS4525 TAB
#define MS4525_PRESSURE_PA_PER_COUNT 1.05199220826 // Pa, Output Type A (10% to 90%), Pressure Range 001 (-1 to 1 psi)
#define MS4525_TEMPERATURE_C_PER_COUNT 0.09765625 // °C
#define MS4525_ADDRESS 0x28 // Interface Type I
//#define MS4525_ADDRESS 0x36; // Interface Type J
//#define MS4525_ADDRESS 0x46; // Interface Type K
//#define MS4525_ADDRESS 0x48; // Interface Type 0
//char *MS4525StatusStrings[] = {"Normal", "Busy", "Stale", "Faulty"};
int MS4525PressureCounts, MS4525PressureCountsOffset = 8192;
int MS4525TemperatureCounts, MS4525TemperatureCountsOffset = 511;
byte MS4525FetchCounts() {
Wire.requestFrom(MS4525_ADDRESS, 4, true); // request 4 bytes, 2 pressure/status bytes and 2 temperature bytes
byte pressureHigh = Wire.read();
byte pressureLow = Wire.read();
byte temperatureHigh = Wire.read();
byte temperatureLow = Wire.read();
MS4525PressureCounts = ((int)(pressureHigh & 0b00111111) << 8) | pressureLow; // 14 bits, 6 LSB of pressure high byte and pressure low byte
MS4525TemperatureCounts = ((int)(temperatureHigh) << 3) | (temperatureLow >> 5); // 11 bits, temperature high byte and 3 MSB of temperature low byte
return pressureHigh >> 6; // status, 2 MSB of pressure high byte
}
void MS4525FetchAverageCounts(int n) {
unsigned long pressureSum = 0, temperatureSum = 0;
int i = 0;
while (i < n) {
if (MS4525FetchCounts() == 0) {
pressureSum += MS4525PressureCounts;
temperatureSum += MS4525TemperatureCounts;
i++;
}
}
MS4525PressureCounts = (int)((float)pressureSum / i + 0.5);
MS4525TemperatureCounts = (int)((float)temperatureSum / i + 0.5);
}
void MS4525CalibPressureCountsOffset() {
MS4525FetchAverageCounts(8192);
MS4525PressureCountsOffset = MS4525PressureCounts;
}
float MS4525PressurePa() {
return MS4525_PRESSURE_PA_PER_COUNT * (MS4525PressureCounts - MS4525PressureCountsOffset); // Pa;
}
float MS4525TemperatureC() {
return MS4525_TEMPERATURE_C_PER_COUNT * (MS4525TemperatureCounts - MS4525TemperatureCountsOffset); // °C
}