Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: AT24C1024 RHT03 TextLCD BMP180 M41T62
Fork of mbed_blinky by
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
