Data logger: Sensors -> Barometer & temperature (BMP180), Humidity & temp. (RHT03), Sunshine (Cds): Display -> 20 chracters x 4 lines: Strage -> EEPROM (AT24C1024): Special functions -> Enter sleep mode to save current, reading the logging data via serial line
Dependencies: AT24C1024 BMP180 M41T62 RHT03 TextLCD WakeUp mbed
Fork of LPC1114_barometer_with_data_logging by
Please refer following Notebook.
http://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-data-logger/
Revision 9:ce80da60884a, committed 2014-06-13
- Comitter:
- kenjiArai
- Date:
- Fri Jun 13 10:41:42 2014 +0000
- Parent:
- 8:f6aa5561f219
- Child:
- 10:398f62bb41f7
- Commit message:
- Barometer program / Step by step approach -> 3rd step,; Setup I2C I/F for BMP180(Baro) & AQM0802A(LCD)
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/baro_BMP180.cpp Fri Jun 13 10:41:42 2014 +0000 @@ -0,0 +1,303 @@ +/* + * mbed Application program for the mbed LPC1114F + * Control Bosch BMP180 Pressure Sensor, LCD "AQM0802A-RN-GBW" + * + * Copyright (C) 2012,'13,'14 Kenji Arai/JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + * September 30th, 2012 Change to STM32L + * August 14th, 2013 + * May 24th, 2014 start mbed LPC1114 + * June 13th, 2014 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/* + *---------------- REFERENCE ---------------------------------------------------------------------- + * https://mbed.org/components/AQM0802A-RN-GBW/ + */ +/* + * LCD module "AQM0802A-RN-GBW" sample program + * + * AQM0802A-RN-GBW is an I2C text LCD panel (Controller: Sitronix ST7032i) + * I bought this from AKIZUKI DENSHI TSUSHO CO.,LTD. + * http://akizukidenshi.com/catalog/g/gP-06669/ (Online shop page (Japanese)) + * http://akizukidenshi.com/download/ds/sitronix/st7032.pdf (datasheet of the chip) + * + * Original Arduino version was developed by + * Copyright (c) 2013 Masahiro WAKAYAMA at SWITCH SCIENCE + * + * Copyright (c) 2013 Yoshihiro TSUBOI + * Released under the MIT License: http://mbed.org/license/mit + * revision 1.0 19-June-2013 a. 1st release + */ +/* + *---------------- REFERENCE ---------------------------------------------------------------------- + * Bosch Sensortec BMP180 Datasheet : BST-BMP180-DS000-09 Revision: 2.5 Date: 5 April 2013 + */ +#include "mbed.h" + +I2C i2c(dp5,dp27); // SDA, SCL + +//------------------------------------------------------------------------------------------------- +// LCD "AQM0802A-RN-GBW" +//------------------------------------------------------------------------------------------------- +// LCD fixed address +const int AQCM0802_addr = 0x7C; +// LCD contrast data +unsigned char contrast = 0; // 0-63 +char lcd_dt[2]; + +// LCD Control Program +void lcd_cmd(char x) { // Set command + lcd_dt[0] = 0x00; // CO = 0,RS = 0 + lcd_dt[1] = x; + i2c.write(AQCM0802_addr, lcd_dt, 2); +} + +void lcd_contdata(char x) { + lcd_dt[0] = 0xC0; //0b11000000 CO = 1, RS = 1 + lcd_dt[1] = x; + i2c.write(AQCM0802_addr, lcd_dt, 2); +} + +void lcd_lastdata(char x) { + lcd_dt[0] = 0x40; //0b10000000 CO = 0, RS = 1 + lcd_dt[1] = x; + i2c.write(AQCM0802_addr, lcd_dt, 2); +} + +void lcd_printStr(const char *s) { // Print strings + while(*s) { + if(*(s + 1)) { + lcd_contdata(*s); + } else { + lcd_lastdata(*s); + } + s++; + } +} + +void lcd_init() { // Initialize LCD + wait(0.04); + // LCD initialize + lcd_cmd(0x38); // function set + lcd_cmd(0x39); // function set + lcd_cmd(0x04); // EntryModeSet + lcd_cmd(0x14); // interval osc + lcd_cmd(0x70 | (contrast & 0xF)); // contrast Low + lcd_cmd(0x5C | ((contrast >> 4) & 0x3)); // contast High/icon/power + lcd_cmd(0x6C); // follower control + wait(0.2); + lcd_cmd(0x38); // function set + lcd_cmd(0x0C); // Display On + lcd_cmd(0x01); // Clear Display + wait(0.2); // need additional wait to Clear Display +} + +void lcd_setCursor(unsigned char x,unsigned char y) { // Set cursor position + lcd_cmd(0x80 | (y * 0x40 + x)); +} + +void setContrast(unsigned char c) { + lcd_cmd(0x39); + lcd_cmd(0x70 | (c & 0x0f)); // contrast Low + lcd_cmd(0x5C | ((c >> 4) & 0x03)); // contast High/icon/power + lcd_cmd(0x38); +} + +//------------------------------------------------------------------------------------------------- +// Barometer +//------------------------------------------------------------------------------------------------- +// Barometer I2C ADDDRESS +// 7bit address = 0b1110111(0x77) -> 8bit = 0b11101110(0xee) -> 0xef(Read) or 0xee(Write) +#define BMP180ADDR 0xee // No other choice + +// Over sampling Enable (1) or not(0) +#define OSS_ON 1 + +// Bosch barmeter ID +#define BMP180_CHIP_ID 0x55 +#define UNKNOWN_ID 0 + +// register address +#define BARO_PROM_ADDR 0xaa +#define BARO_CHIP_ID_REG 0xd0 +#define BARO_VERSION_REG 0xd1 +#define BARO_CTRL_MEAS_REG 0xf4 +#define BARO_ADC_OUT_MSB_REG 0xf6 +#define BARO_ADC_OUT_LSB_REG 0xf7 +#define BARO_SOFT_RESET_REG 0xe0 + +// Calibration coefficients address +#define B_AC1 0xaa +#define B_AC2 0xac +#define B_AC3 0xae +#define B_AC4 0xb0 +#define B_AC5 0xb2 +#define B_AC6 0xb4 +#define B_B1 0xb6 +#define B_B2 0xb8 +#define B_MB 0xba +#define B_MC 0xbc +#define B_MD 0xbe + +#define CONST_MG 3038 +#define CONST_MH 7357 +#define CONST_MI 3791 + +// Control data +#define BARO_PROM_DATA__LEN 22 +#define B_TEMP_MEASURE 0x2e // temperature measurent +#define B_PRES_MEASURE 0x34 // pressure measurement +#define B_PRES_MEASURE_OSS3 0xf4 // pressure /over sampling #3 +#define B_RESET_CMD 0xb6 // Reset chip command + +const char BMP180_addr = BMP180ADDR; // define the I2C Address + +// Barometer +uint32_t baro_pres_data; // Barometer /normalized +int16_t baro_temp_data; +uint32_t baro_pressure_ave_data; // Temperature /normalized +int16_t baro_temp_ave_data; +uint8_t sensor_type; // Get sensor ID + +// Raw data +char baro_dt[BARO_PROM_DATA__LEN]; +int32_t raw_pres; +int32_t raw_temp; +uint8_t oss_setting; + +// EEPROM Data (Coefficient data) +int16_t eep_ac1; +int16_t eep_ac2; +int16_t eep_ac3; +uint16_t eep_ac4; +uint16_t eep_ac5; +uint16_t eep_ac6; +int16_t eep_b1; +int16_t eep_b2; +int16_t eep_mb; // not use +int16_t eep_mc; +int16_t eep_md; + +// Barometer Control Program +void baro_st_conv_temp( void ){ // Start Conversion / temperature + baro_dt[0] = BARO_CTRL_MEAS_REG; + baro_dt[1] = B_TEMP_MEASURE; + i2c.write(BMP180_addr, baro_dt, 2); +} + +void baro_rd_press( void ){ // Read temperature + baro_dt[0] = BARO_ADC_OUT_MSB_REG; + i2c.write(BMP180_addr, baro_dt, 1); + i2c.read(BMP180_addr,baro_dt,3); + raw_pres = ( baro_dt[0] << 16 | baro_dt[1] << 8 | baro_dt[2] ) >> (8 - oss_setting ); +} + +void baro_st_conv_press( void ){ // Start Conversion / Pressure + oss_setting = 3; + baro_dt[0] = BARO_CTRL_MEAS_REG; + baro_dt[1] = B_PRES_MEASURE_OSS3; + i2c.write(BMP180_addr, baro_dt, 2); +} + +void baro_rd_temp( void ){ // Read pressure + baro_dt[0] = BARO_ADC_OUT_MSB_REG; + i2c.write(BMP180_addr, baro_dt, 1); + i2c.read(BMP180_addr,baro_dt,3); + raw_temp = baro_dt[0] << 8 | baro_dt[1]; +} + +void baro_rd_coefficient( void ){ // Read Coefficient data +uint16_t i; + + for( i= 0; i < BARO_PROM_DATA__LEN; i++ ){ + baro_dt[i] = 0; + } + baro_dt[0] = BARO_PROM_ADDR; + i2c.write(BMP180_addr, baro_dt, 1); + i2c.read(BMP180_addr,baro_dt,BARO_PROM_DATA__LEN); + // parameters AC1-AC6 + eep_ac1 = (baro_dt[0] << 8) | baro_dt[1]; + eep_ac2 = (baro_dt[2] << 8) | baro_dt[3]; + eep_ac3 = (baro_dt[4] << 8) | baro_dt[5]; + eep_ac4 = (baro_dt[6] << 8) | baro_dt[7]; + eep_ac5 = (baro_dt[8] << 8) | baro_dt[9]; + eep_ac6 = (baro_dt[10] << 8) | baro_dt[11]; + // parameters B1,B2 + eep_b1 = (baro_dt[12] << 8) | baro_dt[13]; + eep_b2 = (baro_dt[14] << 8) | baro_dt[15]; + // parameters MB,MC,MD + eep_mb = (baro_dt[16] << 8) | baro_dt[17]; + eep_mc = (baro_dt[18] << 8) | baro_dt[19]; + eep_md = (baro_dt[20] << 8) | baro_dt[21]; +} + +void baro_rd_id( void ){ // Read Chip ID + baro_dt[0] = BARO_CHIP_ID_REG; + i2c.write(BMP180_addr, baro_dt, 1); + i2c.read(BMP180_addr,baro_dt,1); + sensor_type = baro_dt[0]; +} + +/* + * Pressure Nomailzation + * Reference: Bosch Sensortec BMP180 Datasheet=BST-BMP180-DS000-09 + * Revision: 2.5 Date: 5 April 2013 Page15 + * http://www.bosch-sensortec.com/homepage/products_3/environmental_sensors_1/bmp180_1/bmp180 + */ +void cal_pressure( void ){ +int32_t dt_x1 = 0, dt_x2 = 0, dt_x3, dt_b3, dt_b5 = 0, dt_b6; +uint32_t dt_b4, dt_b7; +long long int d; + + if ( sensor_type == BMP180_CHIP_ID ){ + dt_x1 = ( ( raw_temp - (int32_t)eep_ac6 ) * (int32_t)eep_ac5 ) >> 15; + dt_x2 = ( (int32_t)eep_mc << 11 ) / ( dt_x1 + (int32_t)eep_md ); + dt_b5 = dt_x1 + dt_x2; + } + baro_temp_data = ( ( dt_b5 + 8 ) >> 4 );// temperature in 0.1 degC + // Cal_pressure + dt_b6 = dt_b5 - 4000; + dt_x1 = ( dt_b6 * dt_b6 ) >> 12; + dt_x1 *= eep_b2; + dt_x1 >>= 11; + dt_x2 = ( eep_ac2 * dt_b6 ); + dt_x2 >>= 11; + dt_x3 = dt_x1 + dt_x2; + dt_b3 = ( ((((long)eep_ac1) * 4 + dt_x3 ) << oss_setting ) + 2 ) >> 2; + dt_x1 = ( eep_ac3 * dt_b6 ) >> 13; + dt_x2 = ( eep_b1 * ( ( dt_b6 * dt_b6 ) >> 12 ) ) >> 16; + dt_x3 = ( ( dt_x1 + dt_x2 ) + 2 ) >> 2; + dt_b4 = ( eep_ac4 * (uint32_t)(dt_x3 + 32768)) >> 15; + dt_b7 = ( (uint32_t)( raw_pres - dt_b3 ) * ( 50000>> oss_setting ) ); + if (dt_b7 < 0x80000000){ + baro_pres_data = (dt_b7 << 1) / dt_b4; + } else { + baro_pres_data = (dt_b7 / dt_b4) << 1; + } + d = (long long int)baro_pres_data; + d *= d; + dt_x1 = (int32_t)( d / 65536 ); + dt_x1 = ( dt_x1 * CONST_MG ) >> 16; + dt_x2 = ( CONST_MH * baro_pres_data ) >> 16; + dt_x2 *= -1; + // pressure in Pa + baro_pres_data += ( dt_x1 + dt_x2 + CONST_MI ) >> 4; + /* averaging */ + if ( baro_pressure_ave_data == 0){ + baro_pressure_ave_data = baro_pres_data; + } else { + baro_pressure_ave_data = (( baro_pressure_ave_data * 9 ) + ( baro_pres_data * 1 )) / 10; + } + if ( baro_temp_ave_data == 0){ + baro_temp_ave_data = baro_temp_data; + } else { + baro_temp_ave_data = (( baro_temp_ave_data * 9 ) + ( baro_temp_data * 1 )) / 10; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lcd_AQM0802A.cpp Fri Jun 13 10:41:42 2014 +0000 @@ -0,0 +1,217 @@ +/* + * LCD module "AQM0802A-RN-GBW" sample program + * + * AQM0802A-RN-GBW is an I2C text LCD panel (Controller: Sitronix ST7032i) + * I bought this from AKIZUKI DENSHI TSUSHO CO.,LTD. + * http://akizukidenshi.com/catalog/g/gP-06669/ (Online shop page (Japanese)) + * http://akizukidenshi.com/download/ds/sitronix/st7032.pdf (datasheet of the chip) + * + * Original Arduino version was developed by + * Copyright (c) 2013 Masahiro WAKAYAMA at SWITCH SCIENCE + * + * Copyright (c) 2013 Yoshihiro TSUBOI + * + * Released under the MIT License: http://mbed.org/license/mit + * + * revision 1.0 19-June-2013 a. 1st release + * + */ +/* + * CAUTION!!!!!! + * NOT USE THIS FILE because most of functions were coppied into AQM0802A.h file + * + * Modified by Kenji Arai/JH1PJL + * http://www.page.sannet.ne.jp/kenjia/index.html + * http://mbed.org/users/kenjiArai/ + */ +#if 0 + #include "mbed.h" + +I2C i2c(dp5, dp27); // sda, scl +const int AQCM0802_addr = 0x7C; + +unsigned char mode; +unsigned char contrast = 0; // 0-63 +unsigned char contrastFlag = false; +int CGcounter; +int FADEcounter; + +void lcd_cmd(char x) { + char data[2]; + data[0] = 0x00; // CO = 0,RS = 0 + data[1] = x; + i2c.write(AQCM0802_addr, data, 2); +} + +void lcd_contdata(char x) { + char data[2]; + data[0] = 0xC0; //0b11000000 CO = 1, RS = 1 + data[1] = x; + i2c.write(AQCM0802_addr, data, 2); +} + +void lcd_lastdata(char x) { + char data[2]; + data[0] = 0x40; //0b11000000 CO = 0, RS = 1 + data[1] = x; + i2c.write(AQCM0802_addr, data, 2); +} + +void lcd_printStr(const char *s) { + while(*s) { + if(*(s + 1)) { + lcd_contdata(*s); + } else { + lcd_lastdata(*s); + } + s++; + } +} + +void lcd_printHex(unsigned char num) { + lcd_contdata(num); +} + +void lcd_init() { + wait(0.04); + // LCD initialize + lcd_cmd(0x38); // function set + lcd_cmd(0x39); // function set + lcd_cmd(0x04); // EntryModeSet + lcd_cmd(0x14); // interval osc + lcd_cmd(0x70 | (contrast & 0xF)); // contrast Low + lcd_cmd(0x5C | ((contrast >> 4) & 0x3)); // contast High/icon/power + lcd_cmd(0x6C); // follower control + wait(0.2); + lcd_cmd(0x38); // function set + lcd_cmd(0x0C); // Display On + lcd_cmd(0x01); // Clear Display + wait(0.2); // need additional wait to Clear Display +} + +void lcd_setCursor(unsigned char x,unsigned char y) { + lcd_cmd(0x80 | (y * 0x40 + x)); +} + +unsigned char cg[13 * 8] = { +/* + 0b00001111,0b00010000,0b00010000,0b00001110,0b00000001,0b00000001,0b00011110,0b00000000, + 0b00010001,0b00010001,0b00010001,0b00010101,0b00010101,0b00010101,0b00001010,0b00000000, + 0b00001110,0b00000100,0b00000100,0b00000100,0b00000100,0b00000100,0b00001110,0b00000000, + 0b00011111,0b00000100,0b00000100,0b00000100,0b00000100,0b00000100,0b00000100,0b00000000, + 0b00001110,0b00010001,0b00010000,0b00010000,0b00010000,0b00010001,0b00001110,0b00000000, + 0b00010001,0b00010001,0b00010001,0b00011111,0b00010001,0b00010001,0b00010001,0b00000000, +*/ + 0x0F,0x10,0x10,0x0E,0x01,0x01,0x1E,0x00, // S + 0x11,0x11,0x11,0x15,0x15,0x15,0x0A,0x00, // W + 0x0E,0x40,0x40,0x40,0x40,0x40,0x0E,0x00, // I + 0x1F,0x40,0x40,0x40,0x40,0x40,0x40,0x00, // T + 0x0E,0x11,0x10,0x10,0x10,0x11,0x0E,0x00, // C + 0x11,0x11,0x11,0x1F,0x11,0x11,0x11,0x00, // H +/* + 0b00001111,0b00010000,0b00010000,0b00001110,0b00000001,0b00000001,0b00011110,0b00000000, + 0b00001110,0b00010001,0b00010000,0b00010000,0b00010000,0b00010001,0b00001110,0b00000000, + 0b00001110,0b00000100,0b00000100,0b00000100,0b00000100,0b00000100,0b00001110,0b00000000, + 0b00011111,0b00010000,0b00010000,0b00011110,0b00010000,0b00010000,0b00011111,0b00000000, + 0b00010001,0b00010001,0b00011001,0b00010101,0b00010011,0b00010001,0b00010001,0b00000000, + 0b00001110,0b00010001,0b00010000,0b00010000,0b00010000,0b00010001,0b00001110,0b00000000, + 0b00011111,0b00010000,0b00010000,0b00011110,0b00010000,0b00010000,0b00011111,0b00000000, +*/ + 0x0F,0x10,0x10,0x0E,0x01,0x01,0x1E,0x00, // S + 0x0E,0x11,0x10,0x10,0x10,0x11,0x0E,0x00, // C + 0x0E,0x40,0x40,0x40,0x40,0x40,0x0E,0x00, // I + 0x1F,0x10,0x10,0x1E,0x10,0x10,0x1F,0x00, // E + 0x11,0x11,0x19,0x15,0x13,0x11,0x11,0x00, // N + 0x0E,0x11,0x10,0x10,0x10,0x11,0x0E,0x00, // C + 0x1F,0x10,0x10,0x1E,0x10,0x10,0x1F,0x00 // E +}; + +void setCG(int src,int dst,int len) { + lcd_cmd(0x38); + lcd_cmd(0x40 + dst); + if (src >= 0) { + for (int i = 0;i < len;i++) lcd_printHex(cg[src + i]); + } else { + for (int i = 0;i < len;i++) lcd_printHex(0); + } +} + +void setContrast(unsigned char c) { + lcd_cmd(0x39); + lcd_cmd(0x70 | (c & 0x0f)); // contrast Low + lcd_cmd(0x5C | ((c >> 4) & 0x03)); // contast High/icon/power + lcd_cmd(0x38); +} + +int main() { + lcd_init(); + while(1) { + switch(mode) { + case 0: // init + lcd_setCursor(0, 0); + for (int i = 0;i < 6;i++) lcd_printHex(i); + lcd_setCursor(1, 1); + lcd_printStr(" "); + setCG(-1,0,6 * 8); + contrast = 35; + setContrast(contrast); + CGcounter = 0; + mode++; + break; + case 1: // SWITCH + if(CGcounter <= (6 * 8)) { + setCG((CGcounter / 8) * 8,((CGcounter / 8) * 8) + 7 - (CGcounter % 8),CGcounter % 8); + CGcounter++; + } else { + lcd_setCursor(0, 0); + lcd_printStr("SWITCH"); + setCG(-1,0,3 * 8); + lcd_setCursor(1, 1); + for (int i = 0;i < 3;i++) lcd_printHex(i); + CGcounter = 0; + mode++; + } + break; + case 2: // SCI + if(CGcounter <= (3 * 8)) { + setCG(((CGcounter / 8) + 6) * 8,((CGcounter / 8) * 8) + 7 - (CGcounter % 8),CGcounter % 8); + CGcounter++; + } else { + lcd_setCursor(1, 1); + lcd_printStr("SCI"); + setCG(-1,0,4 * 8); + lcd_setCursor(4, 1); + for (int i = 0;i < 4;i++) lcd_printHex(i); + CGcounter = 0; + mode++; + } + break; + case 3: // ENCE + if(CGcounter <= (4 * 8)) { + setCG(((CGcounter / 8) + 9) * 8,((CGcounter / 8) * 8) + 7 - (CGcounter % 8),CGcounter % 8); + CGcounter++; + } else { + lcd_setCursor(4, 1); + lcd_printStr("ENCE"); + FADEcounter = 0; + mode++; + } + break; + case 4: + if (contrastFlag == false) { + if (++contrast >= 54) contrastFlag = true; + } else { + if (--contrast <= 17) { + contrastFlag = false; + if(++FADEcounter >= 2) { + mode = 0; + } + } + } + setContrast(contrast); + break; + } + wait(0.05); + } +} +#endif
--- a/main.cpp Fri Jun 13 07:45:15 2014 +0000 +++ b/main.cpp Fri Jun 13 10:41:42 2014 +0000 @@ -16,7 +16,8 @@ */ #include "mbed.h" -#define DEBUG 1 // 1=Debug, 0=Normal +#define DEBUG_L1 1 // 1=Debug, 0=Normal +#define DEBUG_L2 1 // 1=Debug, 0=Normal #define VREF_VOLT 2.482 // TA76431F Vref real measued data #define R_FIX 9930 // 10K ohm <- real measued data @@ -36,16 +37,170 @@ typedef enum {CDS = 0, VREF, VOL} ADC_Select; +// ADC float av_cds, av_vref, av_vol, cal_vcc; float r_cds, lux; uint32_t nor_vol; +// LCD +extern unsigned char contrast; +char buf[16]; + +// Barometer +extern uint32_t baro_pressure_ave_data; // Temperature /normalized +extern int16_t baro_temp_ave_data; +extern uint32_t baro_pres_data; // Barometer /normalized +extern int16_t baro_temp_data; + // Cds GL5528 (Dark Resistance 1 Mohm type) SENBA OPTICAL & ELECTRONIC CO.,LTD. // Table value referrence: http://homepage3.nifty.com/skomo/f35/hp35_20.htm const float lux_cds[CDS_TBL_SIZE][2] = {{50,21194},{100,8356},{200,3294},{400,1299},{800,512},{1600,202},{3200,79.6},{6400,31.4}, {12800,12.4},{25600,4.88},{51200,1.92},{102400,0.758},{409600,0.118}}; +#if DEBUG_L2 +char *const imsg0 = "-->Control Reg."; +char *const imsg1 = "-->Status Reg."; +char *const imsg2 = "-->Data Reg."; +char *const imsg3 = "-->Clock control Reg."; +static char *const io_port_name0 = "PIO0_"; +static char *const iomsg0 = "Func->select "; +static char *const iomsg1 = "IO"; +static char *const iomsg2 = "Reserved"; +static char *const iomsg3 = "Std/F-md I2C"; +#endif // DEBUG_L2 + +// Functions +// Barometer +void baro_st_conv_temp( void ); // Start Conversion +void baro_st_conv_press( void ); // Start Conversion +void baro_rd_temp( void ); // Receive Press. & Temp. +void baro_rd_press( void ); // Receive Press. & Temp. +void baro_rd_coefficient( void ); // Receive Coefficient data +void baro_rd_id( void ); // Receive Chip ID +void cal_pressure( void ); // Calculate Pressure +// LCD +void lcd_init(); // Initialize LCD +void lcd_printStr(const char *s); // Put strings +void lcd_setCursor(unsigned char x,unsigned char y); // Set cursor position +void setContrast(unsigned char c); // Set contrast + +//------------------------------------------------------------------------------------------------- +// Control Program +//------------------------------------------------------------------------------------------------- +#if DEBUG_L2 +// Put \r\n +void put_rn ( void ){ + pc.putc('\r'); + pc.putc('\n'); +} + +// Put \r +void put_r ( void ){ + pc.putc('\r'); +} + +// Put ", " +void put_lin ( void ){ + pc.printf(", "); +} + +void debug_port_check( void ){ +uint32_t r0,r1,r2,r3,r4,r5,r6,r7; + // Show registers + put_rn(); + pc.printf( "------- Show Registers -------" ); + put_rn(); + pc.printf( "**** P0_4,P0_5 Port usage ****" ); + put_rn(); + // P0_4 + r0 = LPC_IOCON->PIO0_4; + pc.printf( "%s4(dp27)",io_port_name0 ); + pc.printf( " 0x%08x", r0 ); + put_rn(); + pc.printf( iomsg0 ); + switch ( r0 & 0x7 ){ + case 0: pc.printf( iomsg1 ); break; + case 1: pc.printf("SCL"); break; + } + put_lin(); + switch ( ( r0 >> 8 ) & 0x3 ){ + case 0: pc.printf( iomsg3 ); break; + case 1: pc.printf( iomsg1); break; + case 2: pc.printf("Fast md"); break; + case 3: pc.printf( iomsg2 ); break; + } + put_rn(); + // P0_5 + r0 = LPC_IOCON->PIO0_5; + pc.printf( "%s5(dp5)",io_port_name0 ); + pc.printf( " 0x%08x", r0 ); + put_rn(); + pc.printf( iomsg0 ); + switch ( r0 & 0x7 ){ + case 0: pc.printf( iomsg1 ); break; + case 1: pc.printf("SDA"); break; + } + put_lin(); + switch ( ( r0 >> 8 ) & 0x3 ){ + case 0: pc.printf( iomsg3 ); break; + case 1: pc.printf( iomsg1 ); break; + case 2: pc.printf("Fast md"); break; + case 3: pc.printf( iomsg2 ); break; + } + put_rn(); + // I2C Control register + r0 = LPC_I2C->CONSET; + r1 = LPC_I2C->STAT; + r2 = LPC_I2C->DAT; + r3 = LPC_I2C->SCLH; + r4 = LPC_I2C->SCLL; + r5 = LPC_I2C->CONCLR; + r6 = LPC_I2C->MMCTRL; + r7 = LPC_I2C->DATA_BUFFER; + pc.printf( "**** Show I2C Registers ****" ); + put_rn(); + pc.printf( "CONSET" ); + pc.printf( imsg0 ); + pc.printf( " 0x%08x", r0 ); + put_rn(); + pc.printf( "STAT" ); + pc.printf( imsg1 ); + pc.printf( " 0x%08x", r1 ); + put_rn(); + pc.printf( "DAT" ); + pc.printf( imsg2 ); + pc.printf( " 0x%08x", r2 ); + put_rn(); + pc.printf( "ADR0--Not support" ); + put_rn(); + pc.printf( "SCLH" ); + pc.printf( imsg0 ); + pc.printf( " 0x%08x", r3 ); + put_rn(); + pc.printf( "SCLL" ); + pc.printf( imsg0 ); + pc.printf( " 0x%08x", r4 ); + put_rn(); + pc.printf( "CONCLR" ); + pc.printf( imsg0 ); + pc.printf( " 0x%08x", r5 ); + put_rn(); + pc.printf( "MMCTRL" ); + pc.printf( imsg0 ); + pc.printf( " 0x%08x", r6 ); + put_rn(); + pc.printf( "ADR1,2,3--Not support" ); + put_rn(); + pc.printf( "DATA_BUFFER" ); + pc.printf( imsg3 ); + pc.printf( " 0x%08x", r7 ); + put_rn(); + pc.printf( "MASK0,1,2,3--Not support" ); + put_rn(); +} +#endif // DEBUG_L2 + void adc_normalize( ADC_Select n ){ int i; float x1,y1,dx; @@ -62,23 +217,35 @@ break; } } -#if DEBUG - pc.printf("i=%d, ", i); -#endif +#if DEBUG_L1 + pc.printf( "i=%d, ", i ); +#endif // DEBUG_L1 if (i == 0){ lux = lux_cds[0][1]; +#if DEBUG_L1 + pc.printf( "range over!\r\n" ); +#endif // DEBUG_L1 } else if ( i == CDS_TBL_SIZE ){ - if ( r_cds <= lux_cds[i][0]){ + if ( r_cds <= lux_cds[i][0] ){ lux = lux_cds[i-1][1]; } } else { + if ( i == CDS_TBL_SIZE ){ + if ( r_cds <= lux_cds[i][0] ){ + lux = lux_cds[i-1][1]; +#if DEBUG_L1 + pc.printf("range over!\r\n"); +#endif // DEBUG_L1 + break; + } + } y1 = lux_cds[i-1][1] - lux_cds[i][1]; x1 = lux_cds[i][0] - lux_cds[i-1][0]; dx = r_cds - lux_cds[i-1][0]; lux = lux_cds[i-1][1] - ((dx/x1) * y1); -#if DEBUG - pc.printf("y1:%f, x1:%f, dx:%f, lux_tbl:%f\r\n", y1, x1, dx, lux_cds[i-1][1]); -#endif +#if DEBUG_L1 + pc.printf( "y1:%f, x1:%f, dx:%f, lux_tbl:%f\r\n", y1, x1, dx, lux_cds[i-1][1] ); +#endif // DEBUG_L1 } break; case VREF: @@ -114,27 +281,83 @@ } int main() { +uint16_t dt; + pc.baud(9600); - pc.printf("mbed LPC1114FN28 test program by JH1PJL created on "__DATE__"\r\n"); + pc.printf( "\r\nmbed LPC1114FN28 test program by JH1PJL created on "__DATE__"\r\n" ); + // Initialize ADC + adc_init(); + // Initialize LCD + lcd_init(); + contrast = 25; + setContrast(contrast); + //Initial screen shot + lcd_setCursor(0, 0); + // 12345678 + lcd_printStr("LPC1114F"); + lcd_setCursor(0, 1); + // 12345678 + lcd_printStr(" JH1PJL "); + // Read BMP180 data / only once + baro_rd_id(); + baro_rd_coefficient(); + wait(5.0); while(1) { + // Power on / Analog sensor analog_pwr = 1; vref_pwr = 1; wait(0.2); adc_all_read(); - //analog_pwr = 0; + // Power off / Analog sensor + analog_pwr = 0; + //vref_pwr = 0; + // Normalize adc_normalize( CDS ); adc_normalize( VREF ); - adc_normalize( VOL ); + adc_normalize( VOL ); myled0 = 1; - myled1 = 1; if (sw_chng == 1){ // SW Off - pc.printf("CDS:%.0fohm -> %.1flux, Vcc:%.3fV, Vol:%d\r\n", r_cds, lux, cal_vcc, nor_vol); + pc.printf( "\r\nCds:%.0fohm -> %.1flux, Vcc:%.3fV, Vol:%d\r\n", + r_cds, lux, cal_vcc, nor_vol ); } else { // SW On - pc.printf("CDS:%f, Vref:%f, Vol:%f\r\n", av_cds, av_vref, av_vol); + pc.printf( "\r\nCds:%f, Vref:%f, Vol:%f\r\n", av_cds, av_vref, av_vol ); } myled0 = 0; + lcd_setCursor(0, 0); // 1st line top + dt = (uint16_t)(lux * 10); + //sprintf( buf,"l: %4.1f ", lux ); + sprintf( buf,"L:%4d.%01d ", dt / 10, dt % 10 ); + lcd_printStr(buf); + lcd_setCursor(0, 1); // 2nd line top + sprintf( buf,"V: %1.3f ", cal_vcc ); + lcd_printStr(buf); + wait(4.0); + baro_st_conv_temp(); // start temprerature measurment + wait(0.25); // wait for convertion + baro_rd_temp(); // read it + baro_st_conv_press(); // start pressure measurement + wait(0.5); // wait for convertion + baro_rd_press(); // read it + cal_pressure(); // Calculate baro & temp. + lcd_setCursor(0, 0); // 1st line top + sprintf( buf,"P:%4d.%01d ", baro_pres_data / 100, ( baro_pres_data % 100 ) /10 ); + lcd_printStr(buf); + lcd_setCursor(0, 1); // 2nd line top + if (sw_chng == 0){ // SW ON + baro_temp_data = -100; // Dummy -10.0 degC -> Test printf() minus display + } + sprintf( buf,"T: %\+-d.%01d ", baro_temp_data / 10, baro_temp_data% 10 ); + lcd_printStr(buf); + myled1 = 1; + pc.printf( "Pres:%4d.%01dhPa, Temp:%\+-d.%01ddegC\r\n", + baro_pres_data / 100, ( baro_pres_data % 100 ) /10, + baro_temp_data / 10, baro_temp_data% 10 ); myled1 = 0; - wait(0.8); + wait(3.0); +#if DEBUG_L2 + debug_port_check(); +#endif // DEBUG_L2 + wait(1.0); } }
--- a/mbed.bld Fri Jun 13 07:45:15 2014 +0000 +++ b/mbed.bld Fri Jun 13 10:41:42 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/0b3ab51c8877 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/024bf7f99721 \ No newline at end of file