Barometer program : Data Logger function includes Barometer & temperature (BMP180), Humidity & temp. (RHT03), Sunshine (Cds), RTC(M41T62) data. : Logging data saves into EEPROM (AT24C1024) using ring buffer function.
Dependencies: AT24C1024 RHT03 TextLCD BMP180 M41T62
Fork of mbed_blinky by
Please see https://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-barometer-with-data-logging/#
main.cpp@8:f6aa5561f219, 2014-06-13 (annotated)
- Committer:
- kenjiArai
- Date:
- Fri Jun 13 07:45:15 2014 +0000
- Revision:
- 8:f6aa5561f219
- Parent:
- 7:d3b49f1d9f76
- Child:
- 9:ce80da60884a
Barometer program / Step by step approach 2nd step,; Check Analog input data (Cds, Vref and Volume)
Who changed what in which revision?
User | Revision | Line number | New 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 | 7:d3b49f1d9f76 | 9 | * Revised: June 13th, 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 | #include "mbed.h" |
dan | 0:7dec7e9ac085 | 18 | |
kenjiArai | 8:f6aa5561f219 | 19 | #define DEBUG 1 // 1=Debug, 0=Normal |
kenjiArai | 8:f6aa5561f219 | 20 | |
kenjiArai | 8:f6aa5561f219 | 21 | #define VREF_VOLT 2.482 // TA76431F Vref real measued data |
kenjiArai | 8:f6aa5561f219 | 22 | #define R_FIX 9930 // 10K ohm <- real measued data |
kenjiArai | 8:f6aa5561f219 | 23 | #define VOL_OFFSET 4 // Offset data ,= real measured data |
kenjiArai | 8:f6aa5561f219 | 24 | #define CDS_TBL_SIZE 13 |
kenjiArai | 7:d3b49f1d9f76 | 25 | |
kenjiArai | 7:d3b49f1d9f76 | 26 | DigitalOut myled0(dp28); // LED for Debug |
kenjiArai | 7:d3b49f1d9f76 | 27 | DigitalOut myled1(dp14); // Indicate state transition |
kenjiArai | 8:f6aa5561f219 | 28 | DigitalOut analog_pwr(dp6); // VCC for analog interface (vol, cds and vref) |
kenjiArai | 8:f6aa5561f219 | 29 | DigitalOut vref_pwr(dp4); // VCC for Vref |
kenjiArai | 7:d3b49f1d9f76 | 30 | DigitalIn sw_chng(dp1,PullUp);// SW for select |
kenjiArai | 7:d3b49f1d9f76 | 31 | DigitalIn sw_mode(dp2,PullUp);// SW for Mode change |
kenjiArai | 8:f6aa5561f219 | 32 | AnalogIn cds(dp11); // Input / CDS data |
kenjiArai | 8:f6aa5561f219 | 33 | AnalogIn vref(dp9); // Input / Bandgap 2.5V |
kenjiArai | 8:f6aa5561f219 | 34 | AnalogIn vol(dp10); // Input / contrast volume |
kenjiArai | 8:f6aa5561f219 | 35 | Serial pc(dp16,dp15); |
kenjiArai | 8:f6aa5561f219 | 36 | |
kenjiArai | 8:f6aa5561f219 | 37 | typedef enum {CDS = 0, VREF, VOL} ADC_Select; |
kenjiArai | 8:f6aa5561f219 | 38 | |
kenjiArai | 8:f6aa5561f219 | 39 | float av_cds, av_vref, av_vol, cal_vcc; |
kenjiArai | 8:f6aa5561f219 | 40 | float r_cds, lux; |
kenjiArai | 8:f6aa5561f219 | 41 | uint32_t nor_vol; |
kenjiArai | 8:f6aa5561f219 | 42 | |
kenjiArai | 8:f6aa5561f219 | 43 | // Cds GL5528 (Dark Resistance 1 Mohm type) SENBA OPTICAL & ELECTRONIC CO.,LTD. |
kenjiArai | 8:f6aa5561f219 | 44 | // Table value referrence: http://homepage3.nifty.com/skomo/f35/hp35_20.htm |
kenjiArai | 8:f6aa5561f219 | 45 | const float lux_cds[CDS_TBL_SIZE][2] = |
kenjiArai | 8:f6aa5561f219 | 46 | {{50,21194},{100,8356},{200,3294},{400,1299},{800,512},{1600,202},{3200,79.6},{6400,31.4}, |
kenjiArai | 8:f6aa5561f219 | 47 | {12800,12.4},{25600,4.88},{51200,1.92},{102400,0.758},{409600,0.118}}; |
kenjiArai | 8:f6aa5561f219 | 48 | |
kenjiArai | 8:f6aa5561f219 | 49 | void adc_normalize( ADC_Select n ){ |
kenjiArai | 8:f6aa5561f219 | 50 | int i; |
kenjiArai | 8:f6aa5561f219 | 51 | float x1,y1,dx; |
kenjiArai | 8:f6aa5561f219 | 52 | |
kenjiArai | 8:f6aa5561f219 | 53 | switch (n){ |
kenjiArai | 8:f6aa5561f219 | 54 | case CDS: |
kenjiArai | 8:f6aa5561f219 | 55 | // v_adc = Rfix / (Rcds + Rfix) |
kenjiArai | 8:f6aa5561f219 | 56 | // Rcds = ( Rfix / v_adc ) - Rfix |
kenjiArai | 8:f6aa5561f219 | 57 | r_cds = (R_FIX / av_cds) - R_FIX; |
kenjiArai | 8:f6aa5561f219 | 58 | // CDS resistance to Lux conversion using convertion table (luc_cds[][]) |
kenjiArai | 8:f6aa5561f219 | 59 | // with Linear interpolation method |
kenjiArai | 8:f6aa5561f219 | 60 | for (i =0; i < CDS_TBL_SIZE; i++){ |
kenjiArai | 8:f6aa5561f219 | 61 | if ( r_cds <= lux_cds[i][0]){ |
kenjiArai | 8:f6aa5561f219 | 62 | break; |
kenjiArai | 8:f6aa5561f219 | 63 | } |
kenjiArai | 8:f6aa5561f219 | 64 | } |
kenjiArai | 8:f6aa5561f219 | 65 | #if DEBUG |
kenjiArai | 8:f6aa5561f219 | 66 | pc.printf("i=%d, ", i); |
kenjiArai | 8:f6aa5561f219 | 67 | #endif |
kenjiArai | 8:f6aa5561f219 | 68 | if (i == 0){ |
kenjiArai | 8:f6aa5561f219 | 69 | lux = lux_cds[0][1]; |
kenjiArai | 8:f6aa5561f219 | 70 | } else if ( i == CDS_TBL_SIZE ){ |
kenjiArai | 8:f6aa5561f219 | 71 | if ( r_cds <= lux_cds[i][0]){ |
kenjiArai | 8:f6aa5561f219 | 72 | lux = lux_cds[i-1][1]; |
kenjiArai | 8:f6aa5561f219 | 73 | } |
kenjiArai | 8:f6aa5561f219 | 74 | } else { |
kenjiArai | 8:f6aa5561f219 | 75 | y1 = lux_cds[i-1][1] - lux_cds[i][1]; |
kenjiArai | 8:f6aa5561f219 | 76 | x1 = lux_cds[i][0] - lux_cds[i-1][0]; |
kenjiArai | 8:f6aa5561f219 | 77 | dx = r_cds - lux_cds[i-1][0]; |
kenjiArai | 8:f6aa5561f219 | 78 | lux = lux_cds[i-1][1] - ((dx/x1) * y1); |
kenjiArai | 8:f6aa5561f219 | 79 | #if DEBUG |
kenjiArai | 8:f6aa5561f219 | 80 | pc.printf("y1:%f, x1:%f, dx:%f, lux_tbl:%f\r\n", y1, x1, dx, lux_cds[i-1][1]); |
kenjiArai | 8:f6aa5561f219 | 81 | #endif |
kenjiArai | 8:f6aa5561f219 | 82 | } |
kenjiArai | 8:f6aa5561f219 | 83 | break; |
kenjiArai | 8:f6aa5561f219 | 84 | case VREF: |
kenjiArai | 8:f6aa5561f219 | 85 | // vref = VREF_VOLT / VCC -> VCC = VREF_VOLT / vref |
kenjiArai | 8:f6aa5561f219 | 86 | cal_vcc = VREF_VOLT / vref; |
kenjiArai | 8:f6aa5561f219 | 87 | break; |
kenjiArai | 8:f6aa5561f219 | 88 | case VOL: |
kenjiArai | 8:f6aa5561f219 | 89 | // Vol center = 1.00 (actual 100) |
kenjiArai | 8:f6aa5561f219 | 90 | nor_vol = (uint32_t)(av_vol * 200) + VOL_OFFSET; |
kenjiArai | 8:f6aa5561f219 | 91 | break; |
kenjiArai | 8:f6aa5561f219 | 92 | } |
kenjiArai | 8:f6aa5561f219 | 93 | } |
kenjiArai | 8:f6aa5561f219 | 94 | |
kenjiArai | 8:f6aa5561f219 | 95 | void adc_all_read( void){ |
kenjiArai | 8:f6aa5561f219 | 96 | av_cds = av_cds *0.5 + cds.read() * 0.5; |
kenjiArai | 8:f6aa5561f219 | 97 | av_vref = av_vref *0.9 + vref.read() * 0.1; |
kenjiArai | 8:f6aa5561f219 | 98 | av_vol = av_vol *0.2 + vol.read() * 0.8; |
kenjiArai | 8:f6aa5561f219 | 99 | } |
kenjiArai | 8:f6aa5561f219 | 100 | |
kenjiArai | 8:f6aa5561f219 | 101 | void adc_init( void){ |
kenjiArai | 8:f6aa5561f219 | 102 | analog_pwr = 1; |
kenjiArai | 8:f6aa5561f219 | 103 | vref_pwr = 1; |
kenjiArai | 8:f6aa5561f219 | 104 | wait(0.2); |
kenjiArai | 8:f6aa5561f219 | 105 | av_cds = cds.read(); |
kenjiArai | 8:f6aa5561f219 | 106 | av_vref = vref.read(); |
kenjiArai | 8:f6aa5561f219 | 107 | av_vol = vol.read(); |
kenjiArai | 8:f6aa5561f219 | 108 | wait(0.1); |
kenjiArai | 8:f6aa5561f219 | 109 | adc_all_read(); |
kenjiArai | 8:f6aa5561f219 | 110 | wait(0.1); |
kenjiArai | 8:f6aa5561f219 | 111 | adc_all_read(); |
kenjiArai | 8:f6aa5561f219 | 112 | analog_pwr = 0; |
kenjiArai | 8:f6aa5561f219 | 113 | vref_pwr = 0; |
kenjiArai | 8:f6aa5561f219 | 114 | } |
dan | 0:7dec7e9ac085 | 115 | |
dan | 0:7dec7e9ac085 | 116 | int main() { |
kenjiArai | 8:f6aa5561f219 | 117 | pc.baud(9600); |
kenjiArai | 8:f6aa5561f219 | 118 | pc.printf("mbed LPC1114FN28 test program by JH1PJL created on "__DATE__"\r\n"); |
kenjiArai | 7:d3b49f1d9f76 | 119 | while(1) { |
kenjiArai | 8:f6aa5561f219 | 120 | analog_pwr = 1; |
kenjiArai | 8:f6aa5561f219 | 121 | vref_pwr = 1; |
kenjiArai | 8:f6aa5561f219 | 122 | wait(0.2); |
kenjiArai | 8:f6aa5561f219 | 123 | adc_all_read(); |
kenjiArai | 8:f6aa5561f219 | 124 | //analog_pwr = 0; |
kenjiArai | 8:f6aa5561f219 | 125 | adc_normalize( CDS ); |
kenjiArai | 8:f6aa5561f219 | 126 | adc_normalize( VREF ); |
kenjiArai | 8:f6aa5561f219 | 127 | adc_normalize( VOL ); |
kenjiArai | 8:f6aa5561f219 | 128 | myled0 = 1; |
kenjiArai | 8:f6aa5561f219 | 129 | myled1 = 1; |
kenjiArai | 8:f6aa5561f219 | 130 | if (sw_chng == 1){ // SW Off |
kenjiArai | 8:f6aa5561f219 | 131 | pc.printf("CDS:%.0fohm -> %.1flux, Vcc:%.3fV, Vol:%d\r\n", r_cds, lux, cal_vcc, nor_vol); |
kenjiArai | 8:f6aa5561f219 | 132 | } else { // SW On |
kenjiArai | 8:f6aa5561f219 | 133 | pc.printf("CDS:%f, Vref:%f, Vol:%f\r\n", av_cds, av_vref, av_vol); |
kenjiArai | 7:d3b49f1d9f76 | 134 | } |
kenjiArai | 8:f6aa5561f219 | 135 | myled0 = 0; |
kenjiArai | 8:f6aa5561f219 | 136 | myled1 = 0; |
kenjiArai | 8:f6aa5561f219 | 137 | wait(0.8); |
kenjiArai | 7:d3b49f1d9f76 | 138 | } |
dan | 0:7dec7e9ac085 | 139 | } |
kenjiArai | 8:f6aa5561f219 | 140 |