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 Jun 14 09:13:40 2015 +0000
Revision:
7:7cecec859fe1
Parent:
6:3c2404870d39
Child:
8:f2b32f6b161c
Internal Sensor is selectable BME280 or HDC1000 by INSIDE_SENSOR defitinion.
;
;

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