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 09:46:44 2015 +0000
Revision:
5:06d988a47721
Parent:
4:3075954b341c
Child:
6:3c2404870d39
Finished to BLE UART implimentation

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