Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }