Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.21 KB | None | 0 0
  1. /*
  2.     BMP1810 by Bosch
  3.     i2c address 0x77
  4.  
  5.     oss (oversampling setting) :
  6.     0 = Ultra low power        maximum conversion time: 4.5ms
  7.     1 = Standard               maximum conversion time: 7.5ms
  8.     2 = High resolution        maximum conversion time: 13.5ms
  9.     3 = Ultra high resolution  maximum conversion time: 25.5ms
  10.     * oss is always 0 for temperature measurements
  11. */
  12.  
  13. #define BMP180_ADDRESS 0x77     // I2C address of the BMP180
  14.  
  15. #define AC1    (int16_t)7819     // EEPROM registers 0xAA,0xAB
  16. #define AC2    (int16_t)-997     // EEPROM registers 0xAC,0xAD
  17. #define AC3    (int16_t)-14468   // EEPROM registers 0xAE,0xAF
  18. #define AC4    (uint16_t)33992   // EEPROM registers 0xB0,0xB1
  19. #define AC5    (uint16_t)25359   // EEPROM registers 0xB2,0xB3
  20. #define AC6    (uint16_t)15534   // EEPROM registers 0xB4,0xB5
  21. #define B1     (int16_t)6515     // EEPROM registers 0xB6,0xB7
  22. #define B2     (int16_t)32       // EEPROM registers 0xB8,0xB9
  23. #define MB     (int16_t)-32768   // EEPROM registers 0xBA,0xBB
  24. #define MC     (int16_t)-11786   // EEPROM registers 0xBC,0xBD
  25. #define MD     (int16_t)2601     // EEPROM registers 0xBE,0xBF
  26.  
  27. #define oss     0                   //Oversampling setting
  28.  
  29. long temp_raw;
  30. long temp_calc;
  31. float temperature;
  32. long pressure_raw;
  33. long pressure_calc;
  34. float pressure;
  35.  
  36. void writeI2Cregister(uint8_t address, uint8_t register_number, uint8_t newRegisterState) {
  37.   Wire.beginTransmission(address);
  38.   Wire.write(register_number);
  39.   Wire.write(newRegisterState);
  40.   Wire.endTransmission(true);
  41. }
  42.  
  43. void BMP180_readEEPROM() {
  44.     // Read factory calibration values from EEPROM
  45.     Wire.beginTransmission(BMP180_ADDRESS);
  46.     Wire.write(0xAA);
  47.     Wire.endTransmission(false);
  48.     Wire.requestFrom(BMP180_ADDRESS, 22, true);
  49.     int16_t AC1 = Wire.read() << 8 | Wire.read();
  50.     int16_t AC2 = Wire.read() << 8 | Wire.read();
  51.     int16_t AC3 = Wire.read() << 8 | Wire.read();
  52.     uint16_t AC4 = Wire.read() << 8 | Wire.read();
  53.     uint16_t AC5 = Wire.read() << 8 | Wire.read();
  54.     uint16_t AC6 = Wire.read() << 8 | Wire.read();
  55.     int16_t B1 = Wire.read() << 8 | Wire.read();
  56.     int16_t B2 = Wire.read() << 8 | Wire.read();
  57.     int16_t MB = Wire.read() << 8 | Wire.read();
  58.     int16_t MC = Wire.read() << 8 | Wire.read();
  59.     int16_t MD = Wire.read() << 8 | Wire.read();
  60. }
  61. long BMP180_read() {
  62.     // Start new temperature measurement
  63.     writeI2Cregister(BMP180_ADDRESS, 0xF4, 0 << 6 | 1 << 5 | 0b01110);
  64.     delay(5); // Max conversion time is 4.5ms
  65.     // Read temperature
  66.     Wire.beginTransmission(BMP180_ADDRESS);
  67.     Wire.write(0xF6);
  68.     Wire.endTransmission(false);
  69.     Wire.requestFrom(BMP180_ADDRESS, 2, true);
  70.     temp_raw = Wire.read() << 8 | Wire.read();
  71.  
  72.     // Start new pressure measurement
  73.     writeI2Cregister(BMP180_ADDRESS, 0xF4, oss << 6 | 1 << 5 | 0b10100);
  74.     delay(5); // Max conversion time is 4.5ms (oss = 0)
  75.     // Read pressure
  76.     Wire.beginTransmission(BMP180_ADDRESS);
  77.     Wire.write(0xF6);
  78.     Wire.endTransmission(false);
  79.     Wire.requestFrom(BMP180_ADDRESS, 3, true);
  80.     long msb = Wire.read();
  81.     long lsb = Wire.read();
  82.     long xlsb = Wire.read();
  83.     pressure_raw = (msb << 16 | lsb << 8 | xlsb) >> (8 - oss);    
  84. }
  85.  
  86. void BMP180_convert() {
  87.   long X1;
  88.   long X2;
  89.   long X3;
  90.   long B3;
  91.   unsigned long B4;
  92.   long B5;
  93.   long B6;
  94.   unsigned long B7;
  95.  
  96.   // Convert temperature
  97.   X1 = (temp_raw - AC6) * AC5 / 32768;
  98.   X2 = MC * (long)2048 / (X1 + MD);
  99.   B5 = X1 + X2;
  100.   temp_calc = (B5 + 8) / 16;
  101.   temperature = temp_calc / 10.0;
  102.  
  103.   // Convert pressure
  104.   B6 = B5 - 4000;
  105.   X1 = (B2 * (B6 * B6 / 4096)) / 2048;
  106.   X2 = AC2 * B6 / 2048;
  107.   X3 = X1 + X2;
  108.   B3 = ((((long)AC1 * 4 + X3) << oss) + 2) / 4;
  109.   X1 = AC3 * B6 / 8192;
  110.   X2 = (B1 * (B6 * B6 / 4096)) / 65536;
  111.   X3 = ((X1 + X2) + 2) / 4;
  112.   B4 = AC4 * (unsigned long)(X3 + 32768) / 32768;
  113.   B7 = ((unsigned long)pressure_raw - B3) * (50000 >> oss);
  114.   if (B7 < 0x80000000) {
  115.     pressure_calc = (B7 * 2) / B4;
  116.   }
  117.   else {
  118.     pressure_calc = (B7 / B4) * 2;
  119.   }
  120.   X1 = (pressure_calc / 256) * (pressure_calc / 256);
  121.   X1 = (X1 * 3038) / 65536;
  122.   X2 = (-7357 * pressure_calc) / 65536;
  123.   pressure_calc = pressure_calc + (X1 + X2 + 3791) / 16;
  124.   pressure = pressure_calc / 100.0f;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement