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 11:11:48 2015 +0000
Revision:
6:3c2404870d39
Parent:
5:06d988a47721
Child:
7:7cecec859fe1
Small Modifications

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