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/

Revision:
13:950adc9d6d61
Parent:
12:1e21119688fe
Child:
14:18a98cad6109
--- a/main.cpp	Fri Jun 20 21:45:12 2014 +0000
+++ b/main.cpp	Sun Jun 22 01:48:32 2014 +0000
@@ -1,12 +1,12 @@
 /*
  * mbed Application program for the mbed LPC1114FN28
- * Test program -> Check EEPROM
+ * Test program -> Check RTC module
  *
  * 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      21st, 2014
+ *      Revised: June      22nd, 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
@@ -19,7 +19,10 @@
 #include "BMP180.h"             // Own lib. / Pressure sensor             
 #include "RHT03.h"              // Std. lib./ Humidity sensor
 #include "TextLCD.h"            // Std. lib./ LCD control
-#include "AT24C1024.h"             // Std. lib./ EEPROM control
+#include "AT24C1024.h"          // Own lib. / EEPROM control
+#include "m41t62_rtc.h"         // Own lib. / RTC control
+
+#define USE_C_STD_LIB   1
 
 #define VREF_VOLT       2.482   // TA76431F Vref real measued data
 #define R_FIX           9930    // 10K ohm <- real measued data
@@ -41,6 +44,7 @@
 BMP180      bmp180(i2c);        // Bosch sensor
 TextLCD_I2C_N i2clcd(&i2c, 0x7c, TextLCD::LCD8x2);  // LCD(Akizuki AQM0802A)
 AT24C1024   at24c1024(i2c);     // Atmel 1Mbit EE-PROM 
+M41T62      m41t62(i2c);        // STmicro RTC(M41T62) 
 
 typedef enum {CDS = 0, VREF, VOL} ADC_Select;
 
@@ -61,26 +65,15 @@
     {{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}};
 
-// EEPROM test charcters
-const uint8_t eep_char[256] =
-//0        1         2         3         4         5         6         7
-//12345678901234567890123456789012345678901234567890123456789012345678901
- "The AT24C1024 provides 1048576 bits of serial electrically erasable and"
-//7       8         9        10        11        12        13        14        15
-//2345678901234567890123456789012345678901234567890123456789012345678901234567890123
- " programmable read only memory (EEPROM) organized as 131,072 words of 8 bits each."
-//15   16        17        18        19        20        21        22        23        24
-//45678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
- " The devices cascadable feature allows up to four devices to share a common two-wire bus."
-//24    25   256
-//34567890123456
- "  JH1PJL Arai"; // eep_char[255] = 0;
-
+#if USE_C_STD_LIB == 0
+const char week[7][4] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
+#endif
+      
 //-------------------------------------------------------------------------------------------------
 //  Control Program
 //-------------------------------------------------------------------------------------------------
 // Normalize ADC data
-void adc_normalize( ADC_Select n ){
+void adc_normalize (ADC_Select n){
 int i;
 float x1,y1,dx;
 
@@ -120,7 +113,7 @@
 }
 
 //  Read adc data and averaging
-void adc_all_read( void){
+void adc_all_read (void){
     if (av_cds == 0){   av_cds = cds.read();
     } else {            av_cds = av_cds *0.5 + cds.read() * 0.5;
     }
@@ -133,7 +126,7 @@
 }
 
 // Read Humidity sensor data
-void hum_RHT03_read( void){
+void hum_RHT03_read (void){
     while (true){   // wait data
         if ( humtemp.readData() == RHT_ERROR_NONE ){ break; }
     }
@@ -146,21 +139,51 @@
 }
 
 // Clear LCD
-void cls( void){
+void cls(void){
     i2clcd.locate(0, 0);
     i2clcd.printf("        ");
     i2clcd.locate(0, 1);
     i2clcd.printf("        ");
 }
 
+// Set initial time
+void set_initial_time (void){
+    // Set Initial data -> 2014/06/22 10:20:00
+#if USE_C_STD_LIB
+struct tm t;
+
+    m41t62.read_rtc_std(&t);
+    if ((sw_chng == 0) && (sw_mode == 0)){  
+        t.tm_sec  = 0;
+        t.tm_min  = 20;
+        t.tm_hour = 10;
+        t.tm_mday = 22;
+        t.tm_wday = 0; // Sun is not 7 but 0
+        t.tm_mon  = 5; // Jan. = 0
+        t.tm_year = 14 + 100; // 1900+x = now
+        m41t62.write_rtc_std(&t);
+    }
+#else
+rtc_time t;
+
+    m41t62.read_rtc_direct(&t);
+    if ((sw_chng == 0) && (sw_mode == 0)){   
+        t.rtc_seconds = 0;
+        t.rtc_minutes = 20;
+        t.rtc_hours   = 10;
+        t.rtc_date    = 22;
+        t.rtc_weekday = RTC_Wk_Sunday;
+        t.rtc_month   = 6;
+        t.rtc_year_raw= 14;
+        m41t62.write_rtc_direct(&t);
+    }
+#endif
+}
+
 //-------------------------------------
 // Application program starts here
 //-------------------------------------
 int main() {
-int no =0;
-uint8_t dt[4];
-AT24C_STATUS status;
-
     pc.baud(9600);
     pc.printf("\r\nmbed LPC1114FN28 test program by JH1PJL created on "__DATE__"(UTC)\r\n");
     i2clcd.setContrast(25);
@@ -174,6 +197,9 @@
     av_vol = 0;
     humidity_temp = 0;
     humidity = 0;
+    // RTC
+    m41t62.set_sq_wave(RTC_SQW_NONE);
+    set_initial_time();
     // Show initial screen
     wait(5.0);    
     while(1) {
@@ -196,10 +222,10 @@
         i2clcd.locate(0, 1);    // 2nd line top
         i2clcd.printf("V:%.3f", cal_vcc);       
         myled0 = 1;
-        pc.printf( "\r\nCds:%.0fohm -> %.1flux, Vcc:%.3fV, Vol:%d\r\n",
+        pc.printf( "\r\nCds:%.0fohm->%.1flux, Vcc:%.3fV, Vol:%d\r\n",
             r_cds, lux, cal_vcc, nor_vol );
         myled0 = 0;
-        wait(2.0);
+        wait(4.0);
     //  ---------- Barometer Sensor / BMP180 --------------------------------------------------
         bmp180.normalize();
         cls();
@@ -208,7 +234,8 @@
         i2clcd.locate(0, 1);    // 2nd line top
         i2clcd.printf("T:%\+-6.1f", bmp180.read_temperature());
         myled1 = 1;
-        pc.printf("Pres:%4.1fhPa, Temp:%\+-0.1fdegC\r\n", bmp180.read_pressure(), bmp180.read_temperature());
+        pc.printf("Pres:%4.1fhPa, Temp:%\+-0.1fdegC\r\n",
+                bmp180.read_pressure(), bmp180.read_temperature());
         myled1 = 0;
         wait(4.0);
     //  ---------- Humidity Sensor / RHT03 ----------------------------------------------------
@@ -221,115 +248,51 @@
         myled1 = 1;
         pc.printf("Humid: %0.1f%%RH, Temp:%\+-0.1fdegC\r\n", humidity, humidity_temp);          
         myled1 = 0; 
-        wait(2.0);
-    //  ---------- Check EEPROM ----------------------------------------------------
+        wait(4.0);
+    //  ---------- Check RTC ------------------------------------------------------------------
+#if USE_C_STD_LIB
+tm t;
+time_t seconds;
+char buf[40];
+
+        m41t62.read_rtc_std(&t);
+        seconds = mktime(&t);
         cls();
         i2clcd.locate(0, 0);    // 1st line top
-        //             12345678
-        i2clcd.printf(" EEPROM ", humidity);
-        pc.printf("EEPROM -> ", humidity, humidity_temp);
-        i2clcd.locate(0, 1);    // 2nd line top  
-        if (no == 4) {  // check page write mode (part1)
-            ++no;
-            strcpy((char *)eep_buf,(char *)eep_char);   // copy the data         
-            status = at24c1024.write_page(0x100, eep_buf, sizeof(eep_buf)); // 0x100= page address
-            pc.printf("(Status: %d) ", status);
-            if (status == AT24C_OK){    // wrote without trouble
-                wait(1.0);
-                for (int i=0; i < 256; i++){    // clear buffer for read data checking
-                    eep_buf[i] = 0;
-                }
-                status = at24c1024.read_page(0x100, eep_buf, sizeof(eep_buf));
-                pc.printf("(Status: %d) ", status);
-                if (status == AT24C_OK){    // read w/o trouble
-                    pc.printf("\r\n%s\r\n", eep_buf);
-                    if (strncmp((char *)eep_buf, (char *)eep_char, 256) == 0){ // equal R/W data
-                        i2clcd.printf("page-OK");
-                        pc.printf("Page access OK\r\n");
-                    } else {    // Read != Wrote
-                        i2clcd.printf("CMP-NG");
-                        pc.printf("Page access Comp NG\r\n");
-                    }
-                } else {    // read w/ trouble
-                    i2clcd.printf("RD-NG");
-                    pc.printf("Page access read NG\r\n");
-                }
-            } else {        // write w/ trouble
-                i2clcd.printf("WR -NG");
-                pc.printf("Write NG\r\n");
-            }
-            wait(0.5);       
-        } else if (no == 5) {  // check page write mode (part2)
-            no = 0;
-            for (int i=0; i < 256; i++){    // set writing data 255,254,,,,,3,2,1,0
-                eep_buf[i] = 255 - (uint8_t)i;
-            }        
-            status = at24c1024.write_page(0x1ff00, eep_buf, sizeof(eep_buf));
-            pc.printf("(Status: %d) ", status);
-            if (status == AT24C_OK){
-                wait(1.0);
-                for (int i=0; i < 256; i++){    // clear buffer
-                    eep_buf[i] = 0;
-                }
-                status = at24c1024.read_page(0x1ff00, eep_buf, sizeof(eep_buf));
-                pc.printf("(Status: %d) ", status);
-                if (status == AT24C_OK){
-                    pc.printf("\r\n0:%d, 64:%d, 128:%d, 254:%d, 255:%d\r\n",
-                            eep_buf[0], eep_buf[64], eep_buf[128], eep_buf[254], eep_buf[255]);
-                    if ((eep_buf[0] == 255) && (eep_buf[64] == 255 - 64)
-                            && (eep_buf[128] == 255-128) && (eep_buf[255] == 0)){
-                        i2clcd.printf("page-OK");
-                        pc.printf("Page access OK\r\n");
-                    } else {
-                        i2clcd.printf("CMP-NG");
-                        pc.printf("Page access Comp NG\r\n");
-                    }
-                } else {
-                    i2clcd.printf("RD-NG");
-                    pc.printf("Page access read NG\r\n");
-                }
-            } else {
-                i2clcd.printf("WR -NG");
-                pc.printf("Write NG\r\n");
-            }
-            wait(0.5);
-        } else {    // Write and read (single byte)
-            if (no == 0){   // Initial setting
-                // Check EEPROM (step0)
-                at24c1024.write(0,no);
-                wait(0.1);
-                at24c1024.write(1,0);
-                wait(0.1);
-                at24c1024.write(2,0x55);
-                wait(0.1);
-                at24c1024.write(3,0xaa);
-                wait(0.1);
-                dt[0] = 0xff;
-                dt[1] = 1;
-                dt[2] = 2;
-                dt[3] = 3;
-            }
-            // read 4 bytes
-            dt[0] = at24c1024.read(0);
-            dt[1] = at24c1024.read(1);
-            dt[2] = at24c1024.read(2);
-            dt[3] = at24c1024.read(3);     
-            if (dt[0] != no){
-                i2clcd.locate(0, 1);    // 2nd line top
-                i2clcd.printf("NG", humidity_temp);
-                pc.printf("NG\r\n", humidity, humidity_temp);
-            } else {           
-                if ((dt[1] == 0) && (dt[2] == 0x55) && (dt[3] == 0xaa)){
-                    i2clcd.printf("-> OK");
-                    pc.printf("OK\r\n");        
-                } else {
-                    i2clcd.printf("-> NG ");
-                    pc.printf("NG\r\n");
-                }
-            }
-            pc.printf("EEPROM 0x%x,0x%x,0x%x,0x%x\r\n", dt[0],dt[1],dt[2],dt[3]);
-            at24c1024.write(0,++no);    // write sequence number into EEPROM
-            wait(1.0);
-        }    
+        i2clcd.printf("%02d/%02d/%02d", t.tm_year % 100, t.tm_mon, t.tm_mday);
+        i2clcd.locate(0, 1);    // 2nd line top
+        i2clcd.printf("%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
+        myled1 = 1;
+        // Show Time with several example
+        // ex.1
+        pc.printf("Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
+                    t.tm_year + 1900, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
+        // ex.2
+        strftime(buf, 40, "%x %X", localtime(&seconds));
+        printf("Date: %s\r\n", buf);
+        // ex.3
+        strftime(buf, 40, "%I:%M:%S %p (%Y/%m/%d)", localtime(&seconds));
+        printf("Date: %s\r\n", buf);
+        // ex.4
+        strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
+        printf("Date: %s\r\n", buf);
+        myled1 = 0;
+        wait(4.0);
+#else
+rtc_time t;
+ 
+        m41t62.read_rtc_direct(&t);
+        cls();
+        i2clcd.locate(0, 0);    // 1st line top
+        i2clcd.printf("%02d/%02d/%02d", t.rtc_year, t.rtc_month, t.rtc_date);
+        i2clcd.locate(0, 1);    // 2nd line top
+        i2clcd.printf("%02d:%02d:%02d", t.rtc_hours, t.rtc_minutes, t.rtc_seconds);
+        myled1 = 1;
+        pc.printf("Date:%04d/%02d/%02d(%s), Time:%02d:%02d:%02d\r\n",
+            t.rtc_year, t.rtc_month, t.rtc_date, &week[t.rtc_weekday-1][0],
+            t.rtc_hours, t.rtc_minutes, t.rtc_seconds);          
+        myled1 = 0;
+        wait(4.0);
+#endif  
     }
 }