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 Kenji Arai

Please refer following Notebook.
http://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-data-logger/

Committer:
kenjiArai
Date:
Sun Jun 15 03:35:18 2014 +0000
Revision:
11:bccfd75e84a0
Parent:
10:398f62bb41f7
Child:
12:1e21119688fe
Barometer program / Step by step approach -> 5th step,; baro_BMP180.c -> Separated LCD part and BMP180 part and use exsiting Lib.(LCD) and new Lib.(BMP180)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 7:d3b49f1d9f76 1 /*
kenjiArai 7:d3b49f1d9f76 2 * mbed Application program for the mbed LPC1114FN28
kenjiArai 7:d3b49f1d9f76 3 * Test program -> Check LED & Switch function
kenjiArai 7:d3b49f1d9f76 4 *
kenjiArai 7:d3b49f1d9f76 5 * Copyright (c) 2014 Kenji Arai / JH1PJL
kenjiArai 7:d3b49f1d9f76 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 7:d3b49f1d9f76 7 * http://mbed.org/users/kenjiArai/
kenjiArai 7:d3b49f1d9f76 8 * Created: June 13th, 2014
kenjiArai 10:398f62bb41f7 9 * Revised: June 14th, 2014
kenjiArai 7:d3b49f1d9f76 10 *
kenjiArai 7:d3b49f1d9f76 11 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 7:d3b49f1d9f76 12 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 7:d3b49f1d9f76 13 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 7:d3b49f1d9f76 14 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 7:d3b49f1d9f76 15 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 7:d3b49f1d9f76 16 */
dan 0:7dec7e9ac085 17
kenjiArai 11:bccfd75e84a0 18 #include "mbed.h"
kenjiArai 11:bccfd75e84a0 19 #include "BMP180.h" // Pressure sensor
kenjiArai 11:bccfd75e84a0 20 #include "RHT03.h" // Humidity sensor
kenjiArai 11:bccfd75e84a0 21 #include "TextLCD.h"
kenjiArai 8:f6aa5561f219 22
kenjiArai 11:bccfd75e84a0 23 #define VREF_VOLT 2.482 // TA76431F Vref real measued data
kenjiArai 11:bccfd75e84a0 24 #define R_FIX 9930 // 10K ohm <- real measued data
kenjiArai 11:bccfd75e84a0 25 #define VOL_OFFSET 4 // Offset data ,= real measured data
kenjiArai 8:f6aa5561f219 26 #define CDS_TBL_SIZE 13
kenjiArai 7:d3b49f1d9f76 27
kenjiArai 11:bccfd75e84a0 28
kenjiArai 11:bccfd75e84a0 29 I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 7:d3b49f1d9f76 30 DigitalOut myled0(dp28); // LED for Debug
kenjiArai 7:d3b49f1d9f76 31 DigitalOut myled1(dp14); // Indicate state transition
kenjiArai 8:f6aa5561f219 32 DigitalOut analog_pwr(dp6); // VCC for analog interface (vol, cds and vref)
kenjiArai 8:f6aa5561f219 33 DigitalOut vref_pwr(dp4); // VCC for Vref
kenjiArai 7:d3b49f1d9f76 34 DigitalIn sw_chng(dp1,PullUp);// SW for select
kenjiArai 7:d3b49f1d9f76 35 DigitalIn sw_mode(dp2,PullUp);// SW for Mode change
kenjiArai 8:f6aa5561f219 36 AnalogIn cds(dp11); // Input / CDS data
kenjiArai 8:f6aa5561f219 37 AnalogIn vref(dp9); // Input / Bandgap 2.5V
kenjiArai 8:f6aa5561f219 38 AnalogIn vol(dp10); // Input / contrast volume
kenjiArai 10:398f62bb41f7 39 RHT03 humtemp(dp26); // RHT03 interface
kenjiArai 11:bccfd75e84a0 40 Serial pc(dp16,dp15); // UART (vertual COM)
kenjiArai 11:bccfd75e84a0 41 BMP180 bmp180(i2c); // Bosch sensor
kenjiArai 11:bccfd75e84a0 42 TextLCD_I2C_N i2clcd(&i2c, 0x7c, TextLCD::LCD8x2);
kenjiArai 8:f6aa5561f219 43
kenjiArai 8:f6aa5561f219 44 typedef enum {CDS = 0, VREF, VOL} ADC_Select;
kenjiArai 8:f6aa5561f219 45
kenjiArai 9:ce80da60884a 46 // ADC
kenjiArai 8:f6aa5561f219 47 float av_cds, av_vref, av_vol, cal_vcc;
kenjiArai 8:f6aa5561f219 48 float r_cds, lux;
kenjiArai 8:f6aa5561f219 49 uint32_t nor_vol;
kenjiArai 8:f6aa5561f219 50
kenjiArai 10:398f62bb41f7 51 // Humidity Sensor
kenjiArai 10:398f62bb41f7 52 float humidity_temp, humidity;
kenjiArai 10:398f62bb41f7 53
kenjiArai 8:f6aa5561f219 54 // Cds GL5528 (Dark Resistance 1 Mohm type) SENBA OPTICAL & ELECTRONIC CO.,LTD.
kenjiArai 8:f6aa5561f219 55 // Table value referrence: http://homepage3.nifty.com/skomo/f35/hp35_20.htm
kenjiArai 8:f6aa5561f219 56 const float lux_cds[CDS_TBL_SIZE][2] =
kenjiArai 8:f6aa5561f219 57 {{50,21194},{100,8356},{200,3294},{400,1299},{800,512},{1600,202},{3200,79.6},{6400,31.4},
kenjiArai 8:f6aa5561f219 58 {12800,12.4},{25600,4.88},{51200,1.92},{102400,0.758},{409600,0.118}};
kenjiArai 8:f6aa5561f219 59
kenjiArai 9:ce80da60884a 60 //-------------------------------------------------------------------------------------------------
kenjiArai 9:ce80da60884a 61 // Control Program
kenjiArai 9:ce80da60884a 62 //-------------------------------------------------------------------------------------------------
kenjiArai 11:bccfd75e84a0 63 // Normalize ADC data
kenjiArai 8:f6aa5561f219 64 void adc_normalize( ADC_Select n ){
kenjiArai 8:f6aa5561f219 65 int i;
kenjiArai 8:f6aa5561f219 66 float x1,y1,dx;
kenjiArai 8:f6aa5561f219 67
kenjiArai 8:f6aa5561f219 68 switch (n){
kenjiArai 8:f6aa5561f219 69 case CDS:
kenjiArai 11:bccfd75e84a0 70 // v_adc = Rfix / (Rcds + Rfix) -> Rcds = ( Rfix / v_adc ) - Rfix
kenjiArai 8:f6aa5561f219 71 r_cds = (R_FIX / av_cds) - R_FIX;
kenjiArai 8:f6aa5561f219 72 // CDS resistance to Lux conversion using convertion table (luc_cds[][])
kenjiArai 11:bccfd75e84a0 73 for (i =0; i < CDS_TBL_SIZE; i++){ // search table
kenjiArai 11:bccfd75e84a0 74 if ( r_cds <= lux_cds[i][0]){ break; }
kenjiArai 11:bccfd75e84a0 75 }
kenjiArai 11:bccfd75e84a0 76 // Check table position
kenjiArai 11:bccfd75e84a0 77 if (i == 0){
kenjiArai 11:bccfd75e84a0 78 lux = lux_cds[0][1];
kenjiArai 11:bccfd75e84a0 79 break;
kenjiArai 11:bccfd75e84a0 80 } else if ( i == CDS_TBL_SIZE ){
kenjiArai 11:bccfd75e84a0 81 if ( r_cds <= lux_cds[i][0] ){
kenjiArai 11:bccfd75e84a0 82 lux = lux_cds[i-1][1];
kenjiArai 8:f6aa5561f219 83 break;
kenjiArai 8:f6aa5561f219 84 }
kenjiArai 8:f6aa5561f219 85 }
kenjiArai 11:bccfd75e84a0 86 // Linear interpolation
kenjiArai 11:bccfd75e84a0 87 y1 = lux_cds[i-1][1] - lux_cds[i][1];
kenjiArai 11:bccfd75e84a0 88 x1 = lux_cds[i][0] - lux_cds[i-1][0];
kenjiArai 11:bccfd75e84a0 89 dx = r_cds - lux_cds[i-1][0];
kenjiArai 11:bccfd75e84a0 90 lux = lux_cds[i-1][1] - ((dx/x1) * y1);
kenjiArai 8:f6aa5561f219 91 break;
kenjiArai 8:f6aa5561f219 92 case VREF:
kenjiArai 8:f6aa5561f219 93 // vref = VREF_VOLT / VCC -> VCC = VREF_VOLT / vref
kenjiArai 8:f6aa5561f219 94 cal_vcc = VREF_VOLT / vref;
kenjiArai 8:f6aa5561f219 95 break;
kenjiArai 8:f6aa5561f219 96 case VOL:
kenjiArai 8:f6aa5561f219 97 // Vol center = 1.00 (actual 100)
kenjiArai 8:f6aa5561f219 98 nor_vol = (uint32_t)(av_vol * 200) + VOL_OFFSET;
kenjiArai 8:f6aa5561f219 99 break;
kenjiArai 8:f6aa5561f219 100 }
kenjiArai 8:f6aa5561f219 101 }
kenjiArai 8:f6aa5561f219 102
kenjiArai 11:bccfd75e84a0 103 // Read adc data and averaging
kenjiArai 8:f6aa5561f219 104 void adc_all_read( void){
kenjiArai 11:bccfd75e84a0 105 if (av_cds == 0){ av_cds = cds.read();
kenjiArai 11:bccfd75e84a0 106 } else { av_cds = av_cds *0.5 + cds.read() * 0.5;
kenjiArai 10:398f62bb41f7 107 }
kenjiArai 11:bccfd75e84a0 108 if (av_vref == 0){ av_vref = vref.read();
kenjiArai 11:bccfd75e84a0 109 } else { av_vref = av_vref *0.9 + vref.read() * 0.1;
kenjiArai 10:398f62bb41f7 110 }
kenjiArai 11:bccfd75e84a0 111 if (av_vol == 0){ av_vol = vol.read();
kenjiArai 11:bccfd75e84a0 112 } else { av_vol = av_vol *0.2 + vol.read() * 0.8;
kenjiArai 10:398f62bb41f7 113 }
kenjiArai 8:f6aa5561f219 114 }
kenjiArai 8:f6aa5561f219 115
kenjiArai 11:bccfd75e84a0 116 // Read Humidity sensor data
kenjiArai 10:398f62bb41f7 117 void hum_RHT03_read( void){
kenjiArai 11:bccfd75e84a0 118 while (true){ // wait data
kenjiArai 11:bccfd75e84a0 119 if ( humtemp.readData() == RHT_ERROR_NONE ){ break; }
kenjiArai 10:398f62bb41f7 120 }
kenjiArai 11:bccfd75e84a0 121 if (humidity_temp == 0){humidity_temp = humtemp.getTemperatureC();
kenjiArai 11:bccfd75e84a0 122 } else { humidity_temp = humidity_temp * 0.9 + humtemp.getTemperatureC() * 0.1;
kenjiArai 10:398f62bb41f7 123 }
kenjiArai 11:bccfd75e84a0 124 if ( humidity == 0 ){ humidity = humtemp.getHumidity();
kenjiArai 11:bccfd75e84a0 125 } else { humidity = humidity * 0.9 + humtemp.getHumidity() * 0.1;
kenjiArai 10:398f62bb41f7 126 }
kenjiArai 8:f6aa5561f219 127 }
dan 0:7dec7e9ac085 128
kenjiArai 11:bccfd75e84a0 129 //-------------------------------------
kenjiArai 11:bccfd75e84a0 130 // Application program starts here
kenjiArai 11:bccfd75e84a0 131 //-------------------------------------
dan 0:7dec7e9ac085 132 int main() {
kenjiArai 8:f6aa5561f219 133 pc.baud(9600);
kenjiArai 11:bccfd75e84a0 134 pc.printf("\r\nmbed LPC1114FN28 test program by JH1PJL created on "__DATE__"\r\n");
kenjiArai 11:bccfd75e84a0 135 i2clcd.setContrast(25);
kenjiArai 11:bccfd75e84a0 136 i2clcd.locate(0, 0);
kenjiArai 11:bccfd75e84a0 137 i2clcd.printf("LPC1114F");
kenjiArai 11:bccfd75e84a0 138 i2clcd.locate(0, 1);
kenjiArai 11:bccfd75e84a0 139 i2clcd.printf(" JH1PJL ");
kenjiArai 10:398f62bb41f7 140 // Initialize data
kenjiArai 10:398f62bb41f7 141 av_cds = 0;
kenjiArai 10:398f62bb41f7 142 av_vref = 0;
kenjiArai 10:398f62bb41f7 143 av_vol = 0;
kenjiArai 10:398f62bb41f7 144 humidity_temp = 0;
kenjiArai 10:398f62bb41f7 145 humidity = 0;
kenjiArai 11:bccfd75e84a0 146 // Show initial screen
kenjiArai 11:bccfd75e84a0 147 wait(5.0);
kenjiArai 7:d3b49f1d9f76 148 while(1) {
kenjiArai 11:bccfd75e84a0 149 // ---------- Cds Sensor, Vref, Volume ---------------------------------------------------
kenjiArai 9:ce80da60884a 150 // Power on / Analog sensor
kenjiArai 8:f6aa5561f219 151 analog_pwr = 1;
kenjiArai 8:f6aa5561f219 152 vref_pwr = 1;
kenjiArai 8:f6aa5561f219 153 wait(0.2);
kenjiArai 8:f6aa5561f219 154 adc_all_read();
kenjiArai 9:ce80da60884a 155 // Power off / Analog sensor
kenjiArai 11:bccfd75e84a0 156 analog_pwr = 0;
kenjiArai 9:ce80da60884a 157 // Normalize
kenjiArai 11:bccfd75e84a0 158 adc_normalize(CDS);
kenjiArai 11:bccfd75e84a0 159 adc_normalize(VREF);
kenjiArai 11:bccfd75e84a0 160 adc_normalize(VOL);
kenjiArai 8:f6aa5561f219 161 myled0 = 1;
kenjiArai 8:f6aa5561f219 162 if (sw_chng == 1){ // SW Off
kenjiArai 9:ce80da60884a 163 pc.printf( "\r\nCds:%.0fohm -> %.1flux, Vcc:%.3fV, Vol:%d\r\n",
kenjiArai 9:ce80da60884a 164 r_cds, lux, cal_vcc, nor_vol );
kenjiArai 8:f6aa5561f219 165 } else { // SW On
kenjiArai 9:ce80da60884a 166 pc.printf( "\r\nCds:%f, Vref:%f, Vol:%f\r\n", av_cds, av_vref, av_vol );
kenjiArai 7:d3b49f1d9f76 167 }
kenjiArai 8:f6aa5561f219 168 myled0 = 0;
kenjiArai 11:bccfd75e84a0 169 i2clcd.locate(0, 0); // 1st line top
kenjiArai 11:bccfd75e84a0 170 // 12345678
kenjiArai 11:bccfd75e84a0 171 i2clcd.printf("L: %4.1f", lux);
kenjiArai 11:bccfd75e84a0 172 i2clcd.locate(0, 1); // 2nd line top
kenjiArai 11:bccfd75e84a0 173 i2clcd.printf("V: %1.3f", cal_vcc);
kenjiArai 10:398f62bb41f7 174 wait(2.0);
kenjiArai 11:bccfd75e84a0 175 // ---------- Barometer Sensor / BMP180 --------------------------------------------------
kenjiArai 11:bccfd75e84a0 176 bmp180.normalize();
kenjiArai 11:bccfd75e84a0 177 i2clcd.locate(0, 0); // 1st line top
kenjiArai 11:bccfd75e84a0 178 i2clcd.printf("P:%4.1f", bmp180.read_pressure());
kenjiArai 11:bccfd75e84a0 179 i2clcd.locate(0, 1); // 2nd line top
kenjiArai 11:bccfd75e84a0 180 i2clcd.printf("T: %\+-0.1f", bmp180.read_temperature());
kenjiArai 9:ce80da60884a 181 myled1 = 1;
kenjiArai 11:bccfd75e84a0 182 pc.printf("Pres:%4.1fhPa, Temp:%\+-0.1fdegC\r\n",
kenjiArai 11:bccfd75e84a0 183 bmp180.read_pressure(), bmp180.read_temperature());
kenjiArai 8:f6aa5561f219 184 myled1 = 0;
kenjiArai 10:398f62bb41f7 185 wait(4.0);
kenjiArai 11:bccfd75e84a0 186 // ---------- Humidity Sensor / RHT03 ----------------------------------------------------
kenjiArai 10:398f62bb41f7 187 hum_RHT03_read(); // Read Humidity data then avaraging
kenjiArai 11:bccfd75e84a0 188 i2clcd.locate(0, 0); // 1st line top
kenjiArai 11:bccfd75e84a0 189 i2clcd.printf("H: %2.1f", humidity);
kenjiArai 11:bccfd75e84a0 190 i2clcd.locate(0, 1); // 2nd line top
kenjiArai 11:bccfd75e84a0 191 i2clcd.printf("T: %\+-0.1f", humidity_temp);
kenjiArai 10:398f62bb41f7 192 myled1 = 1;
kenjiArai 11:bccfd75e84a0 193 pc.printf("Humid: %0.1f%cRH, Temp:%\+-0.1fdegC\r\n", humidity, '%', humidity_temp);
kenjiArai 10:398f62bb41f7 194 myled1 = 0;
kenjiArai 10:398f62bb41f7 195 wait(2.0);
kenjiArai 7:d3b49f1d9f76 196 }
dan 0:7dec7e9ac085 197 }