private static int GetConversionDelay(MS5837SampleRate sampleRate) { var conversionDelay = 0; switch (sampleRate) { case MS5837SampleRate.Osr256: conversionDelay = 1; break; case MS5837SampleRate.Osr512: conversionDelay = 2; break; case MS5837SampleRate.Osr1024: conversionDelay = 3; break; case MS5837SampleRate.Osr2048: conversionDelay = 5; break; case MS5837SampleRate.Osr4096: conversionDelay = 10; break; case MS5837SampleRate.Osr8192: conversionDelay = 20; break; } return(conversionDelay); }
public MS5837Result Read(MS5837SampleRate sampleRate = MS5837SampleRate.Osr256) { if (IsInitialized == false) { Initialize(); } var conversionDelay = GetConversionDelay(sampleRate); WriteByte((byte)(sampleRate + 64)); Thread.Sleep(conversionDelay); var buffer = ReadBytes(0x00, 3); var d1 = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2]; WriteByte((byte)(sampleRate + 80)); Thread.Sleep(conversionDelay); buffer = ReadBytes(0x00, 3); var d2 = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2]; long sens; long off; long senSi = 0; long ofFi = 0; long ti = 0; var dT = d2 - _coefficients[5] * 256; if (_model == MS5837Model.MS583702BA) { sens = _coefficients[1] * 65536L + _coefficients[3] * dT / 128L; off = _coefficients[2] * 131072L + _coefficients[4] * dT / 64L; } else { sens = _coefficients[1] * 32768L + _coefficients[3] * dT / 256L; off = _coefficients[2] * 65536L + _coefficients[4] * dT / 128L; } var temperature = 2000L + dT * _coefficients[6] / 8388608; if (_model == MS5837Model.MS583702BA) { if (temperature / 100 < 20) { ti = 11 * dT * dT / 34359738368L; ofFi = 31 * (temperature - 2000) * (temperature - 2000) / 8; senSi = 63 * (temperature - 2000) * (temperature - 2000) / 32; } } else { if (temperature / 100 < 20) // Low temperature { ti = 3 * (dT * dT / 8589934592L); ofFi = 3 * ((temperature - 2000) * (temperature - 2000) / 2); senSi = 5 * ((temperature - 2000) * (temperature - 2000) / 8); if (temperature / 100 < -15) // Very low temperature { ofFi = ofFi + 7 * (temperature + 1500) * (temperature + 1500); senSi = senSi + 4 * (temperature + 1500) * (temperature + 1500); } } else // High temperature { ti = 2 * (dT * dT / 137438953472L); ofFi = 1 * ((temperature - 2000) * (temperature - 2000) / 16); senSi = 0; } } var off2 = off - ofFi; var sens2 = sens - senSi; var result = new MS5837Result(); if (_model == MS5837Model.MS583702BA) { result.Temperature = temperature - ti; result.Pressure = (d1 * sens2 / 2097152L - off2) / 32768L / 100; } else { result.Temperature = temperature - ti; result.Pressure = (d1 * sens2 / 2097152L - off2) / 8192L / 10; } return(result); }