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 Mbed

Please see https://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-barometer-with-data-logging/#

Revision:
8:f6aa5561f219
Parent:
7:d3b49f1d9f76
Child:
9:ce80da60884a
--- a/main.cpp	Fri Jun 13 07:41:55 2014 +0000
+++ b/main.cpp	Fri Jun 13 07:45:15 2014 +0000
@@ -16,35 +16,125 @@
  */
 #include "mbed.h"
 
-#define LED_TEST    0   // =1 -> LED test, =0 -> SW test
+#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() {
-#if LED_TEST
-    while(1) {
-        myled0 = 1;
-        myled1 = 0;
-        wait(1.0);
-        myled0 = 0;
-        myled1 = 1;
-        wait(1.0);
-    }
-#else
+    pc.baud(9600);
+    pc.printf("mbed LPC1114FN28 test program by JH1PJL created on "__DATE__"\r\n");
     while(1) {
-        if (sw_chng == 1){
-            myled0 = 0;
-        } else {
-            myled0 = 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);
         }
-        if (sw_mode == 1){
-            myled1 = 0;
-        } else {
-            myled1 = 1;
-        }
+        myled0 = 0;
+        myled1 = 0;
+        wait(0.8);     
     }
-#endif
 }
+