Basic program to read temperature and pressure data from BMP-180 altimeter, convert the temperature into Centigrade and Fahrenheit, and average pressure for highest precision. Use pressure to obtain altitude in meters and feet. Display all to four 4-digit eight-segment bubble displays.

Dependencies:   mbed

Dependents:   GloboMet

Committer:
onehorse
Date:
Thu Jul 03 20:05:55 2014 +0000
Revision:
0:06dc60296e6e
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
onehorse 0:06dc60296e6e 1 #ifndef HT16K33_H
onehorse 0:06dc60296e6e 2 #define HT16K33_H
onehorse 0:06dc60296e6e 3
onehorse 0:06dc60296e6e 4 #include "mbed.h"
onehorse 0:06dc60296e6e 5
onehorse 0:06dc60296e6e 6 #define HT16K33_ADDRESS 0x70<<1 // shift to the left one for mbed
onehorse 0:06dc60296e6e 7 #define HT16K33_ON 0x21 // Commands
onehorse 0:06dc60296e6e 8 #define HT16K33_STANDBY 0x20
onehorse 0:06dc60296e6e 9 #define HT16K33_DISPLAYON 0x81
onehorse 0:06dc60296e6e 10 #define HT16K33_DISPLAYOFF 0x80
onehorse 0:06dc60296e6e 11 #define HT16K33_BLINKON 0x85 // Blink is off (00), 2 Hz (01), 1 Hz (10), or 0.5 Hz (11) for bits (21)
onehorse 0:06dc60296e6e 12 #define HT16K33_BLINKOFF 0x81
onehorse 0:06dc60296e6e 13 #define HT16K33_DIM 0xE0 | 0x08 // Set brihtness from 1/16 (0x00) to 16/16 (0xFF)
onehorse 0:06dc60296e6e 14
onehorse 0:06dc60296e6e 15 // Arrangement for display 1 (4 digit bubble display)
onehorse 0:06dc60296e6e 16 //
onehorse 0:06dc60296e6e 17 // a = A0
onehorse 0:06dc60296e6e 18 // _________
onehorse 0:06dc60296e6e 19 // | |
onehorse 0:06dc60296e6e 20 // f = A2 | g = A4 | b = A1
onehorse 0:06dc60296e6e 21 // |_________|
onehorse 0:06dc60296e6e 22 // | |
onehorse 0:06dc60296e6e 23 // e = A5 | | c = A6
onehorse 0:06dc60296e6e 24 // |_________|
onehorse 0:06dc60296e6e 25 // d = A3 DP = A7
onehorse 0:06dc60296e6e 26
onehorse 0:06dc60296e6e 27
onehorse 0:06dc60296e6e 28 static const char numberTable[] =
onehorse 0:06dc60296e6e 29 {
onehorse 0:06dc60296e6e 30 0x6F, // 0 = 0
onehorse 0:06dc60296e6e 31 0x42, // 1 = 1, etc
onehorse 0:06dc60296e6e 32 0x3B, // 2
onehorse 0:06dc60296e6e 33 0x5B, // 3
onehorse 0:06dc60296e6e 34 0x56, // 4
onehorse 0:06dc60296e6e 35 0x5D, // 5
onehorse 0:06dc60296e6e 36 0x7D, // 6
onehorse 0:06dc60296e6e 37 0x43, // 7
onehorse 0:06dc60296e6e 38 0x7F, // 8
onehorse 0:06dc60296e6e 39 0x57, // 9
onehorse 0:06dc60296e6e 40 0x80, // decimal point
onehorse 0:06dc60296e6e 41 0x00, // blank
onehorse 0:06dc60296e6e 42 0x10, // minus sign
onehorse 0:06dc60296e6e 43 };
onehorse 0:06dc60296e6e 44
onehorse 0:06dc60296e6e 45 #define display1 1
onehorse 0:06dc60296e6e 46 #define display2 2
onehorse 0:06dc60296e6e 47 #define display3 3
onehorse 0:06dc60296e6e 48 #define display4 4
onehorse 0:06dc60296e6e 49
onehorse 0:06dc60296e6e 50 class HT16K33 {
onehorse 0:06dc60296e6e 51
onehorse 0:06dc60296e6e 52 protected:
onehorse 0:06dc60296e6e 53
onehorse 0:06dc60296e6e 54 public:
onehorse 0:06dc60296e6e 55 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
onehorse 0:06dc60296e6e 56 //++ Useful Functions++
onehorse 0:06dc60296e6e 57 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
onehorse 0:06dc60296e6e 58
onehorse 0:06dc60296e6e 59 void writeInteger(uint8_t dsply, int data)
onehorse 0:06dc60296e6e 60 {
onehorse 0:06dc60296e6e 61 char string[10] = ""; // define character array to hold the digits
onehorse 0:06dc60296e6e 62 itoa(data, string); // get ascii character string representation of the integer to be displayed
onehorse 0:06dc60296e6e 63 uint8_t length = strlen(string); // get the length of the string; number of digits in integer
onehorse 0:06dc60296e6e 64 uint8_t blanks = 4 - length; // how many blanks do we have?
onehorse 0:06dc60296e6e 65
onehorse 0:06dc60296e6e 66 if (length > 4) return; // if length greater than 4 digits we can't display on a four-digit display!
onehorse 0:06dc60296e6e 67
onehorse 0:06dc60296e6e 68 for (uint8_t digit = 0; digit < blanks; digit++) // scroll through each digit to determine what to write to the display
onehorse 0:06dc60296e6e 69 {
onehorse 0:06dc60296e6e 70 writeDigit(dsply, digit + 1, 11, 0); // clear digit wherever there are blanks
onehorse 0:06dc60296e6e 71 }
onehorse 0:06dc60296e6e 72
onehorse 0:06dc60296e6e 73 for (uint8_t digit = 0; digit < 4; digit++) // scroll through each digit to determine what to write to the display
onehorse 0:06dc60296e6e 74 {
onehorse 0:06dc60296e6e 75 char ch = string[digit]; // get the ascii character of the next string segment
onehorse 0:06dc60296e6e 76
onehorse 0:06dc60296e6e 77 if (ch == '-') {
onehorse 0:06dc60296e6e 78 writeDigit(dsply, digit + 1 + blanks, 12, 0); // check if negative sign needed
onehorse 0:06dc60296e6e 79 }
onehorse 0:06dc60296e6e 80 else { // character must be a digit
onehorse 0:06dc60296e6e 81 ch -= '0'; // convert it to an integer
onehorse 0:06dc60296e6e 82 writeDigit(dsply, digit + 1 + blanks, ch, 0); // write it to the display; right justify the integer
onehorse 0:06dc60296e6e 83 }
onehorse 0:06dc60296e6e 84 }
onehorse 0:06dc60296e6e 85 }
onehorse 0:06dc60296e6e 86
onehorse 0:06dc60296e6e 87 void writeFloat(uint8_t dsply, float data, uint8_t dp)
onehorse 0:06dc60296e6e 88 {
onehorse 0:06dc60296e6e 89 char string[10] = ""; // define character array to hold the digits
onehorse 0:06dc60296e6e 90 int datanew = 0;
onehorse 0:06dc60296e6e 91
onehorse 0:06dc60296e6e 92 switch (dp)
onehorse 0:06dc60296e6e 93 {
onehorse 0:06dc60296e6e 94 case 0:
onehorse 0:06dc60296e6e 95 datanew = (int )(1.0f*data);
onehorse 0:06dc60296e6e 96 break;
onehorse 0:06dc60296e6e 97
onehorse 0:06dc60296e6e 98 case 1:
onehorse 0:06dc60296e6e 99 datanew = (int )(10.0f*data);
onehorse 0:06dc60296e6e 100 break;
onehorse 0:06dc60296e6e 101
onehorse 0:06dc60296e6e 102 case 2:
onehorse 0:06dc60296e6e 103 datanew = (int )(100.0f*data);
onehorse 0:06dc60296e6e 104 break;
onehorse 0:06dc60296e6e 105
onehorse 0:06dc60296e6e 106 case 3:
onehorse 0:06dc60296e6e 107 datanew = (int )(1000.0f*data);
onehorse 0:06dc60296e6e 108 break;
onehorse 0:06dc60296e6e 109 }
onehorse 0:06dc60296e6e 110
onehorse 0:06dc60296e6e 111
onehorse 0:06dc60296e6e 112 itoa(datanew, string); // get ascii character string representation of the integer to be displayed
onehorse 0:06dc60296e6e 113 uint8_t length = strlen(string); // get the length of the string; number of digits in integer
onehorse 0:06dc60296e6e 114 uint8_t blanks = 4 - length; // how many blanks do we have?
onehorse 0:06dc60296e6e 115
onehorse 0:06dc60296e6e 116 if (length > 4) return; // if length greater than 4 digits we can't display on a four-digit display!
onehorse 0:06dc60296e6e 117
onehorse 0:06dc60296e6e 118 // scroll through each digit to determine what to write to the display
onehorse 0:06dc60296e6e 119 for (uint8_t digit = 0; digit < blanks; digit++) // first the blanks
onehorse 0:06dc60296e6e 120 {
onehorse 0:06dc60296e6e 121 if( (digit + 1) == (4 - dp) ) { // handle special case where blank coincides with decimal point
onehorse 0:06dc60296e6e 122 writeDigit(dsply, digit + 1, 0, 0x80); // add leading zero before decimal place
onehorse 0:06dc60296e6e 123 }
onehorse 0:06dc60296e6e 124 else {
onehorse 0:06dc60296e6e 125 writeDigit(dsply, digit + 1, 11, 0x00); // otherwise clear digit wherever there are blanks
onehorse 0:06dc60296e6e 126 }
onehorse 0:06dc60296e6e 127 }
onehorse 0:06dc60296e6e 128
onehorse 0:06dc60296e6e 129 for (uint8_t digit = 0; digit < 4; digit++) // now the characters to determine what to write to the display
onehorse 0:06dc60296e6e 130 {
onehorse 0:06dc60296e6e 131 char ch = string[digit]; // get the ascii character of the next string segment
onehorse 0:06dc60296e6e 132
onehorse 0:06dc60296e6e 133 if (ch == '-') {
onehorse 0:06dc60296e6e 134 if((digit + 1 + blanks) == (4 - dp) ) {
onehorse 0:06dc60296e6e 135 writeDigit(dsply, digit + 1 + blanks, 0, 0x80); // check if negative sign needed, add a decimal point
onehorse 0:06dc60296e6e 136 writeDigit(dsply, digit + 0 + blanks, 12, 0x00); // add a leading zero
onehorse 0:06dc60296e6e 137 }
onehorse 0:06dc60296e6e 138 else {
onehorse 0:06dc60296e6e 139 writeDigit(dsply, digit + 1 + blanks, 12, 0x00); // check if negative sign needed, no decimal point
onehorse 0:06dc60296e6e 140 }
onehorse 0:06dc60296e6e 141 }
onehorse 0:06dc60296e6e 142 else { // character must be a digit
onehorse 0:06dc60296e6e 143 ch -= '0'; // convert it to an integer
onehorse 0:06dc60296e6e 144 if((digit + 1 + blanks) == (4 - dp) ) {
onehorse 0:06dc60296e6e 145 writeDigit(dsply, digit + 1 + blanks, ch, 0x80); // write it to the display with decimal point; right justify the integer
onehorse 0:06dc60296e6e 146 }
onehorse 0:06dc60296e6e 147 else {
onehorse 0:06dc60296e6e 148 writeDigit(dsply, digit + 1 + blanks, ch, 0x00); // write it to the display; right justify the integer
onehorse 0:06dc60296e6e 149 }
onehorse 0:06dc60296e6e 150 }
onehorse 0:06dc60296e6e 151 }
onehorse 0:06dc60296e6e 152 }
onehorse 0:06dc60296e6e 153
onehorse 0:06dc60296e6e 154
onehorse 0:06dc60296e6e 155 void writeDigit(uint8_t dsply, uint8_t digit, uint8_t data, uint8_t dp)
onehorse 0:06dc60296e6e 156 {
onehorse 0:06dc60296e6e 157 if(dsply == 1) {
onehorse 0:06dc60296e6e 158 digit = (digit - 1)*2 + 0;
onehorse 0:06dc60296e6e 159 }
onehorse 0:06dc60296e6e 160 if(dsply == 2) {
onehorse 0:06dc60296e6e 161 digit = (digit - 1)*2 + 8 ;
onehorse 0:06dc60296e6e 162 }
onehorse 0:06dc60296e6e 163 if(dsply == 3) {
onehorse 0:06dc60296e6e 164 digit = (digit - 1)*2 + 1;
onehorse 0:06dc60296e6e 165 }
onehorse 0:06dc60296e6e 166 if(dsply == 4) {
onehorse 0:06dc60296e6e 167 digit = (digit - 1)*2 + 9;
onehorse 0:06dc60296e6e 168 }
onehorse 0:06dc60296e6e 169 writeByte(HT16K33_ADDRESS, digit, numberTable[data] | dp);
onehorse 0:06dc60296e6e 170 }
onehorse 0:06dc60296e6e 171
onehorse 0:06dc60296e6e 172
onehorse 0:06dc60296e6e 173 void clearDsplay(int dsply)
onehorse 0:06dc60296e6e 174 {
onehorse 0:06dc60296e6e 175 for(int i = 0; i < 8; i++) {
onehorse 0:06dc60296e6e 176 writeDigit(dsply, i, 11, 0); // Clear display, 11 is blank in the numberTable above
onehorse 0:06dc60296e6e 177 }
onehorse 0:06dc60296e6e 178 }
onehorse 0:06dc60296e6e 179
onehorse 0:06dc60296e6e 180
onehorse 0:06dc60296e6e 181 void initHT16K33()
onehorse 0:06dc60296e6e 182 {
onehorse 0:06dc60296e6e 183 writeCommand(HT16K33_ADDRESS, HT16K33_ON); // Turn on system oscillator
onehorse 0:06dc60296e6e 184 writeCommand(HT16K33_ADDRESS, HT16K33_DISPLAYON); // Display on
onehorse 0:06dc60296e6e 185 writeCommand(HT16K33_ADDRESS, HT16K33_DIM); // Set brightness
onehorse 0:06dc60296e6e 186
onehorse 0:06dc60296e6e 187 }
onehorse 0:06dc60296e6e 188
onehorse 0:06dc60296e6e 189
onehorse 0:06dc60296e6e 190 void blinkHT16K33(int time)
onehorse 0:06dc60296e6e 191 {
onehorse 0:06dc60296e6e 192 writeCommand(HT16K33_ADDRESS, HT16K33_BLINKON); // Turn on blink
onehorse 0:06dc60296e6e 193 wait(time);
onehorse 0:06dc60296e6e 194 writeCommand(HT16K33_ADDRESS, HT16K33_BLINKOFF); // Turn on blink
onehorse 0:06dc60296e6e 195 }
onehorse 0:06dc60296e6e 196
onehorse 0:06dc60296e6e 197
onehorse 0:06dc60296e6e 198 /* itoa: convert n to characters in s */
onehorse 0:06dc60296e6e 199 void itoa(int n, char s[])
onehorse 0:06dc60296e6e 200 {
onehorse 0:06dc60296e6e 201 int i, sign;
onehorse 0:06dc60296e6e 202
onehorse 0:06dc60296e6e 203 if ((sign = n) < 0) /* record sign */
onehorse 0:06dc60296e6e 204 n = -n; /* make n positive */
onehorse 0:06dc60296e6e 205 i = 0;
onehorse 0:06dc60296e6e 206 do { /* generate digits in reverse order */
onehorse 0:06dc60296e6e 207 s[i++] = n % 10 + '0'; /* get next digit */
onehorse 0:06dc60296e6e 208 } while ((n /= 10) > 0); /* delete it */
onehorse 0:06dc60296e6e 209 if (sign < 0)
onehorse 0:06dc60296e6e 210 s[i++] = '-';
onehorse 0:06dc60296e6e 211 s[i] = '\0';
onehorse 0:06dc60296e6e 212 reverse(s);
onehorse 0:06dc60296e6e 213 }
onehorse 0:06dc60296e6e 214
onehorse 0:06dc60296e6e 215 /* reverse: reverse string s in place */
onehorse 0:06dc60296e6e 216 void reverse(char s[])
onehorse 0:06dc60296e6e 217 {
onehorse 0:06dc60296e6e 218 int i, j;
onehorse 0:06dc60296e6e 219 char c;
onehorse 0:06dc60296e6e 220
onehorse 0:06dc60296e6e 221 for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
onehorse 0:06dc60296e6e 222 c = s[i];
onehorse 0:06dc60296e6e 223 s[i] = s[j];
onehorse 0:06dc60296e6e 224 s[j] = c;
onehorse 0:06dc60296e6e 225 }
onehorse 0:06dc60296e6e 226 }
onehorse 0:06dc60296e6e 227
onehorse 0:06dc60296e6e 228 // Wire.h read and write protocols
onehorse 0:06dc60296e6e 229 void writeCommand(uint8_t address, uint8_t command)
onehorse 0:06dc60296e6e 230 {
onehorse 0:06dc60296e6e 231 char data_write[1];
onehorse 0:06dc60296e6e 232 data_write[0] = command;
onehorse 0:06dc60296e6e 233 i2c.write(address, data_write, 1, 0);
onehorse 0:06dc60296e6e 234 }
onehorse 0:06dc60296e6e 235
onehorse 0:06dc60296e6e 236 void writeByte(uint8_t address, uint8_t subAddress, uint8_t data)
onehorse 0:06dc60296e6e 237 {
onehorse 0:06dc60296e6e 238 char data_write[2];
onehorse 0:06dc60296e6e 239 data_write[0] = subAddress;
onehorse 0:06dc60296e6e 240 data_write[1] = data;
onehorse 0:06dc60296e6e 241 i2c.write(address, data_write, 2, 0);
onehorse 0:06dc60296e6e 242 }
onehorse 0:06dc60296e6e 243
onehorse 0:06dc60296e6e 244 char readByte(uint8_t address, uint8_t subAddress)
onehorse 0:06dc60296e6e 245 {
onehorse 0:06dc60296e6e 246 char data[1]; // `data` will store the register data
onehorse 0:06dc60296e6e 247 char data_write[1];
onehorse 0:06dc60296e6e 248 data_write[0] = subAddress;
onehorse 0:06dc60296e6e 249 i2c.write(address, data_write, 1, 1); // no stop
onehorse 0:06dc60296e6e 250 i2c.read(address, data, 1, 0);
onehorse 0:06dc60296e6e 251 return data[0];
onehorse 0:06dc60296e6e 252 }
onehorse 0:06dc60296e6e 253
onehorse 0:06dc60296e6e 254 void readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest)
onehorse 0:06dc60296e6e 255 {
onehorse 0:06dc60296e6e 256 char data[14];
onehorse 0:06dc60296e6e 257 char data_write[1];
onehorse 0:06dc60296e6e 258 data_write[0] = subAddress;
onehorse 0:06dc60296e6e 259 i2c.write(address, data_write, 1, 1); // no stop
onehorse 0:06dc60296e6e 260 i2c.read(address, data, count, 0);
onehorse 0:06dc60296e6e 261 for(int ii = 0; ii < count; ii++) {
onehorse 0:06dc60296e6e 262 dest[ii] = data[ii];
onehorse 0:06dc60296e6e 263 }
onehorse 0:06dc60296e6e 264 }
onehorse 0:06dc60296e6e 265 };
onehorse 0:06dc60296e6e 266 #endif