Barometer for EA LPC11U35 QuickStart Board see: https://mbed.org/users/okini3939/notebook/barometer/
Dependencies: BMP085 PCF2119 WDT mbed
main.cpp@0:ac9cb7d35d0c, 2014-07-11 (annotated)
- Committer:
- okini3939
- Date:
- Fri Jul 11 00:56:46 2014 +0000
- Revision:
- 0:ac9cb7d35d0c
1st build
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:ac9cb7d35d0c | 1 | /* |
okini3939 | 0:ac9cb7d35d0c | 2 | * Barometer for EA LPC11U35 QuickStart Board |
okini3939 | 0:ac9cb7d35d0c | 3 | */ |
okini3939 | 0:ac9cb7d35d0c | 4 | #include "mbed.h" |
okini3939 | 0:ac9cb7d35d0c | 5 | #include "PCF2119.h" |
okini3939 | 0:ac9cb7d35d0c | 6 | #include "BMP085.h" |
okini3939 | 0:ac9cb7d35d0c | 7 | #include "WDT.h" |
okini3939 | 0:ac9cb7d35d0c | 8 | |
okini3939 | 0:ac9cb7d35d0c | 9 | DigitalOut myled(LED1), led_r(P0_22), led_g(P1_15), led_b(P0_23); |
okini3939 | 0:ac9cb7d35d0c | 10 | I2C i2c(P0_5, P0_4); |
okini3939 | 0:ac9cb7d35d0c | 11 | PCF2119 lcd(i2c, P0_21); |
okini3939 | 0:ac9cb7d35d0c | 12 | BMP085 bmp(i2c, BMP085_oss8); |
okini3939 | 0:ac9cb7d35d0c | 13 | Watchdog wdt; |
okini3939 | 0:ac9cb7d35d0c | 14 | AnalogIn vsens(P0_11); |
okini3939 | 0:ac9cb7d35d0c | 15 | DigitalOut vpwr(P0_12); |
okini3939 | 0:ac9cb7d35d0c | 16 | |
okini3939 | 0:ac9cb7d35d0c | 17 | float p, t, b; |
okini3939 | 0:ac9cb7d35d0c | 18 | float vals[35]; |
okini3939 | 0:ac9cb7d35d0c | 19 | float ave = 0; |
okini3939 | 0:ac9cb7d35d0c | 20 | int count = 0, ud = 0; |
okini3939 | 0:ac9cb7d35d0c | 21 | |
okini3939 | 0:ac9cb7d35d0c | 22 | char gaiji[5][8] = { |
okini3939 | 0:ac9cb7d35d0c | 23 | {0x0e, 0x1b, 0x11, 0x11, 0x11, 0x11, 0x1f, 0}, |
okini3939 | 0:ac9cb7d35d0c | 24 | {0x0e, 0x1b, 0x11, 0x11, 0x11, 0x1f, 0x1f, 0}, |
okini3939 | 0:ac9cb7d35d0c | 25 | {0x0e, 0x1b, 0x11, 0x11, 0x1f, 0x1f, 0x1f, 0}, |
okini3939 | 0:ac9cb7d35d0c | 26 | {0x0e, 0x1b, 0x11, 0x1f, 0x1f, 0x1f, 0x1f, 0}, |
okini3939 | 0:ac9cb7d35d0c | 27 | {0x0e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0}, |
okini3939 | 0:ac9cb7d35d0c | 28 | }; |
okini3939 | 0:ac9cb7d35d0c | 29 | char graph[16][8]; |
okini3939 | 0:ac9cb7d35d0c | 30 | char updown[3] = {0x12, 0x32, 0x10}; |
okini3939 | 0:ac9cb7d35d0c | 31 | |
okini3939 | 0:ac9cb7d35d0c | 32 | // draw screen |
okini3939 | 0:ac9cb7d35d0c | 33 | void draw () { |
okini3939 | 0:ac9cb7d35d0c | 34 | int i, n; |
okini3939 | 0:ac9cb7d35d0c | 35 | float min, max, v; |
okini3939 | 0:ac9cb7d35d0c | 36 | int bit, byte; |
okini3939 | 0:ac9cb7d35d0c | 37 | |
okini3939 | 0:ac9cb7d35d0c | 38 | // check min/max |
okini3939 | 0:ac9cb7d35d0c | 39 | min = vals[0]; |
okini3939 | 0:ac9cb7d35d0c | 40 | max = vals[0]; |
okini3939 | 0:ac9cb7d35d0c | 41 | for (i = 0; i < 35; i ++) { |
okini3939 | 0:ac9cb7d35d0c | 42 | if (vals[i] > 800 && vals[i] < 1200) { |
okini3939 | 0:ac9cb7d35d0c | 43 | if (vals[i] < min) min = vals[i]; |
okini3939 | 0:ac9cb7d35d0c | 44 | if (vals[i] > max) max = vals[i]; |
okini3939 | 0:ac9cb7d35d0c | 45 | } |
okini3939 | 0:ac9cb7d35d0c | 46 | } |
okini3939 | 0:ac9cb7d35d0c | 47 | min -= 0.5; |
okini3939 | 0:ac9cb7d35d0c | 48 | max += 0.5; |
okini3939 | 0:ac9cb7d35d0c | 49 | v = max - min; |
okini3939 | 0:ac9cb7d35d0c | 50 | |
okini3939 | 0:ac9cb7d35d0c | 51 | // create graph |
okini3939 | 0:ac9cb7d35d0c | 52 | memset(&graph, 0, sizeof(graph)); |
okini3939 | 0:ac9cb7d35d0c | 53 | bit = 1; |
okini3939 | 0:ac9cb7d35d0c | 54 | byte = 6; |
okini3939 | 0:ac9cb7d35d0c | 55 | for (i = 0; i < 35; i ++) { |
okini3939 | 0:ac9cb7d35d0c | 56 | n = (vals[i] - min) / v * 15.0; |
okini3939 | 0:ac9cb7d35d0c | 57 | if (n >= 0 && n <= 7) { |
okini3939 | 0:ac9cb7d35d0c | 58 | graph[7 + byte][7 - n] |= bit; |
okini3939 | 0:ac9cb7d35d0c | 59 | } else |
okini3939 | 0:ac9cb7d35d0c | 60 | if (n >= 8 && n <= 15) { |
okini3939 | 0:ac9cb7d35d0c | 61 | graph[byte][15 - n] |= bit; |
okini3939 | 0:ac9cb7d35d0c | 62 | } |
okini3939 | 0:ac9cb7d35d0c | 63 | |
okini3939 | 0:ac9cb7d35d0c | 64 | bit = bit << 1; |
okini3939 | 0:ac9cb7d35d0c | 65 | if (bit & 0x20) { |
okini3939 | 0:ac9cb7d35d0c | 66 | bit = 1; |
okini3939 | 0:ac9cb7d35d0c | 67 | byte --; |
okini3939 | 0:ac9cb7d35d0c | 68 | if (byte < 0) break; |
okini3939 | 0:ac9cb7d35d0c | 69 | } |
okini3939 | 0:ac9cb7d35d0c | 70 | } |
okini3939 | 0:ac9cb7d35d0c | 71 | |
okini3939 | 0:ac9cb7d35d0c | 72 | // graph to font |
okini3939 | 0:ac9cb7d35d0c | 73 | for (i = 0; i < 7; i ++) { |
okini3939 | 0:ac9cb7d35d0c | 74 | lcd.cgram(i, graph[i], 8); |
okini3939 | 0:ac9cb7d35d0c | 75 | lcd.cgram(7 + i, graph[7 + i], 8); |
okini3939 | 0:ac9cb7d35d0c | 76 | } |
okini3939 | 0:ac9cb7d35d0c | 77 | |
okini3939 | 0:ac9cb7d35d0c | 78 | // battery to font |
okini3939 | 0:ac9cb7d35d0c | 79 | i = (b - 2.8) / 0.1 + 0.05; |
okini3939 | 0:ac9cb7d35d0c | 80 | if (i < 0) i = 0; |
okini3939 | 0:ac9cb7d35d0c | 81 | if (i > 4) i = 4; |
okini3939 | 0:ac9cb7d35d0c | 82 | lcd.cgram(15, gaiji[i], 8); |
okini3939 | 0:ac9cb7d35d0c | 83 | |
okini3939 | 0:ac9cb7d35d0c | 84 | lcd.cls(); |
okini3939 | 0:ac9cb7d35d0c | 85 | // graph, pressure |
okini3939 | 0:ac9cb7d35d0c | 86 | lcd.locate(0, 0); |
okini3939 | 0:ac9cb7d35d0c | 87 | lcd.printf("\xf0\xf1\xf2\xf3\xf4\xf5\xf6%4.1fhPa", p + 0.05); |
okini3939 | 0:ac9cb7d35d0c | 88 | lcd.locate(0, 1); |
okini3939 | 0:ac9cb7d35d0c | 89 | lcd.printf("\x07\xf8\xf9\xfa\xfb\xfc\xfd %2.1fc", t + 0.05); |
okini3939 | 0:ac9cb7d35d0c | 90 | // up/down mark |
okini3939 | 0:ac9cb7d35d0c | 91 | lcd.raw = 1; |
okini3939 | 0:ac9cb7d35d0c | 92 | lcd.locate(7, 1); |
okini3939 | 0:ac9cb7d35d0c | 93 | lcd.putc(updown[ud + 1]); |
okini3939 | 0:ac9cb7d35d0c | 94 | lcd.raw = 0; |
okini3939 | 0:ac9cb7d35d0c | 95 | // battery gauge |
okini3939 | 0:ac9cb7d35d0c | 96 | lcd.locate(15, 1); |
okini3939 | 0:ac9cb7d35d0c | 97 | lcd.printf("\xff"); |
okini3939 | 0:ac9cb7d35d0c | 98 | } |
okini3939 | 0:ac9cb7d35d0c | 99 | |
okini3939 | 0:ac9cb7d35d0c | 100 | // up/down |
okini3939 | 0:ac9cb7d35d0c | 101 | void check () { |
okini3939 | 0:ac9cb7d35d0c | 102 | int i; |
okini3939 | 0:ac9cb7d35d0c | 103 | float sum; |
okini3939 | 0:ac9cb7d35d0c | 104 | |
okini3939 | 0:ac9cb7d35d0c | 105 | sum = 0; |
okini3939 | 0:ac9cb7d35d0c | 106 | for (i = 0; i < 34; i ++) { |
okini3939 | 0:ac9cb7d35d0c | 107 | if (vals[i + 1] < 800 || vals[i + 1] > 1200) break; |
okini3939 | 0:ac9cb7d35d0c | 108 | sum += (vals[i] - vals[i + 1]); |
okini3939 | 0:ac9cb7d35d0c | 109 | if (sum > 1) { |
okini3939 | 0:ac9cb7d35d0c | 110 | ud = 1; // up |
okini3939 | 0:ac9cb7d35d0c | 111 | break; |
okini3939 | 0:ac9cb7d35d0c | 112 | } else |
okini3939 | 0:ac9cb7d35d0c | 113 | if (sum < -1) { |
okini3939 | 0:ac9cb7d35d0c | 114 | ud = -1; // down |
okini3939 | 0:ac9cb7d35d0c | 115 | if (i < 10) ud = -2; |
okini3939 | 0:ac9cb7d35d0c | 116 | break; |
okini3939 | 0:ac9cb7d35d0c | 117 | } |
okini3939 | 0:ac9cb7d35d0c | 118 | } |
okini3939 | 0:ac9cb7d35d0c | 119 | } |
okini3939 | 0:ac9cb7d35d0c | 120 | |
okini3939 | 0:ac9cb7d35d0c | 121 | void sample () { |
okini3939 | 0:ac9cb7d35d0c | 122 | int i; |
okini3939 | 0:ac9cb7d35d0c | 123 | |
okini3939 | 0:ac9cb7d35d0c | 124 | // BMP180 |
okini3939 | 0:ac9cb7d35d0c | 125 | bmp.update(); |
okini3939 | 0:ac9cb7d35d0c | 126 | p = bmp.get_pressure(); |
okini3939 | 0:ac9cb7d35d0c | 127 | t = bmp.get_temperature(); |
okini3939 | 0:ac9cb7d35d0c | 128 | |
okini3939 | 0:ac9cb7d35d0c | 129 | ave += p; |
okini3939 | 0:ac9cb7d35d0c | 130 | count ++; |
okini3939 | 0:ac9cb7d35d0c | 131 | if (count >= 6) { |
okini3939 | 0:ac9cb7d35d0c | 132 | // average 6 min. |
okini3939 | 0:ac9cb7d35d0c | 133 | count = 0; |
okini3939 | 0:ac9cb7d35d0c | 134 | ave = ave / 6; |
okini3939 | 0:ac9cb7d35d0c | 135 | // shift buffer |
okini3939 | 0:ac9cb7d35d0c | 136 | for (i = 34; i >= 1; i --) { |
okini3939 | 0:ac9cb7d35d0c | 137 | vals[i] = vals[i - 1]; |
okini3939 | 0:ac9cb7d35d0c | 138 | } |
okini3939 | 0:ac9cb7d35d0c | 139 | vals[0] = ave; |
okini3939 | 0:ac9cb7d35d0c | 140 | ave = 0; |
okini3939 | 0:ac9cb7d35d0c | 141 | |
okini3939 | 0:ac9cb7d35d0c | 142 | // ADC (battery) |
okini3939 | 0:ac9cb7d35d0c | 143 | vpwr = 1; |
okini3939 | 0:ac9cb7d35d0c | 144 | wait_ms(10); |
okini3939 | 0:ac9cb7d35d0c | 145 | b = 2.495 / vsens; |
okini3939 | 0:ac9cb7d35d0c | 146 | vpwr = 0; |
okini3939 | 0:ac9cb7d35d0c | 147 | |
okini3939 | 0:ac9cb7d35d0c | 148 | check(); |
okini3939 | 0:ac9cb7d35d0c | 149 | draw(); |
okini3939 | 0:ac9cb7d35d0c | 150 | } else { |
okini3939 | 0:ac9cb7d35d0c | 151 | lcd.locate(7, 0); |
okini3939 | 0:ac9cb7d35d0c | 152 | lcd.printf("%4.1fhPa", p + 0.05); |
okini3939 | 0:ac9cb7d35d0c | 153 | lcd.locate(9, 1); |
okini3939 | 0:ac9cb7d35d0c | 154 | lcd.printf("%2.1fc", t + 0.05); |
okini3939 | 0:ac9cb7d35d0c | 155 | } |
okini3939 | 0:ac9cb7d35d0c | 156 | } |
okini3939 | 0:ac9cb7d35d0c | 157 | |
okini3939 | 0:ac9cb7d35d0c | 158 | int main() { |
okini3939 | 0:ac9cb7d35d0c | 159 | int w; |
okini3939 | 0:ac9cb7d35d0c | 160 | |
okini3939 | 0:ac9cb7d35d0c | 161 | myled = 0; |
okini3939 | 0:ac9cb7d35d0c | 162 | led_r = led_g = led_b = 1; |
okini3939 | 0:ac9cb7d35d0c | 163 | memset(&vals, 0, sizeof(vals)); |
okini3939 | 0:ac9cb7d35d0c | 164 | i2c.frequency(400000); |
okini3939 | 0:ac9cb7d35d0c | 165 | |
okini3939 | 0:ac9cb7d35d0c | 166 | lcd.cls(); |
okini3939 | 0:ac9cb7d35d0c | 167 | lcd.printf("Barometer"); |
okini3939 | 0:ac9cb7d35d0c | 168 | led_r = 0; |
okini3939 | 0:ac9cb7d35d0c | 169 | wait_ms(300); |
okini3939 | 0:ac9cb7d35d0c | 170 | led_r = 1; |
okini3939 | 0:ac9cb7d35d0c | 171 | led_g = 0; |
okini3939 | 0:ac9cb7d35d0c | 172 | wait_ms(300); |
okini3939 | 0:ac9cb7d35d0c | 173 | led_g = 1; |
okini3939 | 0:ac9cb7d35d0c | 174 | led_b = 0; |
okini3939 | 0:ac9cb7d35d0c | 175 | wait_ms(300); |
okini3939 | 0:ac9cb7d35d0c | 176 | led_b = 1; |
okini3939 | 0:ac9cb7d35d0c | 177 | |
okini3939 | 0:ac9cb7d35d0c | 178 | sample(); |
okini3939 | 0:ac9cb7d35d0c | 179 | vpwr = 1; |
okini3939 | 0:ac9cb7d35d0c | 180 | wait_ms(10); |
okini3939 | 0:ac9cb7d35d0c | 181 | b = 2.495 / vsens; // battery |
okini3939 | 0:ac9cb7d35d0c | 182 | vpwr = 0; |
okini3939 | 0:ac9cb7d35d0c | 183 | draw(); |
okini3939 | 0:ac9cb7d35d0c | 184 | |
okini3939 | 0:ac9cb7d35d0c | 185 | for (;;) { |
okini3939 | 0:ac9cb7d35d0c | 186 | if (ud > 0) { |
okini3939 | 0:ac9cb7d35d0c | 187 | led_r = 0; // up |
okini3939 | 0:ac9cb7d35d0c | 188 | } else |
okini3939 | 0:ac9cb7d35d0c | 189 | if (ud < 0) { |
okini3939 | 0:ac9cb7d35d0c | 190 | led_b = 0; // down |
okini3939 | 0:ac9cb7d35d0c | 191 | if (ud < -1) led_g = 0; |
okini3939 | 0:ac9cb7d35d0c | 192 | } else { |
okini3939 | 0:ac9cb7d35d0c | 193 | led_g = 0; |
okini3939 | 0:ac9cb7d35d0c | 194 | } |
okini3939 | 0:ac9cb7d35d0c | 195 | |
okini3939 | 0:ac9cb7d35d0c | 196 | w ++; |
okini3939 | 0:ac9cb7d35d0c | 197 | if (w >= 20) { |
okini3939 | 0:ac9cb7d35d0c | 198 | w = 0; |
okini3939 | 0:ac9cb7d35d0c | 199 | sample(); // 1 min. |
okini3939 | 0:ac9cb7d35d0c | 200 | } else { |
okini3939 | 0:ac9cb7d35d0c | 201 | wait_ms(1); |
okini3939 | 0:ac9cb7d35d0c | 202 | } |
okini3939 | 0:ac9cb7d35d0c | 203 | led_r = led_g = led_b = 1; |
okini3939 | 0:ac9cb7d35d0c | 204 | wdt.attach(NULL, 3); // wdt interrupt |
okini3939 | 0:ac9cb7d35d0c | 205 | wdt.deepSleep(); |
okini3939 | 0:ac9cb7d35d0c | 206 | } |
okini3939 | 0:ac9cb7d35d0c | 207 | } |