Condensation Monitor Measure the current environment condition at outside and inside and make caution or warnings related to condensation. 結露モニタ 屋内外の環境情報を計測し、結露に関する警告あるいは注意を出力します。
Dependencies: BME280 HDC1000 VaporCondition mbed AQM0802
Fork of mbed_HDC1000 by
main.cpp@4:3075954b341c, 2015-05-31 (annotated)
- Committer:
- takafuminaka
- Date:
- Sun May 31 06:39:09 2015 +0000
- Revision:
- 4:3075954b341c
- Parent:
- 3:8f886f74f9bb
Added Local Display Support for AQM0802 (8x2 LCD); https://www.switch-science.com/catalog/1405/ etc.; ; ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yasuyuki | 0:6434ef883399 | 1 | //********************** |
yasuyuki | 0:6434ef883399 | 2 | // Hygrometer and Thermometer for mbed |
yasuyuki | 0:6434ef883399 | 3 | // |
yasuyuki | 0:6434ef883399 | 4 | // LPC1768 flash=512KB, ADC=12bits |
yasuyuki | 0:6434ef883399 | 5 | // LPC11U35 flash=64KB, ADC=10bits |
yasuyuki | 0:6434ef883399 | 6 | // Nucleo ADC=12bits |
yasuyuki | 0:6434ef883399 | 7 | // |
yasuyuki | 0:6434ef883399 | 8 | // (C)Copyright 2015 All rights reserved by Y.Onodera |
yasuyuki | 0:6434ef883399 | 9 | // http://einstlab.web.fc2.com |
yasuyuki | 0:6434ef883399 | 10 | //********************** |
yasuyuki | 0:6434ef883399 | 11 | #include "mbed.h" |
yasuyuki | 0:6434ef883399 | 12 | #include "HDC1000.h" |
takafuminaka | 1:1cf4309871b7 | 13 | #include "BME280.h" |
takafuminaka | 4:3075954b341c | 14 | #include "AQM0802.h" |
takafuminaka | 4:3075954b341c | 15 | |
takafuminaka | 1:1cf4309871b7 | 16 | #include "VaporCondition.h" |
takafuminaka | 1:1cf4309871b7 | 17 | |
takafuminaka | 1:1cf4309871b7 | 18 | #define NEED_CONSOLE_OUTPUT 1 |
takafuminaka | 4:3075954b341c | 19 | #define NEED_LCD_OUTPUT 1 |
takafuminaka | 1:1cf4309871b7 | 20 | |
takafuminaka | 1:1cf4309871b7 | 21 | #if NEED_CONSOLE_OUTPUT |
takafuminaka | 1:1cf4309871b7 | 22 | Serial pc(USBTX, USBRX); |
takafuminaka | 1:1cf4309871b7 | 23 | #define PC(...) { pc.printf(__VA_ARGS__); } |
takafuminaka | 1:1cf4309871b7 | 24 | #else |
takafuminaka | 1:1cf4309871b7 | 25 | #define PC(...) /* nothing */ |
takafuminaka | 1:1cf4309871b7 | 26 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
takafuminaka | 1:1cf4309871b7 | 27 | |
yasuyuki | 0:6434ef883399 | 28 | |
yasuyuki | 0:6434ef883399 | 29 | #if defined(TARGET_LPC1768) |
takafuminaka | 1:1cf4309871b7 | 30 | I2C i2c(p28, p27); |
takafuminaka | 1:1cf4309871b7 | 31 | // BME280 sensor(p28, p27, 0x76 << 1); |
takafuminaka | 1:1cf4309871b7 | 32 | #else |
takafuminaka | 1:1cf4309871b7 | 33 | I2C i2c(I2C_SDA0, I2C_SCL0); |
takafuminaka | 1:1cf4309871b7 | 34 | // BME280 sensor(I2C_SDA0, I2C_SCL0, 0x76 << 1); |
yasuyuki | 0:6434ef883399 | 35 | #endif |
yasuyuki | 0:6434ef883399 | 36 | |
takafuminaka | 1:1cf4309871b7 | 37 | BME280 bme280(I2C_SDA0, I2C_SCL0, 0x76 << 1); |
yasuyuki | 0:6434ef883399 | 38 | HDC1000 hdc1000(i2c); |
takafuminaka | 4:3075954b341c | 39 | #if NEED_LCD_OUTPUT |
takafuminaka | 4:3075954b341c | 40 | AQM0802 lcd(i2c); |
takafuminaka | 4:3075954b341c | 41 | #endif |
yasuyuki | 0:6434ef883399 | 42 | |
takafuminaka | 1:1cf4309871b7 | 43 | DigitalOut led1(LED1); |
takafuminaka | 1:1cf4309871b7 | 44 | DigitalOut led2(LED2); |
takafuminaka | 1:1cf4309871b7 | 45 | |
takafuminaka | 4:3075954b341c | 46 | |
yasuyuki | 0:6434ef883399 | 47 | int main() { |
takafuminaka | 4:3075954b341c | 48 | float Tdp_o =0.; |
takafuminaka | 4:3075954b341c | 49 | float Tdp_i =0.; |
takafuminaka | 4:3075954b341c | 50 | int cautions = 0; |
takafuminaka | 4:3075954b341c | 51 | int warnings = 0; |
takafuminaka | 1:1cf4309871b7 | 52 | int warn_wid = 20; |
takafuminaka | 4:3075954b341c | 53 | char msg1[10],msg2[9]; |
takafuminaka | 4:3075954b341c | 54 | int mode=0; |
takafuminaka | 4:3075954b341c | 55 | int skip=0; |
takafuminaka | 4:3075954b341c | 56 | char msg[4][2][9]; |
takafuminaka | 4:3075954b341c | 57 | int skipf[4]; |
yasuyuki | 0:6434ef883399 | 58 | |
takafuminaka | 4:3075954b341c | 59 | float Tcur; |
takafuminaka | 4:3075954b341c | 60 | float Tdp; |
takafuminaka | 4:3075954b341c | 61 | char *sTcur; |
takafuminaka | 4:3075954b341c | 62 | char *sWin; |
takafuminaka | 4:3075954b341c | 63 | char *ssTcur; |
takafuminaka | 4:3075954b341c | 64 | char *ssWin; |
takafuminaka | 4:3075954b341c | 65 | |
takafuminaka | 1:1cf4309871b7 | 66 | VaporCondition Inside; |
takafuminaka | 1:1cf4309871b7 | 67 | VaporCondition Outside; |
takafuminaka | 1:1cf4309871b7 | 68 | |
takafuminaka | 1:1cf4309871b7 | 69 | // LED Check |
takafuminaka | 1:1cf4309871b7 | 70 | led1 = 1; |
takafuminaka | 1:1cf4309871b7 | 71 | led2 = 1; |
takafuminaka | 4:3075954b341c | 72 | wait(3); |
takafuminaka | 1:1cf4309871b7 | 73 | |
takafuminaka | 1:1cf4309871b7 | 74 | led1 = 0; |
takafuminaka | 1:1cf4309871b7 | 75 | led2 = 0; |
takafuminaka | 3:8f886f74f9bb | 76 | |
takafuminaka | 3:8f886f74f9bb | 77 | // i2c.frequency(100000); |
yasuyuki | 0:6434ef883399 | 78 | |
yasuyuki | 0:6434ef883399 | 79 | while(1) { |
takafuminaka | 4:3075954b341c | 80 | // Get data |
yasuyuki | 0:6434ef883399 | 81 | |
takafuminaka | 3:8f886f74f9bb | 82 | Outside.t = bme280.getTemperature(); |
takafuminaka | 1:1cf4309871b7 | 83 | Outside.h = bme280.getHumidity(); |
takafuminaka | 1:1cf4309871b7 | 84 | |
takafuminaka | 1:1cf4309871b7 | 85 | Outside.p = bme280.getPressure(); |
takafuminaka | 1:1cf4309871b7 | 86 | Inside.p = bme280.getPressure(); // Usually Pressures are same between inside and outside. |
yasuyuki | 0:6434ef883399 | 87 | |
takafuminaka | 3:8f886f74f9bb | 88 | Inside.t = float(hdc1000.temperature())/0x10000*165-40; |
takafuminaka | 3:8f886f74f9bb | 89 | Inside.h = float(hdc1000.humidity())/0x10000*100; |
takafuminaka | 3:8f886f74f9bb | 90 | |
takafuminaka | 4:3075954b341c | 91 | // PC("%2.2f degC, %2.2f %%\r\n", t, h); |
takafuminaka | 4:3075954b341c | 92 | |
takafuminaka | 1:1cf4309871b7 | 93 | PC("In: %2.2f degC, %2.2f %% Out: %2.2f degC, %2.2f %%, %04.2f hPa\r\n", Inside.t, Inside.h, Outside.t, Outside.h, Outside.p); |
takafuminaka | 1:1cf4309871b7 | 94 | PC("Humidity Ratio [g/kg] : In %2.2f Out %2.2f \r\n", Inside.Rh(), Outside.Rh()); |
takafuminaka | 1:1cf4309871b7 | 95 | Tdp_o = Outside.Tdp(); |
takafuminaka | 1:1cf4309871b7 | 96 | Tdp_i = Inside.Tdp(); |
takafuminaka | 4:3075954b341c | 97 | PC("Due Point Temperature [degC] : In %2.2f Out %2.2f \r\n", Tdp_o, Tdp_i); |
takafuminaka | 4:3075954b341c | 98 | |
takafuminaka | 4:3075954b341c | 99 | // print catuions and warnings // |
takafuminaka | 1:1cf4309871b7 | 100 | cautions = 0; |
takafuminaka | 1:1cf4309871b7 | 101 | warnings = 0; |
takafuminaka | 4:3075954b341c | 102 | |
takafuminaka | 4:3075954b341c | 103 | for(int ii=0; ii<4; ii++) { |
takafuminaka | 4:3075954b341c | 104 | if ( (ii % 2) == 1 ) { |
takafuminaka | 4:3075954b341c | 105 | Tcur = Outside.t; // 1 and 3 |
takafuminaka | 4:3075954b341c | 106 | sTcur = "Outside"; |
takafuminaka | 4:3075954b341c | 107 | ssTcur = "Out"; |
takafuminaka | 4:3075954b341c | 108 | } else { |
takafuminaka | 4:3075954b341c | 109 | Tcur = Inside.t; // 0 and 2 |
takafuminaka | 4:3075954b341c | 110 | sTcur = "Inside"; |
takafuminaka | 4:3075954b341c | 111 | ssTcur = "In"; |
takafuminaka | 4:3075954b341c | 112 | } |
takafuminaka | 4:3075954b341c | 113 | |
takafuminaka | 4:3075954b341c | 114 | if ( ii / 2 ) { |
takafuminaka | 4:3075954b341c | 115 | sWin = " Window"; // 2 and 3 |
takafuminaka | 4:3075954b341c | 116 | ssWin = "@Win"; |
takafuminaka | 4:3075954b341c | 117 | } else { |
takafuminaka | 4:3075954b341c | 118 | sWin = ""; // 0 and 1 |
takafuminaka | 4:3075954b341c | 119 | ssWin = ""; |
takafuminaka | 4:3075954b341c | 120 | } |
takafuminaka | 4:3075954b341c | 121 | |
takafuminaka | 4:3075954b341c | 122 | if ( ii / 2 == ii %2 ) { |
takafuminaka | 4:3075954b341c | 123 | Tdp = Tdp_i; // 0 and 3 |
takafuminaka | 4:3075954b341c | 124 | } else { |
takafuminaka | 4:3075954b341c | 125 | Tdp = Tdp_o; // 1 and 1 |
takafuminaka | 4:3075954b341c | 126 | } |
takafuminaka | 4:3075954b341c | 127 | |
takafuminaka | 4:3075954b341c | 128 | if ( Tdp >= Tcur - warn_wid ) { |
takafuminaka | 4:3075954b341c | 129 | skipf[ii] = 0; |
takafuminaka | 4:3075954b341c | 130 | if ( Tdp >= Tcur ) { |
takafuminaka | 4:3075954b341c | 131 | PC("Condensation at %s\r\n",sTcur); |
takafuminaka | 4:3075954b341c | 132 | sprintf(msg[ii][0],"Condns!!"); |
takafuminaka | 4:3075954b341c | 133 | sprintf(msg[ii][1],"%s%s",ssTcur,ssWin); |
takafuminaka | 4:3075954b341c | 134 | cautions ++; |
takafuminaka | 4:3075954b341c | 135 | } else { |
takafuminaka | 4:3075954b341c | 136 | PC("%2.2f degC to Condensation at %s%s\r\n", Tcur - Tdp, sTcur, sWin); |
takafuminaka | 4:3075954b341c | 137 | sprintf(msg[ii][0],"Cto%4.1fC",Tcur-Tdp); |
takafuminaka | 4:3075954b341c | 138 | sprintf(msg[ii][1],"%s%s\0",ssTcur,ssWin); |
takafuminaka | 4:3075954b341c | 139 | warnings ++; |
takafuminaka | 4:3075954b341c | 140 | } |
takafuminaka | 4:3075954b341c | 141 | } else { |
takafuminaka | 4:3075954b341c | 142 | skipf[ii] = 1; |
takafuminaka | 4:3075954b341c | 143 | } |
takafuminaka | 1:1cf4309871b7 | 144 | } |
takafuminaka | 4:3075954b341c | 145 | |
takafuminaka | 4:3075954b341c | 146 | PC("\r\n"); |
takafuminaka | 4:3075954b341c | 147 | |
takafuminaka | 4:3075954b341c | 148 | if ( cautions > 0 ) { |
takafuminaka | 1:1cf4309871b7 | 149 | led2 = 1; |
takafuminaka | 4:3075954b341c | 150 | } else { |
takafuminaka | 1:1cf4309871b7 | 151 | led2 = 0; |
takafuminaka | 1:1cf4309871b7 | 152 | } |
takafuminaka | 4:3075954b341c | 153 | |
takafuminaka | 4:3075954b341c | 154 | if ( warnings > 0 ) { |
takafuminaka | 1:1cf4309871b7 | 155 | led1 = 1; |
takafuminaka | 4:3075954b341c | 156 | } else { |
takafuminaka | 1:1cf4309871b7 | 157 | led1 = 0; |
takafuminaka | 1:1cf4309871b7 | 158 | } |
takafuminaka | 4:3075954b341c | 159 | |
takafuminaka | 4:3075954b341c | 160 | // LCD print |
takafuminaka | 4:3075954b341c | 161 | switch(mode) { |
takafuminaka | 4:3075954b341c | 162 | case (0): |
takafuminaka | 4:3075954b341c | 163 | skip = 1; |
takafuminaka | 4:3075954b341c | 164 | break; |
takafuminaka | 4:3075954b341c | 165 | |
takafuminaka | 4:3075954b341c | 166 | case (1): |
takafuminaka | 4:3075954b341c | 167 | sprintf(msg1,"Ti %4.1fC",Inside.t); |
takafuminaka | 4:3075954b341c | 168 | sprintf(msg2,"To %4.1fC",Outside.t); |
takafuminaka | 4:3075954b341c | 169 | break; |
takafuminaka | 4:3075954b341c | 170 | |
takafuminaka | 4:3075954b341c | 171 | case (2): |
takafuminaka | 4:3075954b341c | 172 | sprintf(msg1,"Hi %4.1f%%",Inside.h); |
takafuminaka | 4:3075954b341c | 173 | sprintf(msg2,"Ho %4.1f%%",Outside.h); |
takafuminaka | 4:3075954b341c | 174 | break; |
takafuminaka | 4:3075954b341c | 175 | |
takafuminaka | 4:3075954b341c | 176 | case (3): |
takafuminaka | 4:3075954b341c | 177 | sprintf(msg1,"Po%6.2f",Outside.p); |
takafuminaka | 4:3075954b341c | 178 | sprintf(msg2," [hPa]"); |
takafuminaka | 4:3075954b341c | 179 | break; |
takafuminaka | 4:3075954b341c | 180 | |
takafuminaka | 4:3075954b341c | 181 | case (4): |
takafuminaka | 4:3075954b341c | 182 | sprintf(msg1,"Dpi%4.1fC",Tdp_i); |
takafuminaka | 4:3075954b341c | 183 | sprintf(msg2,"Dpo%4.1fC",Tdp_o); |
takafuminaka | 4:3075954b341c | 184 | break; |
takafuminaka | 4:3075954b341c | 185 | |
takafuminaka | 4:3075954b341c | 186 | case (5): |
takafuminaka | 4:3075954b341c | 187 | case (6): |
takafuminaka | 4:3075954b341c | 188 | case (7): |
takafuminaka | 4:3075954b341c | 189 | case (8): |
takafuminaka | 4:3075954b341c | 190 | int ii = mode - 5; |
takafuminaka | 4:3075954b341c | 191 | skip = skipf[ii]; |
takafuminaka | 4:3075954b341c | 192 | sprintf(msg1,"%8s",msg[ii][0]); |
takafuminaka | 4:3075954b341c | 193 | sprintf(msg2,"%8s",msg[ii][1]); |
takafuminaka | 4:3075954b341c | 194 | break; |
takafuminaka | 4:3075954b341c | 195 | } |
takafuminaka | 4:3075954b341c | 196 | mode++; |
takafuminaka | 4:3075954b341c | 197 | if ( mode > 8 ) { |
takafuminaka | 4:3075954b341c | 198 | mode = 0; |
takafuminaka | 4:3075954b341c | 199 | } |
takafuminaka | 1:1cf4309871b7 | 200 | |
takafuminaka | 4:3075954b341c | 201 | if ( skip == 0 ) { |
takafuminaka | 4:3075954b341c | 202 | #if NEED_LCD_OUTPUT |
takafuminaka | 4:3075954b341c | 203 | lcd.locate(0,0); |
takafuminaka | 4:3075954b341c | 204 | lcd.print(msg1); |
takafuminaka | 4:3075954b341c | 205 | lcd.locate(0,1); |
takafuminaka | 4:3075954b341c | 206 | lcd.print(msg2); |
takafuminaka | 4:3075954b341c | 207 | #endif |
takafuminaka | 4:3075954b341c | 208 | |
takafuminaka | 4:3075954b341c | 209 | wait(3); |
takafuminaka | 4:3075954b341c | 210 | } else { |
takafuminaka | 4:3075954b341c | 211 | skip = 0; |
takafuminaka | 4:3075954b341c | 212 | } |
yasuyuki | 0:6434ef883399 | 213 | } |
yasuyuki | 0:6434ef883399 | 214 | |
takafuminaka | 4:3075954b341c | 215 | } |