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
Please refer following Notebook.
http://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-data-logger/
Diff: main.cpp
- Revision:
- 15:065fbeddc305
- Parent:
- 14:18a98cad6109
- Child:
- 16:f164f8912201
diff -r 18a98cad6109 -r 065fbeddc305 main.cpp --- a/main.cpp Sun Jun 22 06:10:57 2014 +0000 +++ b/main.cpp Sun Jun 29 06:58:00 2014 +0000 @@ -1,12 +1,12 @@ /* * mbed Application program for the mbed LPC1114FN28 - * Test program -> Check I2C line control + * Barometer program for only for LPC1114FN28 * * Copyright (c) 2014 Kenji Arai / JH1PJL * http://www.page.sannet.ne.jp/kenjia/index.html * http://mbed.org/users/kenjiArai/ - * Created: June 22nd, 2014 - * Revised: June 22nd, 2014 + * Created: May 21st, 2014 + * Revised: June 28th, 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 @@ -14,30 +14,315 @@ * 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. */ -// You need to select (set 1) only one from blow -#define TST_NORMAL 1 -#define TST_LCD8x2 0 -#define TST_EEPROM 0 -#define TST_BMP180 0 -#define TST_M41T62 0 -// You need to select (set 1) only one from above +/* + * Function + * measure atmospheric pressure and temprerature using Bosch BMP180 pressure sensor + * show measured data on AQM0802A LCD and logging such data in EEPROM + */ + +// Include --------------------------------------------------------------------------------------- +#include "mbed.h" +#include "BMP180.h" // Own lib. / Pressure sensor +#include "RHT03.h" // Std. lib./ Humidity sensor +#include "TextLCD.h" // Std. lib./ LCD control +#include "m41t62_rtc.h" // Own lib. / RTC control +#include "dt_log.h" + +// Definition ------------------------------------------------------------------------------------ +#define USE_MON 1 +#define USE_BARO 0 + +#define BOUND 5 // chattering + +// Define cyclic period +#define SHOW_LED 1 // Time for LED on x mS +#define CNV_WAIT_T 25 // Waiting time for temp. conversion +#define CNV_WAIT_P 50 // Waiting time for pressure conversion +#define LOOP_WAIT (1000 - (SHOW_LED + CNV_WAIT_T +CNV_WAIT_P)) + +// ADC related definition +#define VREF_VOLT 2.482 // TA76431F Vref real measued data +#define R_FIX 9930 // 10K ohm <- real measued data +#define VOL_OFFSET 3 // Offset data ,= real measured data +#define CDS_TBL_SIZE 13 + +// Waiting time +#define STATE_CHANGE_TIME 3 + +typedef enum {CDS = 0, VREF, VOL} ADC_Select; + +// Object ---------------------------------------------------------------------------------------- +Timeout to; // wake-up from sleep() +I2C i2c(dp5,dp27); // SDA, SCL +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 +RHT03 humtemp(dp26); // RHT03 interface +BMP180 bmp180(i2c); // Bosch sensor +M41T62 m41t62(i2c); // STmicro RTC(M41T62) +TextLCD_I2C_N i2clcd(&i2c, 0x7c, TextLCD::LCD8x2); // LCD(Akizuki AQM0802A) + +// Function prototypes --------------------------------------------------------------------------- +extern int mon( void); // only use for debug purpose + +// RAM ------------------------------------------------------------------------------------------- +int flag; + +// ADC +float av_cds, av_vref, av_vol, cal_vcc; +float r_cds, lux; +uint32_t nor_vol; + +// Humidity Sensor +float humidity_temp, humidity; + +// EEPROM +uint8_t eep_buf[256 + 2]; -#if TST_NORMAL -#include "main_normal.h" -#endif +// Barometer +float baro; +float baro_temp; + +// EEPROM +extern xEeprom_ptr log_inf; + +// ROM / Constant data --------------------------------------------------------------------------- +// 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}}; + +// LCD screen data +enum Screen{ + SCRN_Clear=0, SCRN_Opening, SCRN_Goto_mon, SCRN_Backto_normal +}; +// Clear Opening Goto_mon Backto_normal +char scrn_1st[4][10] = { " ", "LPC1114F", "GOTO MON", "Back to"}; +char scrn_2nd[4][10] = { " ", " JH1PJL ", " 9600BPS", " Normal"}; + +// Disply on LCD +enum Disp_num{ + DSP_INIT=0, DSP_BARO, DSP_HUMD, DSP_LUX, DSP_TIME, DSP_LOG, DSP_RTURN +}; + +// rule 1) DSP_INIT is top position, 2)DSP_RTURN is end position, 3) Total number 20 +const uint8_t lcd_disp_tbl[20] +// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + = {DSP_INIT, DSP_BARO, DSP_BARO, DSP_BARO, DSP_TIME, DSP_TIME, DSP_HUMD, DSP_HUMD, DSP_LUX, DSP_LUX, +// 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 + DSP_BARO, DSP_BARO, DSP_TIME, DSP_TIME, DSP_HUMD, DSP_HUMD, DSP_LUX, DSP_LUX, DSP_LOG, DSP_RTURN}; + +//------------------------------------------------------------------------------------------------- +// Control Program +//------------------------------------------------------------------------------------------------- +// Normalize ADC data +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[][]) + for (i =0; i < CDS_TBL_SIZE; i++){ // search table + if ( r_cds <= lux_cds[i][0]){ break; } + } + // Check table position + if (i == 0){ lux = lux_cds[0][1]; break; + } else if ( i == CDS_TBL_SIZE ){ + if ( r_cds <= lux_cds[i][0] ){ + lux = lux_cds[i-1][1]; + break; + } + } + // Linear interpolation + 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); + 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; + } +} -#if TST_LCD8x2 -#include "main_aqm0802.h" -#endif +// Read adc data and averaging +void adc_all_read (void){ + if (av_cds == 0){ av_cds = cds.read(); + } else { av_cds = av_cds *0.5 + cds.read() * 0.5; + } + if (av_vref == 0){ av_vref = vref.read(); + } else { av_vref = av_vref *0.9 + vref.read() * 0.1; + } + if (av_vol == 0){ av_vol = vol.read(); + } else { av_vol = av_vol *0.2 + vol.read() * 0.8; + } +} -#if TST_EEPROM -#include "main_at24c1024.h" -#endif +// Read Humidity sensor data +void hum_RHT03_read (void){ + while (true){ // wait data + if ( humtemp.readData() == RHT_ERROR_NONE ){ break; } + } + if (humidity_temp == 0){humidity_temp = humtemp.getTemperatureC(); + } else { humidity_temp = humidity_temp * 0.9 + humtemp.getTemperatureC() * 0.1; + } + if ( humidity == 0 ){ humidity = humtemp.getHumidity(); + } else { humidity = humidity * 0.9 + humtemp.getHumidity() * 0.1; + } +} + +void set_lcd_screen(int n){ + i2clcd.locate(0, 0); + i2clcd.printf("%s", scrn_1st[n]); + i2clcd.locate(0, 1); + i2clcd.printf("%s", scrn_2nd[n]); +} + +//------------------------------------------------------------------------------------------------- +// Application program +//------------------------------------------------------------------------------------------------- +// Nothing is done but just wake-up from sleep condition +void wakeup() { + flag = 1; + myled1 = !myled1; +} + +// Measure pressure and show it on LCD +void conv_and_disp(void) { +tm t; +uint32_t step = 0; +uint8_t num; -#if TST_BMP180 -#include "main_bmp180.h" -#endif + while (true) { // infinit loop for measure and display + // Call wakeup()function after specific time + to.attach(&wakeup, STATE_CHANGE_TIME); // this is for wake-up +//---- State Control ---- + num = lcd_disp_tbl[step++]; + switch (num){ + // ---------- Initialize data ---------------------------------------------------------------- + case DSP_INIT: + av_cds = 0; + av_vref = 0; + av_vol = 0; + humidity_temp = 0; + humidity = 0; + // RTC + m41t62.set_sq_wave(RTC_SQW_NONE); + break; + // ---------- Cds Sensor, Vref, Volume ------------------------------------------------------- + case DSP_LUX: + // Power on / Analog sensor + analog_pwr = 1; + vref_pwr = 1; + wait(0.2); + adc_all_read(); + // Power off / Analog sensor + analog_pwr = 0; + // Normalize + adc_normalize(CDS); + adc_normalize(VREF); + adc_normalize(VOL); + set_lcd_screen(SCRN_Clear); + i2clcd.locate(0, 0); // 1st line top + // 12345678 + i2clcd.printf("L:%.1f", lux); + i2clcd.locate(0, 1); // 2nd line top + i2clcd.printf("V:%.3f", cal_vcc); + break; + // ---------- Barometer Sensor / BMP180 ------------------------------------------------------ + case DSP_BARO: + bmp180.normalize(); + baro = bmp180.read_pressure(); + baro_temp = bmp180.read_temperature(); + set_lcd_screen(SCRN_Clear); + i2clcd.locate(0, 0); // 1st line top + i2clcd.printf("P:%.1f", baro); + i2clcd.locate(0, 1); // 2nd line top + i2clcd.printf("T:%\+-6.1f", baro_temp); + break; + // ---------- Humidity Sensor / RHT03 -------------------------------------------------------- + case DSP_HUMD: + hum_RHT03_read(); // Read Humidity data then avaraging + set_lcd_screen(SCRN_Clear); + i2clcd.locate(0, 0); // 1st line top + i2clcd.printf("H:%.1f", humidity); + i2clcd.locate(0, 1); // 2nd line top + i2clcd.printf("T:%\+-6.1f", humidity_temp); + break; + // ---------- RTC ---------------------------------------------------------------------------- + case DSP_TIME: + m41t62.read_rtc_std(&t);; + set_lcd_screen(SCRN_Clear); + i2clcd.locate(0, 0); // 1st line top + i2clcd.printf("%02d/%02d/%02d", t.tm_year % 100, t.tm_mon + 1, t.tm_mday); + i2clcd.locate(0, 1); // 2nd line top + i2clcd.printf("%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec); + break; + // ---------- EEPROM Logging ----------------------------------------------------------------- + case DSP_LOG: + dtlog_data_pack(); // Get EEPROM resource + dtlog_one_write(); // Write data to EEPROM + set_lcd_screen(SCRN_Clear); + i2clcd.locate(0, 0); // 1st line top + i2clcd.printf("Logging"); + i2clcd.locate(0, 1); // 2nd line top + i2clcd.printf("%d.1", dtlog_buf_occupation() / 10); + break; + // ---------- return (loop) ------------------------------------------------------------------ + case DSP_RTURN: + default: + // <State> State change + step = 1; // if something wrong, go to reset condition + } + // ---------- back to top -------------------------------------------------------------------- + myled0 = !myled0; + while (flag == 0){ wait(0.01);} + wait(0.1); + myled1 = !myled1; + flag = 0; + } +} -#if TST_M41T62 -#include "main_m41t62.h" -#endif +// Application program starts here +int main() { + flag = 0; + i2clcd.setContrast(25); + set_lcd_screen(SCRN_Opening); + if (sw_chng == 0){ // SW ON + //-- Enter Monitor Mode -- + myled1 = 1; wait(0.5); + myled1 = 0; wait(0.5); + myled1 = 1; wait(0.5); + if (sw_chng == 0){ // Still SW ON + myled1 = 0; wait(0.5); + myled1 = 1; wait(0.5); + if (sw_mode == 0){ // SW ON + set_lcd_screen(SCRN_Clear); + set_lcd_screen(SCRN_Goto_mon); + myled1 = 0; + mon(); // mon.cpp + } + set_lcd_screen(SCRN_Clear); + set_lcd_screen(SCRN_Backto_normal); + } + } + //-- Enter Normal Mode -- + myled0 = 1; + myled1 = 0; + while (true) { // Start main program + conv_and_disp(); + } +}