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
main.cpp@6:3c2404870d39, 2015-05-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |