altb_pmic / Mbed 2 deprecated Grove-Barometric_Pressure_Sensor_Example

Dependencies:   HP206C mbed

Committer:
pmic
Date:
Tue Jun 25 09:02:23 2019 +0000
Revision:
0:5119eeafd9ce
Child:
1:a6eded1f5043
initial commit, souces from https://os.mbed.com/users/ElectronicsSanta/code/HP206C_barometer/file/0a071ea90726/main.cpp/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmic 0:5119eeafd9ce 1 #include "mbed.h"
pmic 0:5119eeafd9ce 2
pmic 0:5119eeafd9ce 3 #define HP20X_SOFT_RST 0x06
pmic 0:5119eeafd9ce 4 #define HP20X_WR_CONVERT_CMD 0x40
pmic 0:5119eeafd9ce 5 #define HP20X_CONVERT_OSR4096 0 << 2
pmic 0:5119eeafd9ce 6 #define HP20X_CONVERT_OSR2048 1 << 2
pmic 0:5119eeafd9ce 7 #define HP20X_CONVERT_OSR1024 2 << 2
pmic 0:5119eeafd9ce 8 #define HP20X_CONVERT_OSR512 3 << 2
pmic 0:5119eeafd9ce 9 #define HP20X_CONVERT_OSR256 4 << 2
pmic 0:5119eeafd9ce 10 #define HP20X_CONVERT_OSR128 5 << 2
pmic 0:5119eeafd9ce 11
pmic 0:5119eeafd9ce 12 #define HP20X_READ_P 0x30 // read_p command
pmic 0:5119eeafd9ce 13 #define HP20X_READ_A 0x31 // read_a command
pmic 0:5119eeafd9ce 14 #define HP20X_READ_T 0x32 // read_t command
pmic 0:5119eeafd9ce 15 #define HP20X_READ_PT 0x10 // read_pt command
pmic 0:5119eeafd9ce 16 #define HP20X_READ_AT 0x11 // read_at command
pmic 0:5119eeafd9ce 17 #define HP20X_READ_CAL 0X28 // RE-CAL ANALOG
pmic 0:5119eeafd9ce 18
pmic 0:5119eeafd9ce 19 #define HP20X_WR_REG_MODE 0xC0
pmic 0:5119eeafd9ce 20 #define HP20X_RD_REG_MODE 0x80
pmic 0:5119eeafd9ce 21
pmic 0:5119eeafd9ce 22 #define HP20X_ANA_CAL 0x28 // recalibrate analog internal circuitries
pmic 0:5119eeafd9ce 23
pmic 0:5119eeafd9ce 24 #define HP20X_OK_DEV 0X80 // successfully initialized
pmic 0:5119eeafd9ce 25 #define HP20X_REG_PARA 0X0F // status register
pmic 0:5119eeafd9ce 26
pmic 0:5119eeafd9ce 27 #define I2C_BAROMETER_ADDRESS 0x76 << 1 // 0xEC
pmic 0:5119eeafd9ce 28
pmic 0:5119eeafd9ce 29 #define OSR_CFG HP20X_CONVERT_OSR2048
pmic 0:5119eeafd9ce 30
pmic 0:5119eeafd9ce 31 Serial serial(SERIAL_TX, SERIAL_RX);
pmic 0:5119eeafd9ce 32 I2C i2c(I2C_SDA, I2C_SCL); // PB_9, PB_8
pmic 0:5119eeafd9ce 33
pmic 0:5119eeafd9ce 34 float temperature = 0.0f;
pmic 0:5119eeafd9ce 35 float pressure = 0.0f;
pmic 0:5119eeafd9ce 36 float altitude = 0.0f;
pmic 0:5119eeafd9ce 37 bool baro_found = false;
pmic 0:5119eeafd9ce 38
pmic 0:5119eeafd9ce 39 typedef enum {
pmic 0:5119eeafd9ce 40 HP20X_READ_TEMP,
pmic 0:5119eeafd9ce 41 HP20X_READ_PRES
pmic 0:5119eeafd9ce 42 } barometerReadingType;
pmic 0:5119eeafd9ce 43
pmic 0:5119eeafd9ce 44 // send a register reading command
pmic 0:5119eeafd9ce 45 unsigned char readRegister(unsigned char reg) {
pmic 0:5119eeafd9ce 46 char i2cBuffer[1];
pmic 0:5119eeafd9ce 47 i2cBuffer[0] = (reg | HP20X_RD_REG_MODE);
pmic 0:5119eeafd9ce 48 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 49
pmic 0:5119eeafd9ce 50 // read the data
pmic 0:5119eeafd9ce 51 i2c.read(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 52
pmic 0:5119eeafd9ce 53 return i2cBuffer[0];
pmic 0:5119eeafd9ce 54 }
pmic 0:5119eeafd9ce 55
pmic 0:5119eeafd9ce 56 // send a register writing command
pmic 0:5119eeafd9ce 57 void writeRegister(unsigned char reg, unsigned char data) {
pmic 0:5119eeafd9ce 58 char i2cBuffer[1];
pmic 0:5119eeafd9ce 59 i2cBuffer[0] = (reg | HP20X_WR_REG_MODE);
pmic 0:5119eeafd9ce 60 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 61 i2cBuffer[0] = data;
pmic 0:5119eeafd9ce 62 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 63 }
pmic 0:5119eeafd9ce 64
pmic 0:5119eeafd9ce 65 void enableCompensation() {
pmic 0:5119eeafd9ce 66 writeRegister(HP20X_REG_PARA, 0x01);
pmic 0:5119eeafd9ce 67 }
pmic 0:5119eeafd9ce 68
pmic 0:5119eeafd9ce 69 void disableCompensation() {
pmic 0:5119eeafd9ce 70 writeRegister(HP20X_REG_PARA, 0x00);
pmic 0:5119eeafd9ce 71 }
pmic 0:5119eeafd9ce 72
pmic 0:5119eeafd9ce 73 void softReset() {
pmic 0:5119eeafd9ce 74 char i2cBuffer[1];
pmic 0:5119eeafd9ce 75 i2cBuffer[0] = HP20X_SOFT_RST;
pmic 0:5119eeafd9ce 76 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 77 }
pmic 0:5119eeafd9ce 78
pmic 0:5119eeafd9ce 79 void recalibrate() {
pmic 0:5119eeafd9ce 80 char i2cBuffer[1];
pmic 0:5119eeafd9ce 81 i2cBuffer[0] = HP20X_ANA_CAL;
pmic 0:5119eeafd9ce 82 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 83 }
pmic 0:5119eeafd9ce 84
pmic 0:5119eeafd9ce 85 uint32_t readData3Bytes() {
pmic 0:5119eeafd9ce 86 uint32_t tmpData;
pmic 0:5119eeafd9ce 87 char tmpArray[3] = {0};
pmic 0:5119eeafd9ce 88
pmic 0:5119eeafd9ce 89 // request 3 bytes from device
pmic 0:5119eeafd9ce 90 i2c.read(I2C_BAROMETER_ADDRESS, tmpArray, 3);
pmic 0:5119eeafd9ce 91
pmic 0:5119eeafd9ce 92 // MSB
pmic 0:5119eeafd9ce 93 tmpData = tmpArray[0] << 16 | tmpArray[1] << 8 | tmpArray[2];
pmic 0:5119eeafd9ce 94
pmic 0:5119eeafd9ce 95 if(tmpData & 0x800000) {
pmic 0:5119eeafd9ce 96 tmpData |= 0xff000000;
pmic 0:5119eeafd9ce 97 }
pmic 0:5119eeafd9ce 98
pmic 0:5119eeafd9ce 99 return tmpData;
pmic 0:5119eeafd9ce 100 }
pmic 0:5119eeafd9ce 101
pmic 0:5119eeafd9ce 102 uint32_t *readData6Bytes() {
pmic 0:5119eeafd9ce 103 static uint32_t tmpData[2];
pmic 0:5119eeafd9ce 104 char tmpArray[6] = {0};
pmic 0:5119eeafd9ce 105
pmic 0:5119eeafd9ce 106 // request 6 bytes from device
pmic 0:5119eeafd9ce 107 i2c.read(I2C_BAROMETER_ADDRESS, tmpArray, 6);
pmic 0:5119eeafd9ce 108
pmic 0:5119eeafd9ce 109 // MSB
pmic 0:5119eeafd9ce 110 tmpData[0] = tmpArray[0] << 16 | tmpArray[1] << 8 | tmpArray[2]; // temperature
pmic 0:5119eeafd9ce 111 tmpData[1] = tmpArray[3] << 16 | tmpArray[4] << 8 | tmpArray[5]; // pressure
pmic 0:5119eeafd9ce 112
pmic 0:5119eeafd9ce 113 if(tmpData[0] & 0x800000) {
pmic 0:5119eeafd9ce 114 tmpData[0] |= 0xff000000;
pmic 0:5119eeafd9ce 115 }
pmic 0:5119eeafd9ce 116 if(tmpData[1] & 0x800000) {
pmic 0:5119eeafd9ce 117 tmpData[1] |= 0xff000000;
pmic 0:5119eeafd9ce 118 }
pmic 0:5119eeafd9ce 119
pmic 0:5119eeafd9ce 120 return tmpData;
pmic 0:5119eeafd9ce 121 }
pmic 0:5119eeafd9ce 122
pmic 0:5119eeafd9ce 123 void readTemperatureAndPressureStep1() {
pmic 0:5119eeafd9ce 124 char i2cBuffer[2];
pmic 0:5119eeafd9ce 125 i2cBuffer[0] = HP20X_WR_CONVERT_CMD | OSR_CFG;
pmic 0:5119eeafd9ce 126 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1); // ADC convert
pmic 0:5119eeafd9ce 127 }
pmic 0:5119eeafd9ce 128
pmic 0:5119eeafd9ce 129 void readTemperatureAndPressureStep2() {
pmic 0:5119eeafd9ce 130 char i2cBuffer[1];
pmic 0:5119eeafd9ce 131
pmic 0:5119eeafd9ce 132 i2cBuffer[0] = HP20X_READ_PT;
pmic 0:5119eeafd9ce 133 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 134
pmic 0:5119eeafd9ce 135 uint32_t *p = readData6Bytes();
pmic 0:5119eeafd9ce 136 temperature = ((double)p[0] / 100.0f);
pmic 0:5119eeafd9ce 137 pressure = ((double)p[1] / 100.0f);
pmic 0:5119eeafd9ce 138 }
pmic 0:5119eeafd9ce 139
pmic 0:5119eeafd9ce 140 void readAltitude() {
pmic 0:5119eeafd9ce 141 char i2cBuffer[1];
pmic 0:5119eeafd9ce 142 i2cBuffer[0] = HP20X_READ_A;
pmic 0:5119eeafd9ce 143 i2c.write(I2C_BAROMETER_ADDRESS, i2cBuffer, 1);
pmic 0:5119eeafd9ce 144
pmic 0:5119eeafd9ce 145 altitude = ((double)readData3Bytes() / 100.0f);
pmic 0:5119eeafd9ce 146 }
pmic 0:5119eeafd9ce 147
pmic 0:5119eeafd9ce 148 // calculate the conversion time needed before reading back the sensor values
pmic 0:5119eeafd9ce 149 uint8_t getConversionTime(barometerReadingType type) {
pmic 0:5119eeafd9ce 150 uint32_t OSR_ConvertTime;
pmic 0:5119eeafd9ce 151 if (OSR_CFG == HP20X_CONVERT_OSR128) {
pmic 0:5119eeafd9ce 152 switch (type) {
pmic 0:5119eeafd9ce 153 case HP20X_READ_TEMP: OSR_ConvertTime = 3; break; // 2.1 ms
pmic 0:5119eeafd9ce 154 case HP20X_READ_PRES: OSR_ConvertTime = 5; break; // 4.1 ms
pmic 0:5119eeafd9ce 155 }
pmic 0:5119eeafd9ce 156 } else if (OSR_CFG == HP20X_CONVERT_OSR256) {
pmic 0:5119eeafd9ce 157 switch (type) {
pmic 0:5119eeafd9ce 158 case HP20X_READ_TEMP: OSR_ConvertTime = 5; break; // 4.1 ms
pmic 0:5119eeafd9ce 159 case HP20X_READ_PRES: OSR_ConvertTime = 9; break; // 8.2 ms
pmic 0:5119eeafd9ce 160 }
pmic 0:5119eeafd9ce 161 } else if (OSR_CFG == HP20X_CONVERT_OSR512) {
pmic 0:5119eeafd9ce 162 switch (type) {
pmic 0:5119eeafd9ce 163 case HP20X_READ_TEMP: OSR_ConvertTime = 9; break; // 8.2 ms
pmic 0:5119eeafd9ce 164 case HP20X_READ_PRES: OSR_ConvertTime = 17; break; // 16.4 ms
pmic 0:5119eeafd9ce 165 }
pmic 0:5119eeafd9ce 166 } else if (OSR_CFG == HP20X_CONVERT_OSR1024) {
pmic 0:5119eeafd9ce 167 switch (type) {
pmic 0:5119eeafd9ce 168 case HP20X_READ_TEMP: OSR_ConvertTime = 17; break; // 16.4 ms
pmic 0:5119eeafd9ce 169 case HP20X_READ_PRES: OSR_ConvertTime = 34; break; // 32.8 ms
pmic 0:5119eeafd9ce 170 }
pmic 0:5119eeafd9ce 171 } else if (OSR_CFG == HP20X_CONVERT_OSR2048) {
pmic 0:5119eeafd9ce 172 switch (type) {
pmic 0:5119eeafd9ce 173 case HP20X_READ_TEMP: OSR_ConvertTime = 34; break; // 32.8 ms
pmic 0:5119eeafd9ce 174 case HP20X_READ_PRES: OSR_ConvertTime = 67; break; // 65.6 ms
pmic 0:5119eeafd9ce 175 }
pmic 0:5119eeafd9ce 176 } else if (OSR_CFG == HP20X_CONVERT_OSR4096) {
pmic 0:5119eeafd9ce 177 switch (type) {
pmic 0:5119eeafd9ce 178 case HP20X_READ_TEMP: OSR_ConvertTime = 67; break; // 65.6 ms
pmic 0:5119eeafd9ce 179 case HP20X_READ_PRES: OSR_ConvertTime = 132; break; // 131.1 ms
pmic 0:5119eeafd9ce 180 }
pmic 0:5119eeafd9ce 181 }
pmic 0:5119eeafd9ce 182
pmic 0:5119eeafd9ce 183 return OSR_ConvertTime;
pmic 0:5119eeafd9ce 184 }
pmic 0:5119eeafd9ce 185
pmic 0:5119eeafd9ce 186 int main()
pmic 0:5119eeafd9ce 187 {
pmic 0:5119eeafd9ce 188 serial.baud(115200);
pmic 0:5119eeafd9ce 189 i2c.frequency((uint32_t)100e3);
pmic 0:5119eeafd9ce 190
pmic 0:5119eeafd9ce 191 serial.printf("HP206C barometer example...\n");
pmic 0:5119eeafd9ce 192
pmic 0:5119eeafd9ce 193 // detect the barometer
pmic 0:5119eeafd9ce 194 unsigned char result = readRegister(HP20X_REG_PARA);
pmic 0:5119eeafd9ce 195 if (result == HP20X_OK_DEV) {
pmic 0:5119eeafd9ce 196 baro_found = true;
pmic 0:5119eeafd9ce 197 softReset();
pmic 0:5119eeafd9ce 198 disableCompensation();
pmic 0:5119eeafd9ce 199 serial.printf("barometer found\n");
pmic 0:5119eeafd9ce 200 } else {
pmic 0:5119eeafd9ce 201 serial.printf("barometer NOT found \n");
pmic 0:5119eeafd9ce 202 while(1);
pmic 0:5119eeafd9ce 203 }
pmic 0:5119eeafd9ce 204
pmic 0:5119eeafd9ce 205 while(1)
pmic 0:5119eeafd9ce 206 {
pmic 0:5119eeafd9ce 207 if (baro_found) {
pmic 0:5119eeafd9ce 208 recalibrate();
pmic 0:5119eeafd9ce 209 wait_us(70); // this delay is a must if we read temperature, pressure or altitude right after the recalibration (in tests, 60 didn't worked) in microseconds
pmic 0:5119eeafd9ce 210 readTemperatureAndPressureStep1();
pmic 0:5119eeafd9ce 211 wait_ms(getConversionTime(HP20X_READ_PRES)); // get only the pressure, because its the longest interval
pmic 0:5119eeafd9ce 212 readTemperatureAndPressureStep2();
pmic 0:5119eeafd9ce 213 readAltitude();
pmic 0:5119eeafd9ce 214
pmic 0:5119eeafd9ce 215 serial.printf("temperature %f, pressure %f, altitude %f\r\n", temperature, pressure, altitude);
pmic 0:5119eeafd9ce 216 wait_ms(100); // don't hammer the serial console
pmic 0:5119eeafd9ce 217 }
pmic 0:5119eeafd9ce 218 }
pmic 0:5119eeafd9ce 219 }