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:
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 }