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:
Mon Jul 20 10:42:49 2015 +0000
Revision:
9:75b78697edc6
Parent:
8:f2b32f6b161c
Added header comment in main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
takafuminaka 9:75b78697edc6 1 // BLE Condensation Monitor
takafuminaka 9:75b78697edc6 2 // https://developer.mbed.org/users/takafuminaka/code/BLE_Condensation_Monitor/
takafuminaka 9:75b78697edc6 3 // T.Naka
takafuminaka 9:75b78697edc6 4
yasuyuki 0:6434ef883399 5 #include "mbed.h"
yasuyuki 0:6434ef883399 6 #include "HDC1000.h"
takafuminaka 1:1cf4309871b7 7 #include "BME280.h"
takafuminaka 4:3075954b341c 8 #include "AQM0802.h"
takafuminaka 4:3075954b341c 9
takafuminaka 1:1cf4309871b7 10 #include "VaporCondition.h"
takafuminaka 1:1cf4309871b7 11
takafuminaka 1:1cf4309871b7 12 #define NEED_CONSOLE_OUTPUT 1
takafuminaka 5:06d988a47721 13 #define NEED_BLE_CONSOLE 1
takafuminaka 4:3075954b341c 14 #define NEED_LCD_OUTPUT 1
takafuminaka 1:1cf4309871b7 15
takafuminaka 7:7cecec859fe1 16 #define TYPE_HDC1000 1
takafuminaka 7:7cecec859fe1 17 #define TYPE_BME280 2
takafuminaka 7:7cecec859fe1 18
takafuminaka 7:7cecec859fe1 19 // #define INSIDE_SENSOR TYPE_HDC1000
takafuminaka 7:7cecec859fe1 20 #define INSIDE_SENSOR TYPE_BME280
takafuminaka 7:7cecec859fe1 21
takafuminaka 1:1cf4309871b7 22 #if NEED_CONSOLE_OUTPUT
takafuminaka 1:1cf4309871b7 23 Serial pc(USBTX, USBRX);
takafuminaka 1:1cf4309871b7 24 #define PC(...) { pc.printf(__VA_ARGS__); }
takafuminaka 1:1cf4309871b7 25 #else
takafuminaka 1:1cf4309871b7 26 #define PC(...) /* nothing */
takafuminaka 1:1cf4309871b7 27 #endif /* #if NEED_CONSOLE_OUTPUT */
takafuminaka 1:1cf4309871b7 28
takafuminaka 5:06d988a47721 29 #if NEED_BLE_CONSOLE
takafuminaka 5:06d988a47721 30 #include "BLEDevice.h"
takafuminaka 5:06d988a47721 31 #include "UARTService.h"
takafuminaka 5:06d988a47721 32 #define BLEC(...) { char __blecstr[32]; sprintf(__blecstr,__VA_ARGS__); if (uart) uart->write(__blecstr, strlen(__blecstr)); }
takafuminaka 5:06d988a47721 33 #else
takafuminaka 5:06d988a47721 34 #define BLEC(...) /* nothing */
takafuminaka 5:06d988a47721 35 #endif /* #if NEED_BLE_CONSOLE */
yasuyuki 0:6434ef883399 36
yasuyuki 0:6434ef883399 37 #if defined(TARGET_LPC1768)
takafuminaka 6:3c2404870d39 38 I2C i2c(p28, p27);
takafuminaka 6:3c2404870d39 39 // BME280 sensor(p28, p27, 0x76 << 1);
takafuminaka 1:1cf4309871b7 40 #else
takafuminaka 6:3c2404870d39 41 I2C i2c(I2C_SDA0, I2C_SCL0);
takafuminaka 6:3c2404870d39 42 // BME280 sensor(I2C_SDA0, I2C_SCL0, 0x76 << 1);
yasuyuki 0:6434ef883399 43 #endif
yasuyuki 0:6434ef883399 44
takafuminaka 7:7cecec859fe1 45 BME280 sensor_out(I2C_SDA0, I2C_SCL0, 0x76 << 1);
takafuminaka 7:7cecec859fe1 46
takafuminaka 7:7cecec859fe1 47 #if INSIDE_SENSOR == TYPE_HDC1000
takafuminaka 7:7cecec859fe1 48 HDC1000 sensor_in(i2c);
takafuminaka 7:7cecec859fe1 49 #elif INSIDE_SENSOR == TYPE_BME280
takafuminaka 7:7cecec859fe1 50 BME280 sensor_in(I2C_SDA0, I2C_SCL0, 0x77 << 1);
takafuminaka 7:7cecec859fe1 51 #endif
takafuminaka 7:7cecec859fe1 52
takafuminaka 4:3075954b341c 53 #if NEED_LCD_OUTPUT
takafuminaka 6:3c2404870d39 54 AQM0802 lcd(i2c);
takafuminaka 4:3075954b341c 55 #endif
yasuyuki 0:6434ef883399 56
takafuminaka 1:1cf4309871b7 57 DigitalOut led1(LED1);
takafuminaka 1:1cf4309871b7 58 DigitalOut led2(LED2);
takafuminaka 1:1cf4309871b7 59
takafuminaka 5:06d988a47721 60 #if NEED_BLE_CONSOLE
takafuminaka 5:06d988a47721 61 BLEDevice ble;
takafuminaka 5:06d988a47721 62 UARTService *uart;
takafuminaka 5:06d988a47721 63
takafuminaka 5:06d988a47721 64 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
takafuminaka 5:06d988a47721 65 {
takafuminaka 5:06d988a47721 66 PC("Disconnected!\n\r");
takafuminaka 5:06d988a47721 67 PC("Restarting the advertising process\n\r");
takafuminaka 5:06d988a47721 68 ble.startAdvertising();
takafuminaka 5:06d988a47721 69 }
takafuminaka 5:06d988a47721 70
takafuminaka 5:06d988a47721 71 #endif /* #if NEED_BLE_CONSOLE */
takafuminaka 4:3075954b341c 72
takafuminaka 6:3c2404870d39 73 int main()
takafuminaka 6:3c2404870d39 74 {
takafuminaka 4:3075954b341c 75 float Tdp_o =0.;
takafuminaka 4:3075954b341c 76 float Tdp_i =0.;
takafuminaka 4:3075954b341c 77 int cautions = 0;
takafuminaka 4:3075954b341c 78 int warnings = 0;
takafuminaka 1:1cf4309871b7 79 int warn_wid = 20;
takafuminaka 7:7cecec859fe1 80 char msg1[10],msg2[10];
takafuminaka 4:3075954b341c 81 int mode=0;
takafuminaka 4:3075954b341c 82 int skip=0;
takafuminaka 7:7cecec859fe1 83 char msg[4][2][10];
takafuminaka 5:06d988a47721 84 char bmsg[4][20];
takafuminaka 4:3075954b341c 85 int skipf[4];
takafuminaka 6:3c2404870d39 86
takafuminaka 4:3075954b341c 87 float Tcur;
takafuminaka 4:3075954b341c 88 float Tdp;
takafuminaka 4:3075954b341c 89 char *sTcur;
takafuminaka 4:3075954b341c 90 char *sWin;
takafuminaka 4:3075954b341c 91 char *ssTcur;
takafuminaka 4:3075954b341c 92 char *ssWin;
takafuminaka 5:06d988a47721 93 char *bsTcur;
takafuminaka 5:06d988a47721 94 char *bsWin;
takafuminaka 5:06d988a47721 95
takafuminaka 6:3c2404870d39 96 int skipped = 0;
takafuminaka 6:3c2404870d39 97
takafuminaka 1:1cf4309871b7 98 VaporCondition Inside;
takafuminaka 1:1cf4309871b7 99 VaporCondition Outside;
takafuminaka 1:1cf4309871b7 100
takafuminaka 6:3c2404870d39 101 // LED Check
takafuminaka 1:1cf4309871b7 102 led1 = 1;
takafuminaka 1:1cf4309871b7 103 led2 = 1;
takafuminaka 4:3075954b341c 104 wait(3);
takafuminaka 1:1cf4309871b7 105
takafuminaka 1:1cf4309871b7 106 led1 = 0;
takafuminaka 1:1cf4309871b7 107 led2 = 0;
takafuminaka 6:3c2404870d39 108
takafuminaka 7:7cecec859fe1 109 i2c.frequency(100000);
takafuminaka 6:3c2404870d39 110
takafuminaka 5:06d988a47721 111 #if NEED_BLE_CONSOLE
takafuminaka 6:3c2404870d39 112 // Setup BLE //
takafuminaka 5:06d988a47721 113 ble.init();
takafuminaka 5:06d988a47721 114 ble.onDisconnection(disconnectionCallback);
takafuminaka 6:3c2404870d39 115
takafuminaka 5:06d988a47721 116 uart = new UARTService(ble);
takafuminaka 5:06d988a47721 117
takafuminaka 5:06d988a47721 118 /* setup advertising */
takafuminaka 5:06d988a47721 119 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
takafuminaka 5:06d988a47721 120 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
takafuminaka 5:06d988a47721 121 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
takafuminaka 5:06d988a47721 122 (const uint8_t *)"BLE Condensation Monitor", sizeof("BLE Condensation Monitor") - 1);
takafuminaka 5:06d988a47721 123 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
takafuminaka 5:06d988a47721 124 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
takafuminaka 5:06d988a47721 125
takafuminaka 5:06d988a47721 126 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
takafuminaka 5:06d988a47721 127 ble.startAdvertising();
takafuminaka 5:06d988a47721 128 #endif /* #if NEED_BLE_CONSOLE */
takafuminaka 6:3c2404870d39 129
yasuyuki 0:6434ef883399 130 while(1) {
takafuminaka 6:3c2404870d39 131 if ( skipped == 0 ) {
takafuminaka 6:3c2404870d39 132 // Get data
takafuminaka 6:3c2404870d39 133
takafuminaka 7:7cecec859fe1 134 Outside.t = sensor_out.getTemperature();
takafuminaka 7:7cecec859fe1 135 Outside.h = sensor_out.getHumidity();
takafuminaka 6:3c2404870d39 136
takafuminaka 7:7cecec859fe1 137 Outside.p = sensor_out.getPressure();
yasuyuki 0:6434ef883399 138
takafuminaka 7:7cecec859fe1 139 #if INSIDE_SENSOR == TYPE_HDC1000
takafuminaka 7:7cecec859fe1 140 Inside.p = sensor_out.getPressure(); // Usually Pressures are same between inside and outside.
takafuminaka 7:7cecec859fe1 141 Inside.t = float(sensor_in.temperature())/0x10000*165-40;
takafuminaka 7:7cecec859fe1 142 Inside.h = float(sensor_in.humidity())/0x10000*100;
takafuminaka 7:7cecec859fe1 143 PC("In: %2.2f degC, %2.2f %%\r\n", Inside.t, Inside.h);
takafuminaka 7:7cecec859fe1 144 #elif INSIDE_SENSOR == TYPE_BME280
takafuminaka 7:7cecec859fe1 145 Inside.t = sensor_in.getTemperature();
takafuminaka 7:7cecec859fe1 146 Inside.h = sensor_in.getHumidity();
takafuminaka 7:7cecec859fe1 147 Inside.p = sensor_in.getPressure();
takafuminaka 7:7cecec859fe1 148 PC("In: %2.2f degC, %2.2f %%, %04.2f hPa\r\n", Inside.t, Inside.h, Inside.p);
takafuminaka 7:7cecec859fe1 149 #endif
takafuminaka 6:3c2404870d39 150
takafuminaka 7:7cecec859fe1 151 PC("Out: %2.2f degC, %2.2f %%, %04.2f hPa\r\n", Outside.t, Outside.h, Outside.p);
takafuminaka 1:1cf4309871b7 152
takafuminaka 6:3c2404870d39 153 PC("Humidity Ratio [g/kg] : In %2.2f Out %2.2f \r\n", Inside.Rh(), Outside.Rh());
takafuminaka 6:3c2404870d39 154 Tdp_o = Outside.Tdp();
takafuminaka 6:3c2404870d39 155 Tdp_i = Inside.Tdp();
takafuminaka 8:f2b32f6b161c 156 PC("Due Point Temperature [degC] : In %2.2f Out %2.2f \r\n", Tdp_i, Tdp_o);
yasuyuki 0:6434ef883399 157
takafuminaka 6:3c2404870d39 158 // print catuions and warnings //
takafuminaka 6:3c2404870d39 159 cautions = 0;
takafuminaka 6:3c2404870d39 160 warnings = 0;
takafuminaka 3:8f886f74f9bb 161
takafuminaka 6:3c2404870d39 162 for(int ii=0; ii<4; ii++) {
takafuminaka 6:3c2404870d39 163 if ( (ii % 2) == 1 ) {
takafuminaka 6:3c2404870d39 164 Tcur = Outside.t; // 1 and 3
takafuminaka 6:3c2404870d39 165 sTcur = "Outside";
takafuminaka 6:3c2404870d39 166 ssTcur = "Out";
takafuminaka 6:3c2404870d39 167 bsTcur = "Out";
takafuminaka 6:3c2404870d39 168 } else {
takafuminaka 6:3c2404870d39 169 Tcur = Inside.t; // 0 and 2
takafuminaka 6:3c2404870d39 170 sTcur = "Inside";
takafuminaka 6:3c2404870d39 171 ssTcur = "In";
takafuminaka 6:3c2404870d39 172 bsTcur = "In";
takafuminaka 6:3c2404870d39 173 }
takafuminaka 4:3075954b341c 174
takafuminaka 6:3c2404870d39 175 if ( ii / 2 ) {
takafuminaka 6:3c2404870d39 176 sWin = " Window"; // 2 and 3
takafuminaka 6:3c2404870d39 177 ssWin = "@Win";
takafuminaka 6:3c2404870d39 178 bsWin = "Wind.";
takafuminaka 6:3c2404870d39 179 } else {
takafuminaka 6:3c2404870d39 180 sWin = ""; // 0 and 1
takafuminaka 6:3c2404870d39 181 ssWin = "";
takafuminaka 6:3c2404870d39 182 bsWin = "";
takafuminaka 6:3c2404870d39 183 }
takafuminaka 4:3075954b341c 184
takafuminaka 6:3c2404870d39 185 if ( ii / 2 == ii %2 ) {
takafuminaka 6:3c2404870d39 186 Tdp = Tdp_i; // 0 and 3
takafuminaka 6:3c2404870d39 187 } else {
takafuminaka 6:3c2404870d39 188 Tdp = Tdp_o; // 1 and 1
takafuminaka 6:3c2404870d39 189 }
takafuminaka 6:3c2404870d39 190
takafuminaka 6:3c2404870d39 191 if ( Tdp >= Tcur - warn_wid ) {
takafuminaka 6:3c2404870d39 192 skipf[ii] = 0;
takafuminaka 6:3c2404870d39 193 if ( Tdp >= Tcur ) {
takafuminaka 7:7cecec859fe1 194 PC("Condensation at %s %s\r\n",sTcur,sWin);
takafuminaka 6:3c2404870d39 195 sprintf(msg[ii][0],"Condns!!");
takafuminaka 6:3c2404870d39 196 sprintf(msg[ii][1],"%s%s",ssTcur,ssWin);
takafuminaka 8:f2b32f6b161c 197 sprintf(bmsg[ii],"Cond. at %s%s",bsTcur,bsWin);
takafuminaka 6:3c2404870d39 198 cautions ++;
takafuminaka 6:3c2404870d39 199 } else {
takafuminaka 6:3c2404870d39 200 PC("%4.1f degC to Condensation at %s%s\r\n", Tcur - Tdp, sTcur, sWin);
takafuminaka 6:3c2404870d39 201 sprintf(msg[ii][0],"Cto%4.1fC",Tcur-Tdp);
takafuminaka 6:3c2404870d39 202 sprintf(msg[ii][1],"%s%s\0",ssTcur,ssWin);
takafuminaka 6:3c2404870d39 203 sprintf(bmsg[ii],"%4.1ftoC.at%s%s",Tcur - Tdp, bsTcur, bsWin);
takafuminaka 6:3c2404870d39 204 warnings ++;
takafuminaka 6:3c2404870d39 205 }
takafuminaka 6:3c2404870d39 206 } else {
takafuminaka 6:3c2404870d39 207 skipf[ii] = 1;
takafuminaka 6:3c2404870d39 208 }
takafuminaka 4:3075954b341c 209 }
takafuminaka 4:3075954b341c 210
takafuminaka 6:3c2404870d39 211 PC("\r\n");
takafuminaka 6:3c2404870d39 212
takafuminaka 6:3c2404870d39 213 if ( cautions > 0 ) {
takafuminaka 6:3c2404870d39 214 led2 = 1;
takafuminaka 4:3075954b341c 215 } else {
takafuminaka 6:3c2404870d39 216 led2 = 0;
takafuminaka 4:3075954b341c 217 }
takafuminaka 4:3075954b341c 218
takafuminaka 6:3c2404870d39 219 if ( warnings > 0 ) {
takafuminaka 6:3c2404870d39 220 led1 = 1;
takafuminaka 4:3075954b341c 221 } else {
takafuminaka 6:3c2404870d39 222 led1 = 0;
takafuminaka 4:3075954b341c 223 }
takafuminaka 4:3075954b341c 224
takafuminaka 1:1cf4309871b7 225 }
takafuminaka 4:3075954b341c 226 // LCD print
takafuminaka 4:3075954b341c 227 switch(mode) {
takafuminaka 4:3075954b341c 228 case (0):
takafuminaka 4:3075954b341c 229 skip = 1;
takafuminaka 4:3075954b341c 230 break;
takafuminaka 6:3c2404870d39 231
takafuminaka 4:3075954b341c 232 case (1):
takafuminaka 4:3075954b341c 233 sprintf(msg1,"Ti %4.1fC",Inside.t);
takafuminaka 4:3075954b341c 234 sprintf(msg2,"To %4.1fC",Outside.t);
takafuminaka 5:06d988a47721 235 BLEC("Temp.In%4.1f Out%4.1f\n",Inside.t, Outside.t);
takafuminaka 4:3075954b341c 236 break;
takafuminaka 6:3c2404870d39 237
takafuminaka 4:3075954b341c 238 case (2):
takafuminaka 4:3075954b341c 239 sprintf(msg1,"Hi %4.1f%%",Inside.h);
takafuminaka 4:3075954b341c 240 sprintf(msg2,"Ho %4.1f%%",Outside.h);
takafuminaka 5:06d988a47721 241 BLEC("Hum.In%2.0f%% Out%2.0f%%\n",Inside.h, Outside.h);
takafuminaka 4:3075954b341c 242 break;
takafuminaka 6:3c2404870d39 243
takafuminaka 4:3075954b341c 244 case (3):
takafuminaka 8:f2b32f6b161c 245 sprintf(msg1,"Po%6.1f",Outside.p);
takafuminaka 4:3075954b341c 246 sprintf(msg2," [hPa]");
takafuminaka 8:f2b32f6b161c 247 BLEC("Prs.Out%6.1fhPa\n",Outside.p);
takafuminaka 4:3075954b341c 248 break;
takafuminaka 6:3c2404870d39 249
takafuminaka 4:3075954b341c 250 case (4):
takafuminaka 7:7cecec859fe1 251 #if INSIDE_SENSOR == TYPE_BME280
takafuminaka 8:f2b32f6b161c 252 sprintf(msg1,"Pi%6.1f",Inside.p);
takafuminaka 7:7cecec859fe1 253 sprintf(msg2," [hPa]");
takafuminaka 8:f2b32f6b161c 254 BLEC("Prs.In %6.1fhPa\n",Inside.p);
takafuminaka 7:7cecec859fe1 255 #elif INSIDE_SENSOR == TYPE_HDC1000
takafuminaka 7:7cecec859fe1 256 skip = 1;
takafuminaka 7:7cecec859fe1 257 #endif
takafuminaka 7:7cecec859fe1 258 break;
takafuminaka 7:7cecec859fe1 259
takafuminaka 7:7cecec859fe1 260 case (5):
takafuminaka 4:3075954b341c 261 sprintf(msg1,"Dpi%4.1fC",Tdp_i);
takafuminaka 4:3075954b341c 262 sprintf(msg2,"Dpo%4.1fC",Tdp_o);
takafuminaka 5:06d988a47721 263 BLEC("DP. In%4.1f Out%4.1f\n",Tdp_i, Tdp_o);
takafuminaka 4:3075954b341c 264 break;
takafuminaka 6:3c2404870d39 265
takafuminaka 4:3075954b341c 266 case (6):
takafuminaka 4:3075954b341c 267 case (7):
takafuminaka 4:3075954b341c 268 case (8):
takafuminaka 7:7cecec859fe1 269 case (9):
takafuminaka 7:7cecec859fe1 270 int ii = mode - 6;
takafuminaka 4:3075954b341c 271 skip = skipf[ii];
takafuminaka 4:3075954b341c 272 sprintf(msg1,"%8s",msg[ii][0]);
takafuminaka 4:3075954b341c 273 sprintf(msg2,"%8s",msg[ii][1]);
takafuminaka 5:06d988a47721 274 BLEC("%s\n",bmsg[ii]);
takafuminaka 4:3075954b341c 275 break;
takafuminaka 4:3075954b341c 276 }
takafuminaka 4:3075954b341c 277 mode++;
takafuminaka 7:7cecec859fe1 278 if ( mode > 9 ) {
takafuminaka 6:3c2404870d39 279 mode = 0;
takafuminaka 6:3c2404870d39 280 }
takafuminaka 6:3c2404870d39 281
takafuminaka 4:3075954b341c 282 if ( skip == 0 ) {
takafuminaka 4:3075954b341c 283 #if NEED_LCD_OUTPUT
takafuminaka 4:3075954b341c 284 lcd.locate(0,0);
takafuminaka 4:3075954b341c 285 lcd.print(msg1);
takafuminaka 4:3075954b341c 286 lcd.locate(0,1);
takafuminaka 4:3075954b341c 287 lcd.print(msg2);
takafuminaka 6:3c2404870d39 288
takafuminaka 4:3075954b341c 289 #endif
takafuminaka 6:3c2404870d39 290 skipped = 0;
takafuminaka 4:3075954b341c 291 wait(3);
takafuminaka 4:3075954b341c 292 } else {
takafuminaka 4:3075954b341c 293 skip = 0;
takafuminaka 6:3c2404870d39 294 skipped = 1;
takafuminaka 4:3075954b341c 295 }
yasuyuki 0:6434ef883399 296 }
yasuyuki 0:6434ef883399 297
takafuminaka 4:3075954b341c 298 }