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.
Diff: HT16K33.h
- Revision:
- 0:06dc60296e6e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HT16K33.h Thu Jul 03 20:05:55 2014 +0000 @@ -0,0 +1,266 @@ +#ifndef HT16K33_H +#define HT16K33_H + +#include "mbed.h" + +#define HT16K33_ADDRESS 0x70<<1 // shift to the left one for mbed +#define HT16K33_ON 0x21 // Commands +#define HT16K33_STANDBY 0x20 +#define HT16K33_DISPLAYON 0x81 +#define HT16K33_DISPLAYOFF 0x80 +#define HT16K33_BLINKON 0x85 // Blink is off (00), 2 Hz (01), 1 Hz (10), or 0.5 Hz (11) for bits (21) +#define HT16K33_BLINKOFF 0x81 +#define HT16K33_DIM 0xE0 | 0x08 // Set brihtness from 1/16 (0x00) to 16/16 (0xFF) + +// Arrangement for display 1 (4 digit bubble display) +// +// a = A0 +// _________ +// | | +// f = A2 | g = A4 | b = A1 +// |_________| +// | | +// e = A5 | | c = A6 +// |_________| +// d = A3 DP = A7 + + +static const char numberTable[] = +{ + 0x6F, // 0 = 0 + 0x42, // 1 = 1, etc + 0x3B, // 2 + 0x5B, // 3 + 0x56, // 4 + 0x5D, // 5 + 0x7D, // 6 + 0x43, // 7 + 0x7F, // 8 + 0x57, // 9 + 0x80, // decimal point + 0x00, // blank + 0x10, // minus sign +}; + +#define display1 1 +#define display2 2 +#define display3 3 +#define display4 4 + +class HT16K33 { + + protected: + + public: + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +//++ Useful Functions++ +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +void writeInteger(uint8_t dsply, int data) +{ + char string[10] = ""; // define character array to hold the digits + itoa(data, string); // get ascii character string representation of the integer to be displayed + uint8_t length = strlen(string); // get the length of the string; number of digits in integer + uint8_t blanks = 4 - length; // how many blanks do we have? + + if (length > 4) return; // if length greater than 4 digits we can't display on a four-digit display! + + for (uint8_t digit = 0; digit < blanks; digit++) // scroll through each digit to determine what to write to the display + { + writeDigit(dsply, digit + 1, 11, 0); // clear digit wherever there are blanks + } + + for (uint8_t digit = 0; digit < 4; digit++) // scroll through each digit to determine what to write to the display + { + char ch = string[digit]; // get the ascii character of the next string segment + + if (ch == '-') { + writeDigit(dsply, digit + 1 + blanks, 12, 0); // check if negative sign needed + } + else { // character must be a digit + ch -= '0'; // convert it to an integer + writeDigit(dsply, digit + 1 + blanks, ch, 0); // write it to the display; right justify the integer + } + } +} + +void writeFloat(uint8_t dsply, float data, uint8_t dp) +{ + char string[10] = ""; // define character array to hold the digits + int datanew = 0; + + switch (dp) + { + case 0: + datanew = (int )(1.0f*data); + break; + + case 1: + datanew = (int )(10.0f*data); + break; + + case 2: + datanew = (int )(100.0f*data); + break; + + case 3: + datanew = (int )(1000.0f*data); + break; + } + + + itoa(datanew, string); // get ascii character string representation of the integer to be displayed + uint8_t length = strlen(string); // get the length of the string; number of digits in integer + uint8_t blanks = 4 - length; // how many blanks do we have? + + if (length > 4) return; // if length greater than 4 digits we can't display on a four-digit display! + +// scroll through each digit to determine what to write to the display +for (uint8_t digit = 0; digit < blanks; digit++) // first the blanks + { + if( (digit + 1) == (4 - dp) ) { // handle special case where blank coincides with decimal point + writeDigit(dsply, digit + 1, 0, 0x80); // add leading zero before decimal place + } + else { + writeDigit(dsply, digit + 1, 11, 0x00); // otherwise clear digit wherever there are blanks + } + } + + for (uint8_t digit = 0; digit < 4; digit++) // now the characters to determine what to write to the display + { + char ch = string[digit]; // get the ascii character of the next string segment + + if (ch == '-') { + if((digit + 1 + blanks) == (4 - dp) ) { + writeDigit(dsply, digit + 1 + blanks, 0, 0x80); // check if negative sign needed, add a decimal point + writeDigit(dsply, digit + 0 + blanks, 12, 0x00); // add a leading zero + } + else { + writeDigit(dsply, digit + 1 + blanks, 12, 0x00); // check if negative sign needed, no decimal point + } + } + else { // character must be a digit + ch -= '0'; // convert it to an integer + if((digit + 1 + blanks) == (4 - dp) ) { + writeDigit(dsply, digit + 1 + blanks, ch, 0x80); // write it to the display with decimal point; right justify the integer + } + else { + writeDigit(dsply, digit + 1 + blanks, ch, 0x00); // write it to the display; right justify the integer + } + } + } +} + + +void writeDigit(uint8_t dsply, uint8_t digit, uint8_t data, uint8_t dp) +{ +if(dsply == 1) { + digit = (digit - 1)*2 + 0; +} +if(dsply == 2) { + digit = (digit - 1)*2 + 8 ; +} +if(dsply == 3) { + digit = (digit - 1)*2 + 1; +} +if(dsply == 4) { + digit = (digit - 1)*2 + 9; +} +writeByte(HT16K33_ADDRESS, digit, numberTable[data] | dp); +} + + +void clearDsplay(int dsply) +{ + for(int i = 0; i < 8; i++) { + writeDigit(dsply, i, 11, 0); // Clear display, 11 is blank in the numberTable above + } +} + + +void initHT16K33() +{ + writeCommand(HT16K33_ADDRESS, HT16K33_ON); // Turn on system oscillator + writeCommand(HT16K33_ADDRESS, HT16K33_DISPLAYON); // Display on + writeCommand(HT16K33_ADDRESS, HT16K33_DIM); // Set brightness + +} + + +void blinkHT16K33(int time) +{ + writeCommand(HT16K33_ADDRESS, HT16K33_BLINKON); // Turn on blink + wait(time); + writeCommand(HT16K33_ADDRESS, HT16K33_BLINKOFF); // Turn on blink +} + + + /* itoa: convert n to characters in s */ + void itoa(int n, char s[]) + { + int i, sign; + + if ((sign = n) < 0) /* record sign */ + n = -n; /* make n positive */ + i = 0; + do { /* generate digits in reverse order */ + s[i++] = n % 10 + '0'; /* get next digit */ + } while ((n /= 10) > 0); /* delete it */ + if (sign < 0) + s[i++] = '-'; + s[i] = '\0'; + reverse(s); + } + + /* reverse: reverse string s in place */ + void reverse(char s[]) + { + int i, j; + char c; + + for (i = 0, j = strlen(s)-1; i<j; i++, j--) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } + } + + // Wire.h read and write protocols + void writeCommand(uint8_t address, uint8_t command) + { + char data_write[1]; + data_write[0] = command; + i2c.write(address, data_write, 1, 0); +} + + void writeByte(uint8_t address, uint8_t subAddress, uint8_t data) +{ + char data_write[2]; + data_write[0] = subAddress; + data_write[1] = data; + i2c.write(address, data_write, 2, 0); +} + + char readByte(uint8_t address, uint8_t subAddress) +{ + char data[1]; // `data` will store the register data + char data_write[1]; + data_write[0] = subAddress; + i2c.write(address, data_write, 1, 1); // no stop + i2c.read(address, data, 1, 0); + return data[0]; +} + + void readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest) +{ + char data[14]; + char data_write[1]; + data_write[0] = subAddress; + i2c.write(address, data_write, 1, 1); // no stop + i2c.read(address, data, count, 0); + for(int ii = 0; ii < count; ii++) { + dest[ii] = data[ii]; + } +} + }; +#endif \ No newline at end of file