Condensation Monitor Measure the current environment condition at outside and inside and make caution or warnings related to condensation. Support UART over BLE. It works with nRF Toolbox. 結露モニタ 屋内外の環境情報を計測し、結露に関する警告あるいは注意を出力します。 nRF Toolboxと一緒に動作し、UART機能でBLE経由でメッセージを出力します。 ドキュメント https://developer.mbed.org/users/takafuminaka/notebook/information-about-my-condensation-monitor-for-mbed/

Dependencies:   AQM0802 BME280 HDC1000 VaporCondition mbed BLE_API nRF51822 BLE_Condensation_Monitor

Dependents:   BLE_Condensation_Monitor

Fork of Condensation_Monitor by Nakatafu ☆

Committer:
takafuminaka
Date:
Sun May 31 06:39:09 2015 +0000
Revision:
4:3075954b341c
Parent:
3:8f886f74f9bb
Child:
5:06d988a47721
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 }