Nakatafu ☆ / Mbed 2 deprecated BLE_Condensation_Monitor

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 }