![](/media/cache/profiles/f0fcf351df4eb6786e9bb6fc4e2dee02.jpg.50x50_q85.jpg)
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/#
Diff: main.cpp
- 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 } }