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
- Committer:
- kenjiArai
- Date:
- 2014-06-13
- Revision:
- 8:f6aa5561f219
- Parent:
- 7:d3b49f1d9f76
- Child:
- 9:ce80da60884a
File content as of revision 8:f6aa5561f219:
/* * mbed Application program for the mbed LPC1114FN28 * Test program -> Check LED & Switch function * * Copyright (c) 2014 Kenji Arai / JH1PJL * http://www.page.sannet.ne.jp/kenjia/index.html * http://mbed.org/users/kenjiArai/ * Created: June 13th, 2014 * Revised: 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. */ #include "mbed.h" #define DEBUG 1 // 1=Debug, 0=Normal #define VREF_VOLT 2.482 // TA76431F Vref real measued data #define R_FIX 9930 // 10K ohm <- real measued data #define VOL_OFFSET 4 // Offset data ,= real measured data #define CDS_TBL_SIZE 13 DigitalOut myled0(dp28); // LED for Debug DigitalOut myled1(dp14); // Indicate state transition DigitalOut analog_pwr(dp6); // VCC for analog interface (vol, cds and vref) DigitalOut vref_pwr(dp4); // VCC for Vref DigitalIn sw_chng(dp1,PullUp);// SW for select DigitalIn sw_mode(dp2,PullUp);// SW for Mode change AnalogIn cds(dp11); // Input / CDS data AnalogIn vref(dp9); // Input / Bandgap 2.5V AnalogIn vol(dp10); // Input / contrast volume Serial pc(dp16,dp15); typedef enum {CDS = 0, VREF, VOL} ADC_Select; float av_cds, av_vref, av_vol, cal_vcc; float r_cds, lux; uint32_t nor_vol; // 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}}; void adc_normalize( ADC_Select n ){ int i; float x1,y1,dx; switch (n){ case CDS: // v_adc = Rfix / (Rcds + Rfix) // Rcds = ( Rfix / v_adc ) - Rfix r_cds = (R_FIX / av_cds) - R_FIX; // CDS resistance to Lux conversion using convertion table (luc_cds[][]) // with Linear interpolation method for (i =0; i < CDS_TBL_SIZE; i++){ if ( r_cds <= lux_cds[i][0]){ break; } } #if DEBUG pc.printf("i=%d, ", i); #endif if (i == 0){ lux = lux_cds[0][1]; } else if ( i == CDS_TBL_SIZE ){ if ( r_cds <= lux_cds[i][0]){ lux = lux_cds[i-1][1]; } } else { 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 } break; case VREF: // vref = VREF_VOLT / VCC -> VCC = VREF_VOLT / vref cal_vcc = VREF_VOLT / vref; break; case VOL: // Vol center = 1.00 (actual 100) nor_vol = (uint32_t)(av_vol * 200) + VOL_OFFSET; break; } } void adc_all_read( void){ av_cds = av_cds *0.5 + cds.read() * 0.5; av_vref = av_vref *0.9 + vref.read() * 0.1; av_vol = av_vol *0.2 + vol.read() * 0.8; } void adc_init( void){ analog_pwr = 1; vref_pwr = 1; wait(0.2); av_cds = cds.read(); av_vref = vref.read(); av_vol = vol.read(); wait(0.1); adc_all_read(); wait(0.1); adc_all_read(); analog_pwr = 0; vref_pwr = 0; } int main() { pc.baud(9600); pc.printf("mbed LPC1114FN28 test program by JH1PJL created on "__DATE__"\r\n"); while(1) { analog_pwr = 1; vref_pwr = 1; wait(0.2); adc_all_read(); //analog_pwr = 0; adc_normalize( CDS ); adc_normalize( VREF ); 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); } else { // SW On pc.printf("CDS:%f, Vref:%f, Vol:%f\r\n", av_cds, av_vref, av_vol); } myled0 = 0; myled1 = 0; wait(0.8); } }