Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed_droptest by
Barometer.cpp@4:62aec4ae9f67, 2016-08-01 (annotated)
- Committer:
- skyyoungsik
- Date:
- Mon Aug 01 09:29:24 2016 +0000
- Revision:
- 4:62aec4ae9f67
- Parent:
- 0:6ac6b2d2bf1a
resistry
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Soyoon | 0:6ac6b2d2bf1a | 1 | #include "mbed.h" |
Soyoon | 0:6ac6b2d2bf1a | 2 | #include "Barometer.h" |
Soyoon | 0:6ac6b2d2bf1a | 3 | |
Soyoon | 0:6ac6b2d2bf1a | 4 | #define WEATHER_Barometer 0xee |
Soyoon | 0:6ac6b2d2bf1a | 5 | #define xpow(x, y) ((long)1 << y) |
Soyoon | 0:6ac6b2d2bf1a | 6 | |
Soyoon | 0:6ac6b2d2bf1a | 7 | |
Soyoon | 0:6ac6b2d2bf1a | 8 | Barometer::Barometer (PinName p_sda, PinName p_scl, Barometer_oss p_oss) : i2c(p_sda, p_scl) { |
Soyoon | 0:6ac6b2d2bf1a | 9 | init(p_oss); |
Soyoon | 0:6ac6b2d2bf1a | 10 | } |
Soyoon | 0:6ac6b2d2bf1a | 11 | |
Soyoon | 0:6ac6b2d2bf1a | 12 | Barometer::Barometer (I2C& p_i2c, Barometer_oss p_oss) : i2c(p_i2c) { |
Soyoon | 0:6ac6b2d2bf1a | 13 | init(p_oss); |
Soyoon | 0:6ac6b2d2bf1a | 14 | } |
Soyoon | 0:6ac6b2d2bf1a | 15 | |
Soyoon | 0:6ac6b2d2bf1a | 16 | |
Soyoon | 0:6ac6b2d2bf1a | 17 | float Barometer::get_temperature() { |
Soyoon | 0:6ac6b2d2bf1a | 18 | return temperature; |
Soyoon | 0:6ac6b2d2bf1a | 19 | } |
Soyoon | 0:6ac6b2d2bf1a | 20 | |
Soyoon | 0:6ac6b2d2bf1a | 21 | float Barometer::get_pressure() { |
Soyoon | 0:6ac6b2d2bf1a | 22 | return pressure; |
Soyoon | 0:6ac6b2d2bf1a | 23 | } |
Soyoon | 0:6ac6b2d2bf1a | 24 | |
Soyoon | 0:6ac6b2d2bf1a | 25 | float Barometer::get_altitude_m() { |
Soyoon | 0:6ac6b2d2bf1a | 26 | altitude = 44330*(1-pow((pressure/1013.25),(0.190295))); |
Soyoon | 0:6ac6b2d2bf1a | 27 | return altitude; |
Soyoon | 0:6ac6b2d2bf1a | 28 | } |
Soyoon | 0:6ac6b2d2bf1a | 29 | |
Soyoon | 0:6ac6b2d2bf1a | 30 | void Barometer::update () { |
Soyoon | 0:6ac6b2d2bf1a | 31 | long t, p, ut, up, x1, x2, x3, b3, b5, b6; |
Soyoon | 0:6ac6b2d2bf1a | 32 | unsigned long b4, b7; |
Soyoon | 0:6ac6b2d2bf1a | 33 | |
Soyoon | 0:6ac6b2d2bf1a | 34 | twi_writechar(WEATHER_Barometer, 0xf4, 0x2e); |
Soyoon | 0:6ac6b2d2bf1a | 35 | wait(0.01); |
Soyoon | 0:6ac6b2d2bf1a | 36 | ut = twi_readshort(WEATHER_Barometer, 0xf6); |
Soyoon | 0:6ac6b2d2bf1a | 37 | |
Soyoon | 0:6ac6b2d2bf1a | 38 | twi_writechar(WEATHER_Barometer, 0xf4, 0x34 | (oss << 6)); |
Soyoon | 0:6ac6b2d2bf1a | 39 | wait(0.05); |
Soyoon | 0:6ac6b2d2bf1a | 40 | up = twi_readlong(WEATHER_Barometer, 0xf6) >> (8 - oss); |
Soyoon | 0:6ac6b2d2bf1a | 41 | |
Soyoon | 0:6ac6b2d2bf1a | 42 | x1 = (ut - ac6) * ac5 / xpow(2, 15); |
Soyoon | 0:6ac6b2d2bf1a | 43 | x2 = (long)mc * xpow(2, 11) / (x1 + md); |
Soyoon | 0:6ac6b2d2bf1a | 44 | b5 = x1 + x2; |
Soyoon | 0:6ac6b2d2bf1a | 45 | t = (b5 + 8) / xpow(2, 4); |
Soyoon | 0:6ac6b2d2bf1a | 46 | temperature = (float)t / 10.0; |
Soyoon | 0:6ac6b2d2bf1a | 47 | |
Soyoon | 0:6ac6b2d2bf1a | 48 | b6 = b5 - 4000; |
Soyoon | 0:6ac6b2d2bf1a | 49 | x1 = (b2 * (b6 * b6 / xpow(2, 12))) / xpow(2, 11); |
Soyoon | 0:6ac6b2d2bf1a | 50 | x2 = ac2 * b6 / xpow(2, 11); |
Soyoon | 0:6ac6b2d2bf1a | 51 | x3 = x1 + x2; |
Soyoon | 0:6ac6b2d2bf1a | 52 | b3 = ((((unsigned long)ac1 * 4 + x3) << oss) + 2) / 4; |
Soyoon | 0:6ac6b2d2bf1a | 53 | x1 = ac3 * b6 / xpow(2, 13); |
Soyoon | 0:6ac6b2d2bf1a | 54 | x2 = (b1 * (b6 * b6 / xpow(2, 12))) / xpow(2, 16); |
Soyoon | 0:6ac6b2d2bf1a | 55 | x3 = ((x1 + x2) + 2) / xpow(2, 2); |
Soyoon | 0:6ac6b2d2bf1a | 56 | b4 = ac4 * (unsigned long)(x3 + 32768) / xpow(2, 15); |
Soyoon | 0:6ac6b2d2bf1a | 57 | b7 = ((unsigned long)up - b3) * (50000 >> oss); |
Soyoon | 0:6ac6b2d2bf1a | 58 | if (b7 < (unsigned long)0x80000000) { |
Soyoon | 0:6ac6b2d2bf1a | 59 | p = (b7 * 2) / b4; |
Soyoon | 0:6ac6b2d2bf1a | 60 | } else { |
Soyoon | 0:6ac6b2d2bf1a | 61 | p = (b7 / b4) * 2; |
Soyoon | 0:6ac6b2d2bf1a | 62 | } |
Soyoon | 0:6ac6b2d2bf1a | 63 | x1 = (p / xpow(2, 8)) * (p / xpow(2, 8)); |
Soyoon | 0:6ac6b2d2bf1a | 64 | x1 = (x1 * 3038) / xpow(2, 16); |
Soyoon | 0:6ac6b2d2bf1a | 65 | x2 = (-7357 * p) / xpow(2, 16); |
Soyoon | 0:6ac6b2d2bf1a | 66 | p = p + (x1 + x2 + 3791) / xpow(2, 4); |
Soyoon | 0:6ac6b2d2bf1a | 67 | pressure = (float)p / 100.0; |
Soyoon | 0:6ac6b2d2bf1a | 68 | } |
Soyoon | 0:6ac6b2d2bf1a | 69 | |
Soyoon | 0:6ac6b2d2bf1a | 70 | void Barometer::init (Barometer_oss p_oss) { |
Soyoon | 0:6ac6b2d2bf1a | 71 | ac1 = twi_readshort(WEATHER_Barometer, 0xaa); |
Soyoon | 0:6ac6b2d2bf1a | 72 | ac2 = twi_readshort(WEATHER_Barometer, 0xac); |
Soyoon | 0:6ac6b2d2bf1a | 73 | ac3 = twi_readshort(WEATHER_Barometer, 0xae); |
Soyoon | 0:6ac6b2d2bf1a | 74 | ac4 = twi_readshort(WEATHER_Barometer, 0xb0); |
Soyoon | 0:6ac6b2d2bf1a | 75 | ac5 = twi_readshort(WEATHER_Barometer, 0xb2); |
Soyoon | 0:6ac6b2d2bf1a | 76 | ac6 = twi_readshort(WEATHER_Barometer, 0xb4); |
Soyoon | 0:6ac6b2d2bf1a | 77 | b1 = twi_readshort(WEATHER_Barometer, 0xb6); |
Soyoon | 0:6ac6b2d2bf1a | 78 | b2 = twi_readshort(WEATHER_Barometer, 0xb8); |
Soyoon | 0:6ac6b2d2bf1a | 79 | mb = twi_readshort(WEATHER_Barometer, 0xba); |
Soyoon | 0:6ac6b2d2bf1a | 80 | mc = twi_readshort(WEATHER_Barometer, 0xbc); |
Soyoon | 0:6ac6b2d2bf1a | 81 | md = twi_readshort(WEATHER_Barometer, 0xbe); |
Soyoon | 0:6ac6b2d2bf1a | 82 | oss = p_oss; |
Soyoon | 0:6ac6b2d2bf1a | 83 | } |
Soyoon | 0:6ac6b2d2bf1a | 84 | |
Soyoon | 0:6ac6b2d2bf1a | 85 | unsigned short Barometer::twi_readshort (int id, int addr) { |
Soyoon | 0:6ac6b2d2bf1a | 86 | unsigned short i; |
Soyoon | 0:6ac6b2d2bf1a | 87 | |
Soyoon | 0:6ac6b2d2bf1a | 88 | i2c.start(); |
Soyoon | 0:6ac6b2d2bf1a | 89 | i2c.write(id); |
Soyoon | 0:6ac6b2d2bf1a | 90 | i2c.write(addr); |
Soyoon | 0:6ac6b2d2bf1a | 91 | |
Soyoon | 0:6ac6b2d2bf1a | 92 | i2c.start(); |
Soyoon | 0:6ac6b2d2bf1a | 93 | i2c.write(id | 1); |
Soyoon | 0:6ac6b2d2bf1a | 94 | i = i2c.read(1) << 8; |
Soyoon | 0:6ac6b2d2bf1a | 95 | i |= i2c.read(0); |
Soyoon | 0:6ac6b2d2bf1a | 96 | i2c.stop(); |
Soyoon | 0:6ac6b2d2bf1a | 97 | |
Soyoon | 0:6ac6b2d2bf1a | 98 | return i; |
Soyoon | 0:6ac6b2d2bf1a | 99 | } |
Soyoon | 0:6ac6b2d2bf1a | 100 | |
Soyoon | 0:6ac6b2d2bf1a | 101 | unsigned long Barometer::twi_readlong (int id, int addr) { |
Soyoon | 0:6ac6b2d2bf1a | 102 | unsigned long i; |
Soyoon | 0:6ac6b2d2bf1a | 103 | |
Soyoon | 0:6ac6b2d2bf1a | 104 | i2c.start(); |
Soyoon | 0:6ac6b2d2bf1a | 105 | i2c.write(id); |
Soyoon | 0:6ac6b2d2bf1a | 106 | i2c.write(addr); |
Soyoon | 0:6ac6b2d2bf1a | 107 | |
Soyoon | 0:6ac6b2d2bf1a | 108 | i2c.start(); |
Soyoon | 0:6ac6b2d2bf1a | 109 | i2c.write(id | 1); |
Soyoon | 0:6ac6b2d2bf1a | 110 | i = i2c.read(1) << 16; |
Soyoon | 0:6ac6b2d2bf1a | 111 | i |= i2c.read(1) << 8; |
Soyoon | 0:6ac6b2d2bf1a | 112 | i |= i2c.read(0); |
Soyoon | 0:6ac6b2d2bf1a | 113 | i2c.stop(); |
Soyoon | 0:6ac6b2d2bf1a | 114 | |
Soyoon | 0:6ac6b2d2bf1a | 115 | return i; |
Soyoon | 0:6ac6b2d2bf1a | 116 | } |
Soyoon | 0:6ac6b2d2bf1a | 117 | |
Soyoon | 0:6ac6b2d2bf1a | 118 | void Barometer::twi_writechar (int id, int addr, int dat) { |
Soyoon | 0:6ac6b2d2bf1a | 119 | |
Soyoon | 0:6ac6b2d2bf1a | 120 | i2c.start(); |
Soyoon | 0:6ac6b2d2bf1a | 121 | i2c.write(id); |
Soyoon | 0:6ac6b2d2bf1a | 122 | i2c.write(addr); |
Soyoon | 0:6ac6b2d2bf1a | 123 | i2c.write(dat); |
Soyoon | 0:6ac6b2d2bf1a | 124 | i2c.stop(); |
Soyoon | 0:6ac6b2d2bf1a | 125 | } |