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/

Files at this revision

API Documentation at this revision

Comitter:
kenjiArai
Date:
Sun Jun 22 01:48:32 2014 +0000
Parent:
12:1e21119688fe
Child:
14:18a98cad6109
Commit message:
Barometer program / Step by step approach -> 7th step,; Added RTC(M41T62 STmicro) control

Changed in this revision

M41T62.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/M41T62.lib	Sun Jun 22 01:48:32 2014 +0000
@@ -0,0 +1,1 @@
+M41T62#9d7702a887d3
--- 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  
     }
 }