Sample program on how to use the LIS2MDL sensor on the RAKWirelss iTracker module

Committer:
knaresh89
Date:
Mon Feb 12 05:04:29 2018 +0000
Revision:
0:a8bfd25ff975
Sample program on how to use the BME280 sensor on the RAKWirelss iTracker module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
knaresh89 0:a8bfd25ff975 1 /**
knaresh89 0:a8bfd25ff975 2 ******************************************************************************
knaresh89 0:a8bfd25ff975 3 * @file BME280_SPI.cpp
knaresh89 0:a8bfd25ff975 4 * @author Toyomasa Watarai
knaresh89 0:a8bfd25ff975 5 * @version V1.0.0
knaresh89 0:a8bfd25ff975 6 * @date 11 March 2017
knaresh89 0:a8bfd25ff975 7 * @brief BME280_SPI class implementation
knaresh89 0:a8bfd25ff975 8 ******************************************************************************
knaresh89 0:a8bfd25ff975 9 * @attention
knaresh89 0:a8bfd25ff975 10 *
knaresh89 0:a8bfd25ff975 11 * Licensed under the Apache License, Version 2.0 (the "License");
knaresh89 0:a8bfd25ff975 12 * you may not use this file except in compliance with the License.
knaresh89 0:a8bfd25ff975 13 * You may obtain a copy of the License at
knaresh89 0:a8bfd25ff975 14 *
knaresh89 0:a8bfd25ff975 15 * http://www.apache.org/licenses/LICENSE-2.0
knaresh89 0:a8bfd25ff975 16 *
knaresh89 0:a8bfd25ff975 17 * Unless required by applicable law or agreed to in writing, software
knaresh89 0:a8bfd25ff975 18 * distributed under the License is distributed on an "AS IS" BASIS,
knaresh89 0:a8bfd25ff975 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
knaresh89 0:a8bfd25ff975 20 * See the License for the specific language governing permissions and
knaresh89 0:a8bfd25ff975 21 * limitations under the License.
knaresh89 0:a8bfd25ff975 22 */
knaresh89 0:a8bfd25ff975 23
knaresh89 0:a8bfd25ff975 24 #include "mbed.h"
knaresh89 0:a8bfd25ff975 25 #include "BME280_SPI.h"
knaresh89 0:a8bfd25ff975 26 #include "SEGGER_RTT.h"
knaresh89 0:a8bfd25ff975 27
knaresh89 0:a8bfd25ff975 28 BME280_SPI::BME280_SPI(PinName mosi, PinName miso, PinName sclk, PinName cs)
knaresh89 0:a8bfd25ff975 29 :
knaresh89 0:a8bfd25ff975 30 _spi(mosi, miso, sclk),
knaresh89 0:a8bfd25ff975 31 _cs(cs),
knaresh89 0:a8bfd25ff975 32 t_fine(0)
knaresh89 0:a8bfd25ff975 33 {
knaresh89 0:a8bfd25ff975 34 initialize();
knaresh89 0:a8bfd25ff975 35 }
knaresh89 0:a8bfd25ff975 36
knaresh89 0:a8bfd25ff975 37
knaresh89 0:a8bfd25ff975 38 BME280_SPI::~BME280_SPI()
knaresh89 0:a8bfd25ff975 39 {
knaresh89 0:a8bfd25ff975 40 }
knaresh89 0:a8bfd25ff975 41
knaresh89 0:a8bfd25ff975 42 void BME280_SPI::initialize()
knaresh89 0:a8bfd25ff975 43 {
knaresh89 0:a8bfd25ff975 44 char cmd[18];
knaresh89 0:a8bfd25ff975 45
knaresh89 0:a8bfd25ff975 46 _cs = 1;
knaresh89 0:a8bfd25ff975 47 _spi.format(8, 0); // 8-bit, mode=0
knaresh89 0:a8bfd25ff975 48 _spi.frequency(1000000); // 1MHZ
knaresh89 0:a8bfd25ff975 49
knaresh89 0:a8bfd25ff975 50 _cs = 0;
knaresh89 0:a8bfd25ff975 51 _spi.write(0xd0); // chip_id
knaresh89 0:a8bfd25ff975 52 cmd[0] = _spi.write(0); // read chip_id
knaresh89 0:a8bfd25ff975 53 _cs = 1;
knaresh89 0:a8bfd25ff975 54
knaresh89 0:a8bfd25ff975 55 DEBUG_PRINT("chip_id = 0x%x\n", cmd[0]);
knaresh89 0:a8bfd25ff975 56
knaresh89 0:a8bfd25ff975 57 _cs = 0;
knaresh89 0:a8bfd25ff975 58 _spi.write(0xf2 & BME280_SPI_MASK); // ctrl_hum
knaresh89 0:a8bfd25ff975 59 _spi.write(0x04); // Humidity oversampling x4
knaresh89 0:a8bfd25ff975 60 _cs = 1;
knaresh89 0:a8bfd25ff975 61
knaresh89 0:a8bfd25ff975 62 _cs = 0;
knaresh89 0:a8bfd25ff975 63 _spi.write(0xf4 & BME280_SPI_MASK); // ctrl_meas
knaresh89 0:a8bfd25ff975 64 _spi.write((4<<5)|(4<<2)|3); // Temparature oversampling x4, Pressure oversampling x4, Normal mode
knaresh89 0:a8bfd25ff975 65 _cs = 1;
knaresh89 0:a8bfd25ff975 66
knaresh89 0:a8bfd25ff975 67 _cs = 0;
knaresh89 0:a8bfd25ff975 68 _spi.write(0xf5 & BME280_SPI_MASK); // config
knaresh89 0:a8bfd25ff975 69 _spi.write(0xa0); // Standby 1000ms, Filter off, 4-wire SPI interface
knaresh89 0:a8bfd25ff975 70 _cs = 1;
knaresh89 0:a8bfd25ff975 71
knaresh89 0:a8bfd25ff975 72 wait(1);
knaresh89 0:a8bfd25ff975 73
knaresh89 0:a8bfd25ff975 74 _cs = 0;
knaresh89 0:a8bfd25ff975 75 _spi.write(0x88); // read dig_T regs
knaresh89 0:a8bfd25ff975 76 for(int i = 0; i < 6; i++)
knaresh89 0:a8bfd25ff975 77 cmd[i] = _spi.write(0);
knaresh89 0:a8bfd25ff975 78 _cs = 1;
knaresh89 0:a8bfd25ff975 79
knaresh89 0:a8bfd25ff975 80 dig_T1 = (cmd[1] << 8) | cmd[0];
knaresh89 0:a8bfd25ff975 81 dig_T2 = (cmd[3] << 8) | cmd[2];
knaresh89 0:a8bfd25ff975 82 dig_T3 = (cmd[5] << 8) | cmd[4];
knaresh89 0:a8bfd25ff975 83
knaresh89 0:a8bfd25ff975 84 DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n", dig_T1, dig_T2, dig_T3);
knaresh89 0:a8bfd25ff975 85 DEBUG_PRINT("dig_T = %d, %d, %d\n", dig_T1, dig_T2, dig_T3);
knaresh89 0:a8bfd25ff975 86
knaresh89 0:a8bfd25ff975 87 _cs = 0;
knaresh89 0:a8bfd25ff975 88 _spi.write(0x8e); // read dig_P regs
knaresh89 0:a8bfd25ff975 89 for(int i = 0; i < 18; i++)
knaresh89 0:a8bfd25ff975 90 cmd[i] = _spi.write(0);
knaresh89 0:a8bfd25ff975 91 _cs = 1;
knaresh89 0:a8bfd25ff975 92
knaresh89 0:a8bfd25ff975 93 dig_P1 = (cmd[ 1] << 8) | cmd[ 0];
knaresh89 0:a8bfd25ff975 94 dig_P2 = (cmd[ 3] << 8) | cmd[ 2];
knaresh89 0:a8bfd25ff975 95 dig_P3 = (cmd[ 5] << 8) | cmd[ 4];
knaresh89 0:a8bfd25ff975 96 dig_P4 = (cmd[ 7] << 8) | cmd[ 6];
knaresh89 0:a8bfd25ff975 97 dig_P5 = (cmd[ 9] << 8) | cmd[ 8];
knaresh89 0:a8bfd25ff975 98 dig_P6 = (cmd[11] << 8) | cmd[10];
knaresh89 0:a8bfd25ff975 99 dig_P7 = (cmd[13] << 8) | cmd[12];
knaresh89 0:a8bfd25ff975 100 dig_P8 = (cmd[15] << 8) | cmd[14];
knaresh89 0:a8bfd25ff975 101 dig_P9 = (cmd[17] << 8) | cmd[16];
knaresh89 0:a8bfd25ff975 102
knaresh89 0:a8bfd25ff975 103 DEBUG_PRINT("dig_P = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9);
knaresh89 0:a8bfd25ff975 104 DEBUG_PRINT("dig_P = %d, %d, %d, %d, %d, %d, %d, %d, %d\n", dig_P1, dig_P2, dig_P3, dig_P4, dig_P5, dig_P6, dig_P7, dig_P8, dig_P9);
knaresh89 0:a8bfd25ff975 105
knaresh89 0:a8bfd25ff975 106 _cs = 0;
knaresh89 0:a8bfd25ff975 107 _spi.write(0xA1); // read dig_H1 reg
knaresh89 0:a8bfd25ff975 108 cmd[0] = _spi.write(0);
knaresh89 0:a8bfd25ff975 109 _cs = 1;
knaresh89 0:a8bfd25ff975 110
knaresh89 0:a8bfd25ff975 111 _cs = 0;
knaresh89 0:a8bfd25ff975 112 _spi.write(0xE1); // read dig_H regs
knaresh89 0:a8bfd25ff975 113 for(int i = 0; i < 7; i++)
knaresh89 0:a8bfd25ff975 114 cmd[1+i] = _spi.write(0);
knaresh89 0:a8bfd25ff975 115 _cs = 1;
knaresh89 0:a8bfd25ff975 116
knaresh89 0:a8bfd25ff975 117 dig_H1 = cmd[0];
knaresh89 0:a8bfd25ff975 118 dig_H2 = (cmd[2] << 8) | cmd[1];
knaresh89 0:a8bfd25ff975 119 dig_H3 = cmd[3];
knaresh89 0:a8bfd25ff975 120 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f);
knaresh89 0:a8bfd25ff975 121 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f);
knaresh89 0:a8bfd25ff975 122 dig_H6 = cmd[7];
knaresh89 0:a8bfd25ff975 123
knaresh89 0:a8bfd25ff975 124 DEBUG_PRINT("dig_H = 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", dig_H1, dig_H2, dig_H3, dig_H4, dig_H5, dig_H6);
knaresh89 0:a8bfd25ff975 125 DEBUG_PRINT("dig_H = %d, %d, %d, %d, %d, %d\n", dig_H1, dig_H2, dig_H3, dig_H4, dig_H5, dig_H6);
knaresh89 0:a8bfd25ff975 126 }
knaresh89 0:a8bfd25ff975 127
knaresh89 0:a8bfd25ff975 128 float BME280_SPI::getTemperature()
knaresh89 0:a8bfd25ff975 129 {
knaresh89 0:a8bfd25ff975 130 uint32_t temp_raw;
knaresh89 0:a8bfd25ff975 131 float tempf;
knaresh89 0:a8bfd25ff975 132 char cmd[3];
knaresh89 0:a8bfd25ff975 133
knaresh89 0:a8bfd25ff975 134 _cs = 0;
knaresh89 0:a8bfd25ff975 135 _spi.write(0xfa);
knaresh89 0:a8bfd25ff975 136 for(int i = 0; i < 3; i++)
knaresh89 0:a8bfd25ff975 137 cmd[i] = _spi.write(0);
knaresh89 0:a8bfd25ff975 138 _cs = 1;
knaresh89 0:a8bfd25ff975 139
knaresh89 0:a8bfd25ff975 140 temp_raw = (cmd[0] << 12) | (cmd[1] << 4) | (cmd[2] >> 4);
knaresh89 0:a8bfd25ff975 141
knaresh89 0:a8bfd25ff975 142 int32_t temp;
knaresh89 0:a8bfd25ff975 143
knaresh89 0:a8bfd25ff975 144 temp =
knaresh89 0:a8bfd25ff975 145 (((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11) +
knaresh89 0:a8bfd25ff975 146 ((((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14);
knaresh89 0:a8bfd25ff975 147
knaresh89 0:a8bfd25ff975 148 t_fine = temp;
knaresh89 0:a8bfd25ff975 149 temp = (temp * 5 + 128) >> 8;
knaresh89 0:a8bfd25ff975 150 SEGGER_RTT_printf(0, "temp is %d", temp/100);
knaresh89 0:a8bfd25ff975 151 tempf = (float)temp;
knaresh89 0:a8bfd25ff975 152
knaresh89 0:a8bfd25ff975 153 return (tempf/100.0f);
knaresh89 0:a8bfd25ff975 154 }
knaresh89 0:a8bfd25ff975 155
knaresh89 0:a8bfd25ff975 156 float BME280_SPI::getPressure()
knaresh89 0:a8bfd25ff975 157 {
knaresh89 0:a8bfd25ff975 158 uint32_t press_raw;
knaresh89 0:a8bfd25ff975 159 float pressf;
knaresh89 0:a8bfd25ff975 160 char cmd[3];
knaresh89 0:a8bfd25ff975 161
knaresh89 0:a8bfd25ff975 162 _cs = 0;
knaresh89 0:a8bfd25ff975 163 _spi.write(0xf7); // press_msb
knaresh89 0:a8bfd25ff975 164 for(int i = 0; i < 3; i++)
knaresh89 0:a8bfd25ff975 165 cmd[i] = _spi.write(0);
knaresh89 0:a8bfd25ff975 166 _cs = 1;
knaresh89 0:a8bfd25ff975 167
knaresh89 0:a8bfd25ff975 168 press_raw = (cmd[0] << 12) | (cmd[1] << 4) | (cmd[2] >> 4);
knaresh89 0:a8bfd25ff975 169
knaresh89 0:a8bfd25ff975 170 int32_t var1, var2;
knaresh89 0:a8bfd25ff975 171 uint32_t press;
knaresh89 0:a8bfd25ff975 172
knaresh89 0:a8bfd25ff975 173 var1 = (t_fine >> 1) - 64000;
knaresh89 0:a8bfd25ff975 174 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6;
knaresh89 0:a8bfd25ff975 175 var2 = var2 + ((var1 * dig_P5) << 1);
knaresh89 0:a8bfd25ff975 176 var2 = (var2 >> 2) + (dig_P4 << 16);
knaresh89 0:a8bfd25ff975 177 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18;
knaresh89 0:a8bfd25ff975 178 var1 = ((32768 + var1) * dig_P1) >> 15;
knaresh89 0:a8bfd25ff975 179 if (var1 == 0) {
knaresh89 0:a8bfd25ff975 180 return 0;
knaresh89 0:a8bfd25ff975 181 }
knaresh89 0:a8bfd25ff975 182 press = (((1048576 - press_raw) - (var2 >> 12))) * 3125;
knaresh89 0:a8bfd25ff975 183 if(press < 0x80000000) {
knaresh89 0:a8bfd25ff975 184 press = (press << 1) / var1;
knaresh89 0:a8bfd25ff975 185 } else {
knaresh89 0:a8bfd25ff975 186 press = (press / var1) * 2;
knaresh89 0:a8bfd25ff975 187 }
knaresh89 0:a8bfd25ff975 188 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12;
knaresh89 0:a8bfd25ff975 189 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13;
knaresh89 0:a8bfd25ff975 190 press = (press + ((var1 + var2 + dig_P7) >> 4));
knaresh89 0:a8bfd25ff975 191 SEGGER_RTT_printf(0, "pressure is %d", press/100);
knaresh89 0:a8bfd25ff975 192
knaresh89 0:a8bfd25ff975 193 pressf = (float)press;
knaresh89 0:a8bfd25ff975 194 return (pressf/100.0f);
knaresh89 0:a8bfd25ff975 195 }
knaresh89 0:a8bfd25ff975 196
knaresh89 0:a8bfd25ff975 197 float BME280_SPI::getHumidity()
knaresh89 0:a8bfd25ff975 198 {
knaresh89 0:a8bfd25ff975 199 uint32_t hum_raw;
knaresh89 0:a8bfd25ff975 200 float humf;
knaresh89 0:a8bfd25ff975 201 char cmd[2];
knaresh89 0:a8bfd25ff975 202
knaresh89 0:a8bfd25ff975 203 _cs = 0;
knaresh89 0:a8bfd25ff975 204 _spi.write(0xfd); // hum_msb
knaresh89 0:a8bfd25ff975 205 for(int i = 0; i < 2; i++)
knaresh89 0:a8bfd25ff975 206 cmd[i] = _spi.write(0);
knaresh89 0:a8bfd25ff975 207 _cs = 1;
knaresh89 0:a8bfd25ff975 208
knaresh89 0:a8bfd25ff975 209 hum_raw = (cmd[0] << 8) | cmd[1];
knaresh89 0:a8bfd25ff975 210
knaresh89 0:a8bfd25ff975 211 int32_t v_x1;
knaresh89 0:a8bfd25ff975 212
knaresh89 0:a8bfd25ff975 213 v_x1 = t_fine - 76800;
knaresh89 0:a8bfd25ff975 214 v_x1 = (((((hum_raw << 14) -(((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * v_x1)) +
knaresh89 0:a8bfd25ff975 215 ((int32_t)16384)) >> 15) * (((((((v_x1 * (int32_t)dig_H6) >> 10) *
knaresh89 0:a8bfd25ff975 216 (((v_x1 * ((int32_t)dig_H3)) >> 11) + 32768)) >> 10) + 2097152) *
knaresh89 0:a8bfd25ff975 217 (int32_t)dig_H2 + 8192) >> 14));
knaresh89 0:a8bfd25ff975 218 v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * (int32_t)dig_H1) >> 4));
knaresh89 0:a8bfd25ff975 219 v_x1 = (v_x1 < 0 ? 0 : v_x1);
knaresh89 0:a8bfd25ff975 220 v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
knaresh89 0:a8bfd25ff975 221 SEGGER_RTT_printf(0, "humidity is %d", (v_x1 >> 12)/1024);
knaresh89 0:a8bfd25ff975 222
knaresh89 0:a8bfd25ff975 223 humf = (float)(v_x1 >> 12);
knaresh89 0:a8bfd25ff975 224
knaresh89 0:a8bfd25ff975 225 return (humf/1024.0f);
knaresh89 0:a8bfd25ff975 226 }