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/#
main.cpp@18:b3a27f681171, 2020-08-08 (annotated)
- Committer:
- kenjiArai
- Date:
- Sat Aug 08 07:01:19 2020 +0000
- Revision:
- 18:b3a27f681171
- Parent:
- 16:f164f8912201
change to mbed-os-6.2.0 but not work this revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 7:d3b49f1d9f76 | 1 | /* |
kenjiArai | 7:d3b49f1d9f76 | 2 | * mbed Application program for the mbed LPC1114FN28 |
kenjiArai | 18:b3a27f681171 | 3 | * Barometer program for only for LPC1114FN28 |
kenjiArai | 7:d3b49f1d9f76 | 4 | * |
kenjiArai | 18:b3a27f681171 | 5 | * Copyright (c) 2014,'20 Kenji Arai / JH1PJL |
kenjiArai | 18:b3a27f681171 | 6 | * http://www7b.biglobe.ne.jp/~kenjia/ |
kenjiArai | 18:b3a27f681171 | 7 | * https://os.mbed.com/users/kenjiArai/ |
kenjiArai | 15:065fbeddc305 | 8 | * Created: May 21st, 2014 |
kenjiArai | 18:b3a27f681171 | 9 | * Revised: August 8th, 2020 |
kenjiArai | 7:d3b49f1d9f76 | 10 | */ |
kenjiArai | 15:065fbeddc305 | 11 | /* |
kenjiArai | 15:065fbeddc305 | 12 | * Function |
kenjiArai | 18:b3a27f681171 | 13 | * measure atmospheric pressure and temprerature using Bosch BMP180 sensor |
kenjiArai | 15:065fbeddc305 | 14 | * show measured data on AQM0802A LCD and logging such data in EEPROM |
kenjiArai | 15:065fbeddc305 | 15 | */ |
kenjiArai | 15:065fbeddc305 | 16 | |
kenjiArai | 18:b3a27f681171 | 17 | // Include -------------------------------------------------------------------- |
kenjiArai | 15:065fbeddc305 | 18 | #include "mbed.h" |
kenjiArai | 15:065fbeddc305 | 19 | #include "BMP180.h" // Own lib. / Pressure sensor |
kenjiArai | 15:065fbeddc305 | 20 | #include "RHT03.h" // Std. lib./ Humidity sensor |
kenjiArai | 15:065fbeddc305 | 21 | #include "TextLCD.h" // Std. lib./ LCD control |
kenjiArai | 15:065fbeddc305 | 22 | #include "m41t62_rtc.h" // Own lib. / RTC control |
kenjiArai | 15:065fbeddc305 | 23 | #include "dt_log.h" |
kenjiArai | 15:065fbeddc305 | 24 | |
kenjiArai | 18:b3a27f681171 | 25 | // Definition ----------------------------------------------------------------- |
kenjiArai | 16:f164f8912201 | 26 | #define USE_MON 1 |
kenjiArai | 16:f164f8912201 | 27 | #define USE_BARO 0 |
kenjiArai | 15:065fbeddc305 | 28 | |
kenjiArai | 16:f164f8912201 | 29 | #define BOUND 5 // chattering |
kenjiArai | 15:065fbeddc305 | 30 | |
kenjiArai | 15:065fbeddc305 | 31 | // Define cyclic period |
kenjiArai | 16:f164f8912201 | 32 | #define SHOW_LED 1 // Time for LED on x mS |
kenjiArai | 16:f164f8912201 | 33 | #define CNV_WAIT_T 25 // Waiting time for temp. conversion |
kenjiArai | 16:f164f8912201 | 34 | #define CNV_WAIT_P 50 // Waiting time for pressure conversion |
kenjiArai | 16:f164f8912201 | 35 | #define LOOP_WAIT (1000 - (SHOW_LED + CNV_WAIT_T +CNV_WAIT_P)) |
kenjiArai | 15:065fbeddc305 | 36 | |
kenjiArai | 15:065fbeddc305 | 37 | // ADC related definition |
kenjiArai | 16:f164f8912201 | 38 | #define VREF_VOLT 2.482 // TA76431F Vref real measued data |
kenjiArai | 16:f164f8912201 | 39 | #define R_FIX 9930 // 10K ohm <- real measued data |
kenjiArai | 16:f164f8912201 | 40 | #define VOL_OFFSET 3 // Offset data ,= real measured data |
kenjiArai | 16:f164f8912201 | 41 | #define CDS_TBL_SIZE 13 |
kenjiArai | 15:065fbeddc305 | 42 | |
kenjiArai | 15:065fbeddc305 | 43 | // Waiting time |
kenjiArai | 18:b3a27f681171 | 44 | #define STATE_CHANGE_TIME 3000000 // 3sec |
kenjiArai | 16:f164f8912201 | 45 | #define TIME_INTERVAL 600 // 10 minutes |
kenjiArai | 15:065fbeddc305 | 46 | |
kenjiArai | 15:065fbeddc305 | 47 | typedef enum {CDS = 0, VREF, VOL} ADC_Select; |
kenjiArai | 15:065fbeddc305 | 48 | |
kenjiArai | 18:b3a27f681171 | 49 | // Object --------------------------------------------------------------------- |
kenjiArai | 15:065fbeddc305 | 50 | Timeout to; // wake-up from sleep() |
kenjiArai | 15:065fbeddc305 | 51 | I2C i2c(dp5,dp27); // SDA, SCL |
kenjiArai | 15:065fbeddc305 | 52 | DigitalOut myled0(dp28); // LED for Debug |
kenjiArai | 15:065fbeddc305 | 53 | DigitalOut myled1(dp14); // Indicate state transition |
kenjiArai | 15:065fbeddc305 | 54 | DigitalOut analog_pwr(dp6); // VCC for analog interface (vol, cds and vref) |
kenjiArai | 15:065fbeddc305 | 55 | DigitalOut vref_pwr(dp4); // VCC for Vref |
kenjiArai | 15:065fbeddc305 | 56 | DigitalIn sw_chng(dp1,PullUp);// SW for select |
kenjiArai | 15:065fbeddc305 | 57 | DigitalIn sw_mode(dp2,PullUp);// SW for Mode change |
kenjiArai | 15:065fbeddc305 | 58 | AnalogIn cds(dp11); // Input / CDS data |
kenjiArai | 15:065fbeddc305 | 59 | AnalogIn vref(dp9); // Input / Bandgap 2.5V |
kenjiArai | 15:065fbeddc305 | 60 | AnalogIn vol(dp10); // Input / contrast volume |
kenjiArai | 15:065fbeddc305 | 61 | RHT03 humtemp(dp26); // RHT03 interface |
kenjiArai | 15:065fbeddc305 | 62 | BMP180 bmp180(i2c); // Bosch sensor |
kenjiArai | 15:065fbeddc305 | 63 | M41T62 m41t62(i2c); // STmicro RTC(M41T62) |
kenjiArai | 15:065fbeddc305 | 64 | TextLCD_I2C_N i2clcd(&i2c, 0x7c, TextLCD::LCD8x2); // LCD(Akizuki AQM0802A) |
kenjiArai | 15:065fbeddc305 | 65 | |
kenjiArai | 18:b3a27f681171 | 66 | // Function prototypes -------------------------------------------------------- |
kenjiArai | 15:065fbeddc305 | 67 | extern int mon( void); // only use for debug purpose |
kenjiArai | 15:065fbeddc305 | 68 | |
kenjiArai | 18:b3a27f681171 | 69 | // RAM ------------------------------------------------------------------------ |
kenjiArai | 15:065fbeddc305 | 70 | int flag; |
kenjiArai | 15:065fbeddc305 | 71 | |
kenjiArai | 15:065fbeddc305 | 72 | // ADC |
kenjiArai | 15:065fbeddc305 | 73 | float av_cds, av_vref, av_vol, cal_vcc; |
kenjiArai | 15:065fbeddc305 | 74 | float r_cds, lux; |
kenjiArai | 15:065fbeddc305 | 75 | uint32_t nor_vol; |
kenjiArai | 15:065fbeddc305 | 76 | |
kenjiArai | 15:065fbeddc305 | 77 | // Humidity Sensor |
kenjiArai | 15:065fbeddc305 | 78 | float humidity_temp, humidity; |
kenjiArai | 15:065fbeddc305 | 79 | |
kenjiArai | 15:065fbeddc305 | 80 | // EEPROM |
kenjiArai | 15:065fbeddc305 | 81 | uint8_t eep_buf[256 + 2]; |
kenjiArai | 8:f6aa5561f219 | 82 | |
kenjiArai | 15:065fbeddc305 | 83 | // Barometer |
kenjiArai | 15:065fbeddc305 | 84 | float baro; |
kenjiArai | 15:065fbeddc305 | 85 | float baro_temp; |
kenjiArai | 15:065fbeddc305 | 86 | |
kenjiArai | 15:065fbeddc305 | 87 | // EEPROM |
kenjiArai | 16:f164f8912201 | 88 | //extern xEeprom_ptr log_inf; |
kenjiArai | 15:065fbeddc305 | 89 | |
kenjiArai | 18:b3a27f681171 | 90 | // ROM / Constant data -------------------------------------------------------- |
kenjiArai | 15:065fbeddc305 | 91 | // Cds GL5528 (Dark Resistance 1 Mohm type) SENBA OPTICAL & ELECTRONIC CO.,LTD. |
kenjiArai | 15:065fbeddc305 | 92 | // Table value referrence: http://homepage3.nifty.com/skomo/f35/hp35_20.htm |
kenjiArai | 18:b3a27f681171 | 93 | const float lux_cds[CDS_TBL_SIZE][2] = { |
kenjiArai | 18:b3a27f681171 | 94 | {50,21194},{100,8356},{200,3294},{400,1299},{800,512},{1600,202}, |
kenjiArai | 18:b3a27f681171 | 95 | {3200,79.6},{6400,31.4},{12800,12.4},{25600,4.88},{51200,1.92}, |
kenjiArai | 18:b3a27f681171 | 96 | {102400,0.758},{409600,0.118} |
kenjiArai | 18:b3a27f681171 | 97 | }; |
kenjiArai | 15:065fbeddc305 | 98 | |
kenjiArai | 15:065fbeddc305 | 99 | // LCD screen data |
kenjiArai | 18:b3a27f681171 | 100 | enum Screen { |
kenjiArai | 15:065fbeddc305 | 101 | SCRN_Clear=0, SCRN_Opening, SCRN_Goto_mon, SCRN_Backto_normal |
kenjiArai | 15:065fbeddc305 | 102 | }; |
kenjiArai | 18:b3a27f681171 | 103 | // Clear Opening Goto_mon Backto_normal |
kenjiArai | 15:065fbeddc305 | 104 | char scrn_1st[4][10] = { " ", "LPC1114F", "GOTO MON", "Back to"}; |
kenjiArai | 15:065fbeddc305 | 105 | char scrn_2nd[4][10] = { " ", " JH1PJL ", " 9600BPS", " Normal"}; |
kenjiArai | 15:065fbeddc305 | 106 | |
kenjiArai | 15:065fbeddc305 | 107 | // Disply on LCD |
kenjiArai | 18:b3a27f681171 | 108 | enum Disp_num { |
kenjiArai | 15:065fbeddc305 | 109 | DSP_INIT=0, DSP_BARO, DSP_HUMD, DSP_LUX, DSP_TIME, DSP_LOG, DSP_RTURN |
kenjiArai | 15:065fbeddc305 | 110 | }; |
kenjiArai | 15:065fbeddc305 | 111 | |
kenjiArai | 16:f164f8912201 | 112 | // loop time = STATE_CHANGE_TIME * 20 = 3 * 20 = 60 sec (current) |
kenjiArai | 18:b3a27f681171 | 113 | // rule 1) DSP_INIT is top position |
kenjiArai | 18:b3a27f681171 | 114 | // 2) DSP_RTURN is end position |
kenjiArai | 18:b3a27f681171 | 115 | // 3) Total number 20 |
kenjiArai | 15:065fbeddc305 | 116 | const uint8_t lcd_disp_tbl[20] |
kenjiArai | 16:f164f8912201 | 117 | // 1, 2, 3, 4, 5, |
kenjiArai | 18:b3a27f681171 | 118 | = {DSP_INIT, DSP_BARO, DSP_BARO, DSP_BARO, DSP_TIME, |
kenjiArai | 18:b3a27f681171 | 119 | // 6, 7, 8, 9, 10, |
kenjiArai | 18:b3a27f681171 | 120 | DSP_TIME, DSP_HUMD, DSP_HUMD, DSP_LUX, DSP_LUX, |
kenjiArai | 16:f164f8912201 | 121 | // 11, 12, 13, 14, 15, |
kenjiArai | 18:b3a27f681171 | 122 | DSP_BARO, DSP_BARO, DSP_TIME, DSP_TIME, DSP_HUMD, |
kenjiArai | 18:b3a27f681171 | 123 | // 16, 17, 18, 19, 20 |
kenjiArai | 18:b3a27f681171 | 124 | DSP_HUMD, DSP_LUX, DSP_LUX, DSP_LOG, DSP_RTURN |
kenjiArai | 18:b3a27f681171 | 125 | }; |
kenjiArai | 18:b3a27f681171 | 126 | |
kenjiArai | 18:b3a27f681171 | 127 | //------------------------------------------------------------------------------ |
kenjiArai | 15:065fbeddc305 | 128 | // Control Program |
kenjiArai | 18:b3a27f681171 | 129 | //------------------------------------------------------------------------------ |
kenjiArai | 15:065fbeddc305 | 130 | // Normalize ADC data |
kenjiArai | 18:b3a27f681171 | 131 | void adc_normalize (ADC_Select n) |
kenjiArai | 18:b3a27f681171 | 132 | { |
kenjiArai | 18:b3a27f681171 | 133 | int i; |
kenjiArai | 18:b3a27f681171 | 134 | float x1,y1,dx; |
kenjiArai | 15:065fbeddc305 | 135 | |
kenjiArai | 18:b3a27f681171 | 136 | switch (n) { |
kenjiArai | 18:b3a27f681171 | 137 | case CDS: |
kenjiArai | 18:b3a27f681171 | 138 | // v_adc = Rfix / (Rcds + Rfix) -> Rcds = ( Rfix / v_adc ) - Rfix |
kenjiArai | 18:b3a27f681171 | 139 | r_cds = (R_FIX / av_cds) - R_FIX; |
kenjiArai | 18:b3a27f681171 | 140 | // CDS resistance to Lux conversion using convertion table(luc_cds) |
kenjiArai | 18:b3a27f681171 | 141 | for (i =0; i < CDS_TBL_SIZE; i++) { // search table |
kenjiArai | 18:b3a27f681171 | 142 | if ( r_cds <= lux_cds[i][0]) { |
kenjiArai | 18:b3a27f681171 | 143 | break; |
kenjiArai | 18:b3a27f681171 | 144 | } |
kenjiArai | 18:b3a27f681171 | 145 | } |
kenjiArai | 18:b3a27f681171 | 146 | // Check table position |
kenjiArai | 18:b3a27f681171 | 147 | if (i == 0) { |
kenjiArai | 18:b3a27f681171 | 148 | lux = lux_cds[0][1]; |
kenjiArai | 15:065fbeddc305 | 149 | break; |
kenjiArai | 18:b3a27f681171 | 150 | } else if ( i == CDS_TBL_SIZE ) { |
kenjiArai | 18:b3a27f681171 | 151 | if ( r_cds <= lux_cds[i][0] ) { |
kenjiArai | 18:b3a27f681171 | 152 | lux = lux_cds[i-1][1]; |
kenjiArai | 18:b3a27f681171 | 153 | break; |
kenjiArai | 18:b3a27f681171 | 154 | } |
kenjiArai | 15:065fbeddc305 | 155 | } |
kenjiArai | 18:b3a27f681171 | 156 | // Linear interpolation |
kenjiArai | 18:b3a27f681171 | 157 | y1 = lux_cds[i-1][1] - lux_cds[i][1]; |
kenjiArai | 18:b3a27f681171 | 158 | x1 = lux_cds[i][0] - lux_cds[i-1][0]; |
kenjiArai | 18:b3a27f681171 | 159 | dx = r_cds - lux_cds[i-1][0]; |
kenjiArai | 18:b3a27f681171 | 160 | lux = lux_cds[i-1][1] - ((dx/x1) * y1); |
kenjiArai | 18:b3a27f681171 | 161 | break; |
kenjiArai | 18:b3a27f681171 | 162 | case VREF: // vref = VREF_VOLT / VCC -> VCC = VREF_VOLT / vref |
kenjiArai | 18:b3a27f681171 | 163 | cal_vcc = VREF_VOLT / vref; |
kenjiArai | 18:b3a27f681171 | 164 | break; |
kenjiArai | 18:b3a27f681171 | 165 | case VOL: // Vol center = 1.00 (actual 100) |
kenjiArai | 18:b3a27f681171 | 166 | nor_vol = (uint32_t)(av_vol * 200) + VOL_OFFSET; |
kenjiArai | 18:b3a27f681171 | 167 | break; |
kenjiArai | 15:065fbeddc305 | 168 | } |
kenjiArai | 15:065fbeddc305 | 169 | } |
kenjiArai | 13:950adc9d6d61 | 170 | |
kenjiArai | 15:065fbeddc305 | 171 | // Read adc data and averaging |
kenjiArai | 18:b3a27f681171 | 172 | void adc_all_read (void) |
kenjiArai | 18:b3a27f681171 | 173 | { |
kenjiArai | 18:b3a27f681171 | 174 | if (av_cds == 0) { |
kenjiArai | 18:b3a27f681171 | 175 | av_cds = cds.read(); |
kenjiArai | 18:b3a27f681171 | 176 | } else { |
kenjiArai | 18:b3a27f681171 | 177 | av_cds = av_cds *0.5 + cds.read() * 0.5; |
kenjiArai | 15:065fbeddc305 | 178 | } |
kenjiArai | 18:b3a27f681171 | 179 | if (av_vref == 0) { |
kenjiArai | 18:b3a27f681171 | 180 | av_vref = vref.read(); |
kenjiArai | 18:b3a27f681171 | 181 | } else { |
kenjiArai | 18:b3a27f681171 | 182 | av_vref = av_vref *0.9 + vref.read() * 0.1; |
kenjiArai | 15:065fbeddc305 | 183 | } |
kenjiArai | 18:b3a27f681171 | 184 | if (av_vol == 0) { |
kenjiArai | 18:b3a27f681171 | 185 | av_vol = vol.read(); |
kenjiArai | 18:b3a27f681171 | 186 | } else { |
kenjiArai | 18:b3a27f681171 | 187 | av_vol = av_vol *0.2 + vol.read() * 0.8; |
kenjiArai | 18:b3a27f681171 | 188 | } |
kenjiArai | 15:065fbeddc305 | 189 | } |
kenjiArai | 13:950adc9d6d61 | 190 | |
kenjiArai | 15:065fbeddc305 | 191 | // Read Humidity sensor data |
kenjiArai | 18:b3a27f681171 | 192 | void hum_RHT03_read (void) |
kenjiArai | 18:b3a27f681171 | 193 | { |
kenjiArai | 18:b3a27f681171 | 194 | while (true) { // wait data |
kenjiArai | 18:b3a27f681171 | 195 | if ( humtemp.readData() == RHT_ERROR_NONE ) { |
kenjiArai | 18:b3a27f681171 | 196 | break; |
kenjiArai | 18:b3a27f681171 | 197 | } |
kenjiArai | 15:065fbeddc305 | 198 | } |
kenjiArai | 18:b3a27f681171 | 199 | if (humidity_temp == 0) { |
kenjiArai | 18:b3a27f681171 | 200 | humidity_temp = humtemp.getTemperatureC(); |
kenjiArai | 18:b3a27f681171 | 201 | } else { |
kenjiArai | 18:b3a27f681171 | 202 | humidity_temp = humidity_temp * 0.9 + humtemp.getTemperatureC() * 0.1; |
kenjiArai | 15:065fbeddc305 | 203 | } |
kenjiArai | 18:b3a27f681171 | 204 | if ( humidity == 0 ) { |
kenjiArai | 18:b3a27f681171 | 205 | humidity = humtemp.getHumidity(); |
kenjiArai | 18:b3a27f681171 | 206 | } else { |
kenjiArai | 18:b3a27f681171 | 207 | humidity = humidity * 0.9 + humtemp.getHumidity() * 0.1; |
kenjiArai | 15:065fbeddc305 | 208 | } |
kenjiArai | 15:065fbeddc305 | 209 | } |
kenjiArai | 15:065fbeddc305 | 210 | |
kenjiArai | 18:b3a27f681171 | 211 | void set_lcd_screen(int n) |
kenjiArai | 18:b3a27f681171 | 212 | { |
kenjiArai | 15:065fbeddc305 | 213 | i2clcd.locate(0, 0); |
kenjiArai | 15:065fbeddc305 | 214 | i2clcd.printf("%s", scrn_1st[n]); |
kenjiArai | 15:065fbeddc305 | 215 | i2clcd.locate(0, 1); |
kenjiArai | 15:065fbeddc305 | 216 | i2clcd.printf("%s", scrn_2nd[n]); |
kenjiArai | 15:065fbeddc305 | 217 | } |
kenjiArai | 15:065fbeddc305 | 218 | |
kenjiArai | 18:b3a27f681171 | 219 | //------------------------------------------------------------------------------ |
kenjiArai | 15:065fbeddc305 | 220 | // Application program |
kenjiArai | 18:b3a27f681171 | 221 | //------------------------------------------------------------------------------ |
kenjiArai | 15:065fbeddc305 | 222 | // Nothing is done but just wake-up from sleep condition |
kenjiArai | 18:b3a27f681171 | 223 | void wakeup() |
kenjiArai | 18:b3a27f681171 | 224 | { |
kenjiArai | 15:065fbeddc305 | 225 | flag = 1; |
kenjiArai | 15:065fbeddc305 | 226 | myled1 = !myled1; |
kenjiArai | 15:065fbeddc305 | 227 | } |
kenjiArai | 15:065fbeddc305 | 228 | |
kenjiArai | 15:065fbeddc305 | 229 | // Measure pressure and show it on LCD |
kenjiArai | 18:b3a27f681171 | 230 | void conv_and_disp(void) |
kenjiArai | 18:b3a27f681171 | 231 | { |
kenjiArai | 18:b3a27f681171 | 232 | tm t; |
kenjiArai | 18:b3a27f681171 | 233 | time_t seconds = 0; |
kenjiArai | 18:b3a27f681171 | 234 | time_t old_seconds = 0; |
kenjiArai | 18:b3a27f681171 | 235 | uint32_t step = 0, dt; |
kenjiArai | 18:b3a27f681171 | 236 | uint8_t num; |
kenjiArai | 13:950adc9d6d61 | 237 | |
kenjiArai | 15:065fbeddc305 | 238 | while (true) { // infinit loop for measure and display |
kenjiArai | 15:065fbeddc305 | 239 | // Call wakeup()function after specific time |
kenjiArai | 18:b3a27f681171 | 240 | // this is for wake-up |
kenjiArai | 18:b3a27f681171 | 241 | to.attach(callback(&wakeup), chrono::milliseconds(STATE_CHANGE_TIME)); |
kenjiArai | 18:b3a27f681171 | 242 | //---- State Control ---- |
kenjiArai | 15:065fbeddc305 | 243 | num = lcd_disp_tbl[step++]; |
kenjiArai | 18:b3a27f681171 | 244 | switch (num) { |
kenjiArai | 18:b3a27f681171 | 245 | // ---------- Initialize data ------------------------------------- |
kenjiArai | 18:b3a27f681171 | 246 | case DSP_INIT: |
kenjiArai | 18:b3a27f681171 | 247 | av_cds = 0; |
kenjiArai | 18:b3a27f681171 | 248 | av_vref = 0; |
kenjiArai | 18:b3a27f681171 | 249 | av_vol = 0; |
kenjiArai | 18:b3a27f681171 | 250 | humidity_temp = 0; |
kenjiArai | 18:b3a27f681171 | 251 | humidity = 0; |
kenjiArai | 18:b3a27f681171 | 252 | // RTC |
kenjiArai | 18:b3a27f681171 | 253 | m41t62.set_sq_wave(RTC_SQW_NONE); |
kenjiArai | 18:b3a27f681171 | 254 | m41t62.read_rtc_std(&t); |
kenjiArai | 18:b3a27f681171 | 255 | old_seconds = mktime(&t); |
kenjiArai | 18:b3a27f681171 | 256 | break; |
kenjiArai | 18:b3a27f681171 | 257 | // ---------- Cds Sensor, Vref, Volume ---------------------------- |
kenjiArai | 18:b3a27f681171 | 258 | case DSP_LUX: |
kenjiArai | 18:b3a27f681171 | 259 | // Power on / Analog sensor |
kenjiArai | 18:b3a27f681171 | 260 | analog_pwr = 1; |
kenjiArai | 18:b3a27f681171 | 261 | vref_pwr = 1; |
kenjiArai | 18:b3a27f681171 | 262 | ThisThread::sleep_for(200ms); |
kenjiArai | 18:b3a27f681171 | 263 | adc_all_read(); |
kenjiArai | 18:b3a27f681171 | 264 | // Power off / Analog sensor |
kenjiArai | 18:b3a27f681171 | 265 | analog_pwr = 0; |
kenjiArai | 18:b3a27f681171 | 266 | // Normalize |
kenjiArai | 18:b3a27f681171 | 267 | adc_normalize(CDS); |
kenjiArai | 18:b3a27f681171 | 268 | adc_normalize(VREF); |
kenjiArai | 18:b3a27f681171 | 269 | adc_normalize(VOL); |
kenjiArai | 18:b3a27f681171 | 270 | set_lcd_screen(SCRN_Clear); |
kenjiArai | 18:b3a27f681171 | 271 | i2clcd.locate(0, 0); // 1st line top |
kenjiArai | 18:b3a27f681171 | 272 | // 12345678 |
kenjiArai | 18:b3a27f681171 | 273 | i2clcd.printf("L:%.1f", lux); |
kenjiArai | 18:b3a27f681171 | 274 | i2clcd.locate(0, 1); // 2nd line top |
kenjiArai | 18:b3a27f681171 | 275 | i2clcd.printf("V:%.3f", cal_vcc); |
kenjiArai | 18:b3a27f681171 | 276 | break; |
kenjiArai | 18:b3a27f681171 | 277 | // ---------- Barometer Sensor / BMP180 --------------------------- |
kenjiArai | 18:b3a27f681171 | 278 | case DSP_BARO: |
kenjiArai | 18:b3a27f681171 | 279 | bmp180.normalize(); |
kenjiArai | 18:b3a27f681171 | 280 | baro = bmp180.read_pressure(); |
kenjiArai | 18:b3a27f681171 | 281 | baro_temp = bmp180.read_temperature(); |
kenjiArai | 18:b3a27f681171 | 282 | set_lcd_screen(SCRN_Clear); |
kenjiArai | 18:b3a27f681171 | 283 | i2clcd.locate(0, 0); // 1st line top |
kenjiArai | 18:b3a27f681171 | 284 | i2clcd.printf("P:%.1f", baro); |
kenjiArai | 18:b3a27f681171 | 285 | i2clcd.locate(0, 1); // 2nd line top |
kenjiArai | 18:b3a27f681171 | 286 | i2clcd.printf("T:%+6.1f", baro_temp); |
kenjiArai | 18:b3a27f681171 | 287 | break; |
kenjiArai | 18:b3a27f681171 | 288 | // ---------- Humidity Sensor / RHT03 ----------------------------- |
kenjiArai | 18:b3a27f681171 | 289 | case DSP_HUMD: |
kenjiArai | 18:b3a27f681171 | 290 | hum_RHT03_read(); // Read Humidity data then avaraging |
kenjiArai | 18:b3a27f681171 | 291 | set_lcd_screen(SCRN_Clear); |
kenjiArai | 18:b3a27f681171 | 292 | i2clcd.locate(0, 0); // 1st line top |
kenjiArai | 18:b3a27f681171 | 293 | i2clcd.printf("H:%.1f", humidity); |
kenjiArai | 18:b3a27f681171 | 294 | i2clcd.locate(0, 1); // 2nd line top |
kenjiArai | 18:b3a27f681171 | 295 | i2clcd.printf("T:%+6.1f", humidity_temp); |
kenjiArai | 18:b3a27f681171 | 296 | break; |
kenjiArai | 18:b3a27f681171 | 297 | // ---------- RTC ------------------------------------------------- |
kenjiArai | 18:b3a27f681171 | 298 | case DSP_TIME: |
kenjiArai | 18:b3a27f681171 | 299 | m41t62.read_rtc_std(&t); |
kenjiArai | 18:b3a27f681171 | 300 | seconds = mktime(&t); |
kenjiArai | 18:b3a27f681171 | 301 | set_lcd_screen(SCRN_Clear); |
kenjiArai | 18:b3a27f681171 | 302 | i2clcd.locate(0, 0); // 1st line top |
kenjiArai | 18:b3a27f681171 | 303 | i2clcd.printf("%02d/%02d/%02d", |
kenjiArai | 18:b3a27f681171 | 304 | t.tm_year % 100, t.tm_mon + 1, t.tm_mday); |
kenjiArai | 18:b3a27f681171 | 305 | i2clcd.locate(0, 1); // 2nd line top |
kenjiArai | 18:b3a27f681171 | 306 | i2clcd.printf("%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec); |
kenjiArai | 18:b3a27f681171 | 307 | break; |
kenjiArai | 18:b3a27f681171 | 308 | // ---------- EEPROM Logging -------------------------------------- |
kenjiArai | 18:b3a27f681171 | 309 | case DSP_LOG: |
kenjiArai | 18:b3a27f681171 | 310 | if (seconds >= old_seconds + TIME_INTERVAL) { |
kenjiArai | 18:b3a27f681171 | 311 | // Data Logging action |
kenjiArai | 18:b3a27f681171 | 312 | old_seconds += TIME_INTERVAL; |
kenjiArai | 18:b3a27f681171 | 313 | dtlog_data_pack(); // Get EEPROM resource |
kenjiArai | 18:b3a27f681171 | 314 | dtlog_one_write(); // Write data to EEPROM |
kenjiArai | 18:b3a27f681171 | 315 | dt = (uint32_t)dtlog_buf_occupation(); |
kenjiArai | 18:b3a27f681171 | 316 | dt = (dt * 1000)/ BLK_NO; |
kenjiArai | 18:b3a27f681171 | 317 | } |
kenjiArai | 18:b3a27f681171 | 318 | set_lcd_screen(SCRN_Clear); |
kenjiArai | 18:b3a27f681171 | 319 | i2clcd.locate(0, 0); // 1st line top |
kenjiArai | 18:b3a27f681171 | 320 | i2clcd.printf("Logging"); |
kenjiArai | 18:b3a27f681171 | 321 | i2clcd.locate(0, 1); // 2nd line top |
kenjiArai | 18:b3a27f681171 | 322 | i2clcd.printf("%d.%01d%%", dt / 10, dt % 10); |
kenjiArai | 18:b3a27f681171 | 323 | break; |
kenjiArai | 18:b3a27f681171 | 324 | // ---------- return (loop) --------------------------------------- |
kenjiArai | 18:b3a27f681171 | 325 | case DSP_RTURN: |
kenjiArai | 18:b3a27f681171 | 326 | default: |
kenjiArai | 18:b3a27f681171 | 327 | // <State> State change |
kenjiArai | 18:b3a27f681171 | 328 | step = 1; // if something wrong, go to reset condition |
kenjiArai | 15:065fbeddc305 | 329 | } |
kenjiArai | 18:b3a27f681171 | 330 | // ---------- back to top --------------------------------------------- |
kenjiArai | 15:065fbeddc305 | 331 | myled0 = !myled0; |
kenjiArai | 18:b3a27f681171 | 332 | while (flag == 0) { |
kenjiArai | 18:b3a27f681171 | 333 | ThisThread::sleep_for(10ms); |
kenjiArai | 18:b3a27f681171 | 334 | } |
kenjiArai | 18:b3a27f681171 | 335 | ThisThread::sleep_for(100ms); |
kenjiArai | 15:065fbeddc305 | 336 | myled1 = !myled1; |
kenjiArai | 15:065fbeddc305 | 337 | flag = 0; |
kenjiArai | 15:065fbeddc305 | 338 | } |
kenjiArai | 15:065fbeddc305 | 339 | } |
kenjiArai | 13:950adc9d6d61 | 340 | |
kenjiArai | 15:065fbeddc305 | 341 | // Application program starts here |
kenjiArai | 18:b3a27f681171 | 342 | int main() |
kenjiArai | 18:b3a27f681171 | 343 | { |
kenjiArai | 15:065fbeddc305 | 344 | flag = 0; |
kenjiArai | 15:065fbeddc305 | 345 | i2clcd.setContrast(25); |
kenjiArai | 15:065fbeddc305 | 346 | set_lcd_screen(SCRN_Opening); |
kenjiArai | 18:b3a27f681171 | 347 | if (sw_chng == 0) { // SW ON |
kenjiArai | 18:b3a27f681171 | 348 | //-- Enter Monitor Mode -- |
kenjiArai | 18:b3a27f681171 | 349 | myled1 = 1; |
kenjiArai | 18:b3a27f681171 | 350 | ThisThread::sleep_for(500ms); |
kenjiArai | 18:b3a27f681171 | 351 | myled1 = 0; |
kenjiArai | 18:b3a27f681171 | 352 | ThisThread::sleep_for(500ms); |
kenjiArai | 18:b3a27f681171 | 353 | myled1 = 1; |
kenjiArai | 18:b3a27f681171 | 354 | ThisThread::sleep_for(500ms); |
kenjiArai | 18:b3a27f681171 | 355 | if (sw_chng == 0) { // Still SW ON |
kenjiArai | 18:b3a27f681171 | 356 | myled1 = 0; |
kenjiArai | 18:b3a27f681171 | 357 | ThisThread::sleep_for(500ms); |
kenjiArai | 18:b3a27f681171 | 358 | myled1 = 1; |
kenjiArai | 18:b3a27f681171 | 359 | ThisThread::sleep_for(500ms); |
kenjiArai | 18:b3a27f681171 | 360 | if (sw_mode == 0) { // SW ON |
kenjiArai | 15:065fbeddc305 | 361 | set_lcd_screen(SCRN_Clear); |
kenjiArai | 15:065fbeddc305 | 362 | set_lcd_screen(SCRN_Goto_mon); |
kenjiArai | 15:065fbeddc305 | 363 | myled1 = 0; |
kenjiArai | 15:065fbeddc305 | 364 | mon(); // mon.cpp |
kenjiArai | 15:065fbeddc305 | 365 | } |
kenjiArai | 15:065fbeddc305 | 366 | set_lcd_screen(SCRN_Clear); |
kenjiArai | 15:065fbeddc305 | 367 | set_lcd_screen(SCRN_Backto_normal); |
kenjiArai | 15:065fbeddc305 | 368 | } |
kenjiArai | 15:065fbeddc305 | 369 | } |
kenjiArai | 15:065fbeddc305 | 370 | //-- Enter Normal Mode -- |
kenjiArai | 15:065fbeddc305 | 371 | myled0 = 1; |
kenjiArai | 15:065fbeddc305 | 372 | myled1 = 0; |
kenjiArai | 15:065fbeddc305 | 373 | while (true) { // Start main program |
kenjiArai | 15:065fbeddc305 | 374 | conv_and_disp(); |
kenjiArai | 15:065fbeddc305 | 375 | } |
kenjiArai | 15:065fbeddc305 | 376 | } |