Barometer for EA LPC11U35 QuickStart Board see: https://mbed.org/users/okini3939/notebook/barometer/

Dependencies:   BMP085 PCF2119 WDT mbed

Committer:
okini3939
Date:
Fri Jul 11 00:56:46 2014 +0000
Revision:
0:ac9cb7d35d0c
1st build

Who changed what in which revision?

UserRevisionLine numberNew 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 }