for LED Matrix 5piece

Dependencies:   mbed

Committer:
takeuchi
Date:
Tue Jul 26 06:28:53 2016 +0000
Revision:
0:6228559177f8
LED Mtrix 5 mai

Who changed what in which revision?

UserRevisionLine numberNew contents of line
takeuchi 0:6228559177f8 1 /**
takeuchi 0:6228559177f8 2 * BME280 Combined humidity and pressure sensor library
takeuchi 0:6228559177f8 3 *
takeuchi 0:6228559177f8 4 * @author Toyomasa Watarai
takeuchi 0:6228559177f8 5 * @version 1.0
takeuchi 0:6228559177f8 6 * @date 06-April-2015
takeuchi 0:6228559177f8 7 *
takeuchi 0:6228559177f8 8 * Library for "BME280 temperature, humidity and pressure sensor module" from Switch Science
takeuchi 0:6228559177f8 9 * https://www.switch-science.com/catalog/2236/
takeuchi 0:6228559177f8 10 *
takeuchi 0:6228559177f8 11 * For more information about the BME280:
takeuchi 0:6228559177f8 12 * http://ae-bst.resource.bosch.com/media/products/dokumente/bme280/BST-BME280_DS001-10.pdf
takeuchi 0:6228559177f8 13 */
takeuchi 0:6228559177f8 14
takeuchi 0:6228559177f8 15 #include "mbed.h"
takeuchi 0:6228559177f8 16 #include "BME280.h"
takeuchi 0:6228559177f8 17
takeuchi 0:6228559177f8 18 BME280::BME280(PinName sda, PinName scl, char slave_adr)
takeuchi 0:6228559177f8 19 :
takeuchi 0:6228559177f8 20 i2c_p(new I2C(sda, scl)),
takeuchi 0:6228559177f8 21 i2c(*i2c_p),
takeuchi 0:6228559177f8 22 address(slave_adr),
takeuchi 0:6228559177f8 23 t_fine(0)
takeuchi 0:6228559177f8 24 {
takeuchi 0:6228559177f8 25 initialize();
takeuchi 0:6228559177f8 26 }
takeuchi 0:6228559177f8 27
takeuchi 0:6228559177f8 28 BME280::BME280(I2C &i2c_obj, char slave_adr)
takeuchi 0:6228559177f8 29 :
takeuchi 0:6228559177f8 30 i2c_p(NULL),
takeuchi 0:6228559177f8 31 i2c(i2c_obj),
takeuchi 0:6228559177f8 32 address(slave_adr),
takeuchi 0:6228559177f8 33 t_fine(0)
takeuchi 0:6228559177f8 34 {
takeuchi 0:6228559177f8 35 initialize();
takeuchi 0:6228559177f8 36 }
takeuchi 0:6228559177f8 37
takeuchi 0:6228559177f8 38 BME280::~BME280()
takeuchi 0:6228559177f8 39 {
takeuchi 0:6228559177f8 40 if (NULL != i2c_p)
takeuchi 0:6228559177f8 41 delete i2c_p;
takeuchi 0:6228559177f8 42 }
takeuchi 0:6228559177f8 43
takeuchi 0:6228559177f8 44 void BME280::initialize()
takeuchi 0:6228559177f8 45 {
takeuchi 0:6228559177f8 46 char cmd[18];
takeuchi 0:6228559177f8 47
takeuchi 0:6228559177f8 48 cmd[0] = 0xf2; // ctrl_hum
takeuchi 0:6228559177f8 49 cmd[1] = 0x01; // Humidity oversampling x1
takeuchi 0:6228559177f8 50 i2c.write(address, cmd, 2);
takeuchi 0:6228559177f8 51
takeuchi 0:6228559177f8 52 cmd[0] = 0xf4; // ctrl_meas
takeuchi 0:6228559177f8 53 cmd[1] = 0x27; // Temparature oversampling x1, Pressure oversampling x1, Normal mode
takeuchi 0:6228559177f8 54 i2c.write(address, cmd, 2);
takeuchi 0:6228559177f8 55
takeuchi 0:6228559177f8 56 cmd[0] = 0xf5; // config
takeuchi 0:6228559177f8 57 cmd[1] = 0xa0; // Standby 1000ms, Filter off
takeuchi 0:6228559177f8 58 i2c.write(address, cmd, 2);
takeuchi 0:6228559177f8 59
takeuchi 0:6228559177f8 60 cmd[0] = 0x88; // read dig_T regs
takeuchi 0:6228559177f8 61 i2c.write(address, cmd, 1);
takeuchi 0:6228559177f8 62 i2c.read(address, cmd, 6);
takeuchi 0:6228559177f8 63
takeuchi 0:6228559177f8 64 dig_T1 = (cmd[1] << 8) | cmd[0];
takeuchi 0:6228559177f8 65 dig_T2 = (cmd[3] << 8) | cmd[2];
takeuchi 0:6228559177f8 66 dig_T3 = (cmd[5] << 8) | cmd[4];
takeuchi 0:6228559177f8 67
takeuchi 0:6228559177f8 68 DEBUG_PRINT("dig_T = 0x%x, 0x%x, 0x%x\n", dig_T1, dig_T2, dig_T3);
takeuchi 0:6228559177f8 69
takeuchi 0:6228559177f8 70 cmd[0] = 0x8E; // read dig_P regs
takeuchi 0:6228559177f8 71 i2c.write(address, cmd, 1);
takeuchi 0:6228559177f8 72 i2c.read(address, cmd, 18);
takeuchi 0:6228559177f8 73
takeuchi 0:6228559177f8 74 dig_P1 = (cmd[ 1] << 8) | cmd[ 0];
takeuchi 0:6228559177f8 75 dig_P2 = (cmd[ 3] << 8) | cmd[ 2];
takeuchi 0:6228559177f8 76 dig_P3 = (cmd[ 5] << 8) | cmd[ 4];
takeuchi 0:6228559177f8 77 dig_P4 = (cmd[ 7] << 8) | cmd[ 6];
takeuchi 0:6228559177f8 78 dig_P5 = (cmd[ 9] << 8) | cmd[ 8];
takeuchi 0:6228559177f8 79 dig_P6 = (cmd[11] << 8) | cmd[10];
takeuchi 0:6228559177f8 80 dig_P7 = (cmd[13] << 8) | cmd[12];
takeuchi 0:6228559177f8 81 dig_P8 = (cmd[15] << 8) | cmd[14];
takeuchi 0:6228559177f8 82 dig_P9 = (cmd[17] << 8) | cmd[16];
takeuchi 0:6228559177f8 83
takeuchi 0:6228559177f8 84 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);
takeuchi 0:6228559177f8 85
takeuchi 0:6228559177f8 86 cmd[0] = 0xA1; // read dig_H regs
takeuchi 0:6228559177f8 87 i2c.write(address, cmd, 1);
takeuchi 0:6228559177f8 88 i2c.read(address, cmd, 1);
takeuchi 0:6228559177f8 89 cmd[1] = 0xE1; // read dig_H regs
takeuchi 0:6228559177f8 90 i2c.write(address, &cmd[1], 1);
takeuchi 0:6228559177f8 91 i2c.read(address, &cmd[1], 7);
takeuchi 0:6228559177f8 92
takeuchi 0:6228559177f8 93 dig_H1 = cmd[0];
takeuchi 0:6228559177f8 94 dig_H2 = (cmd[2] << 8) | cmd[1];
takeuchi 0:6228559177f8 95 dig_H3 = cmd[3];
takeuchi 0:6228559177f8 96 dig_H4 = (cmd[4] << 4) | (cmd[5] & 0x0f);
takeuchi 0:6228559177f8 97 dig_H5 = (cmd[6] << 4) | ((cmd[5]>>4) & 0x0f);
takeuchi 0:6228559177f8 98 dig_H6 = cmd[7];
takeuchi 0:6228559177f8 99
takeuchi 0:6228559177f8 100 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);
takeuchi 0:6228559177f8 101 }
takeuchi 0:6228559177f8 102
takeuchi 0:6228559177f8 103 float BME280::getTemperature()
takeuchi 0:6228559177f8 104 {
takeuchi 0:6228559177f8 105 uint32_t temp_raw;
takeuchi 0:6228559177f8 106 float tempf;
takeuchi 0:6228559177f8 107 char cmd[4];
takeuchi 0:6228559177f8 108
takeuchi 0:6228559177f8 109 cmd[0] = 0xfa; // temp_msb
takeuchi 0:6228559177f8 110 i2c.write(address, cmd, 1);
takeuchi 0:6228559177f8 111 i2c.read(address, &cmd[1], 3);
takeuchi 0:6228559177f8 112
takeuchi 0:6228559177f8 113 temp_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
takeuchi 0:6228559177f8 114
takeuchi 0:6228559177f8 115 int32_t temp;
takeuchi 0:6228559177f8 116
takeuchi 0:6228559177f8 117 temp =
takeuchi 0:6228559177f8 118 (((((temp_raw >> 3) - (dig_T1 << 1))) * dig_T2) >> 11) +
takeuchi 0:6228559177f8 119 ((((((temp_raw >> 4) - dig_T1) * ((temp_raw >> 4) - dig_T1)) >> 12) * dig_T3) >> 14);
takeuchi 0:6228559177f8 120
takeuchi 0:6228559177f8 121 t_fine = temp;
takeuchi 0:6228559177f8 122 temp = (temp * 5 + 128) >> 8;
takeuchi 0:6228559177f8 123 tempf = (float)temp;
takeuchi 0:6228559177f8 124
takeuchi 0:6228559177f8 125 return (tempf/100.0f);
takeuchi 0:6228559177f8 126 }
takeuchi 0:6228559177f8 127
takeuchi 0:6228559177f8 128 float BME280::getPressure()
takeuchi 0:6228559177f8 129 {
takeuchi 0:6228559177f8 130 uint32_t press_raw;
takeuchi 0:6228559177f8 131 float pressf;
takeuchi 0:6228559177f8 132 char cmd[4];
takeuchi 0:6228559177f8 133
takeuchi 0:6228559177f8 134 cmd[0] = 0xf7; // press_msb
takeuchi 0:6228559177f8 135 i2c.write(address, cmd, 1);
takeuchi 0:6228559177f8 136 i2c.read(address, &cmd[1], 3);
takeuchi 0:6228559177f8 137
takeuchi 0:6228559177f8 138 press_raw = (cmd[1] << 12) | (cmd[2] << 4) | (cmd[3] >> 4);
takeuchi 0:6228559177f8 139
takeuchi 0:6228559177f8 140 int32_t var1, var2;
takeuchi 0:6228559177f8 141 uint32_t press;
takeuchi 0:6228559177f8 142
takeuchi 0:6228559177f8 143 var1 = (t_fine >> 1) - 64000;
takeuchi 0:6228559177f8 144 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * dig_P6;
takeuchi 0:6228559177f8 145 var2 = var2 + ((var1 * dig_P5) << 1);
takeuchi 0:6228559177f8 146 var2 = (var2 >> 2) + (dig_P4 << 16);
takeuchi 0:6228559177f8 147 var1 = (((dig_P3 * (((var1 >> 2)*(var1 >> 2)) >> 13)) >> 3) + ((dig_P2 * var1) >> 1)) >> 18;
takeuchi 0:6228559177f8 148 var1 = ((32768 + var1) * dig_P1) >> 15;
takeuchi 0:6228559177f8 149 if (var1 == 0) {
takeuchi 0:6228559177f8 150 return 0;
takeuchi 0:6228559177f8 151 }
takeuchi 0:6228559177f8 152 press = (((1048576 - press_raw) - (var2 >> 12))) * 3125;
takeuchi 0:6228559177f8 153 if(press < 0x80000000) {
takeuchi 0:6228559177f8 154 press = (press << 1) / var1;
takeuchi 0:6228559177f8 155 } else {
takeuchi 0:6228559177f8 156 press = (press / var1) * 2;
takeuchi 0:6228559177f8 157 }
takeuchi 0:6228559177f8 158 var1 = ((int32_t)dig_P9 * ((int32_t)(((press >> 3) * (press >> 3)) >> 13))) >> 12;
takeuchi 0:6228559177f8 159 var2 = (((int32_t)(press >> 2)) * (int32_t)dig_P8) >> 13;
takeuchi 0:6228559177f8 160 press = (press + ((var1 + var2 + dig_P7) >> 4));
takeuchi 0:6228559177f8 161
takeuchi 0:6228559177f8 162 pressf = (float)press;
takeuchi 0:6228559177f8 163 return (pressf/100.0f);
takeuchi 0:6228559177f8 164 }
takeuchi 0:6228559177f8 165
takeuchi 0:6228559177f8 166 float BME280::getHumidity()
takeuchi 0:6228559177f8 167 {
takeuchi 0:6228559177f8 168 uint32_t hum_raw;
takeuchi 0:6228559177f8 169 float humf;
takeuchi 0:6228559177f8 170 char cmd[4];
takeuchi 0:6228559177f8 171
takeuchi 0:6228559177f8 172 cmd[0] = 0xfd; // hum_msb
takeuchi 0:6228559177f8 173 i2c.write(address, cmd, 1);
takeuchi 0:6228559177f8 174 i2c.read(address, &cmd[1], 2);
takeuchi 0:6228559177f8 175
takeuchi 0:6228559177f8 176 hum_raw = (cmd[1] << 8) | cmd[2];
takeuchi 0:6228559177f8 177
takeuchi 0:6228559177f8 178 int32_t v_x1;
takeuchi 0:6228559177f8 179
takeuchi 0:6228559177f8 180 v_x1 = t_fine - 76800;
takeuchi 0:6228559177f8 181 v_x1 = (((((hum_raw << 14) -(((int32_t)dig_H4) << 20) - (((int32_t)dig_H5) * v_x1)) +
takeuchi 0:6228559177f8 182 ((int32_t)16384)) >> 15) * (((((((v_x1 * (int32_t)dig_H6) >> 10) *
takeuchi 0:6228559177f8 183 (((v_x1 * ((int32_t)dig_H3)) >> 11) + 32768)) >> 10) + 2097152) *
takeuchi 0:6228559177f8 184 (int32_t)dig_H2 + 8192) >> 14));
takeuchi 0:6228559177f8 185 v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * (int32_t)dig_H1) >> 4));
takeuchi 0:6228559177f8 186 v_x1 = (v_x1 < 0 ? 0 : v_x1);
takeuchi 0:6228559177f8 187 v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
takeuchi 0:6228559177f8 188
takeuchi 0:6228559177f8 189 humf = (float)(v_x1 >> 12);
takeuchi 0:6228559177f8 190
takeuchi 0:6228559177f8 191 return (humf/1024.0f);
takeuchi 0:6228559177f8 192 }