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 yasuyuki onodera

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?

UserRevisionLine numberNew 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 }