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.
HT16K33.h@0:06dc60296e6e, 2014-07-03 (annotated)
- Committer:
- onehorse
- Date:
- Thu Jul 03 20:05:55 2014 +0000
- Revision:
- 0:06dc60296e6e
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 |