1st release version. Set TYBLE16 as Central mode
Fork of TYBLE16_BME280_data_sender by
Please refer following page.
/users/kenjiArai/notebook/tyble16-module--uart-communication-between-central/#
main.cpp@1:f2982d4f4037, 2017-10-29 (annotated)
- Committer:
- kenjiArai
- Date:
- Sun Oct 29 23:25:26 2017 +0000
- Revision:
- 1:f2982d4f4037
- Parent:
- 0:c3a498a8091c
- Child:
- 2:17fdd6d3877f
samll modification
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:c3a498a8091c | 1 | /* |
kenjiArai | 0:c3a498a8091c | 2 | * Mbed Application program / Using Akizuki BLE Module AE-TYBLE16 |
kenjiArai | 0:c3a498a8091c | 3 | * on-board module : TAIYO YUDEN BLE 4.2 TYSA-B (EYSGJNAWY-WX) |
kenjiArai | 0:c3a498a8091c | 4 | * |
kenjiArai | 0:c3a498a8091c | 5 | * http://akizukidenshi.com/catalog/g/gK-12339/ |
kenjiArai | 0:c3a498a8091c | 6 | * |
kenjiArai | 0:c3a498a8091c | 7 | * Refernce document |
kenjiArai | 0:c3a498a8091c | 8 | * https://www.yuden.co.jp/wireless_module/document/datareport2/jp/ |
kenjiArai | 0:c3a498a8091c | 9 | * TY_BLE_EYSGJNAWY_WX_BriefDataReport_V1_3_20170925J.pdf |
kenjiArai | 0:c3a498a8091c | 10 | * |
kenjiArai | 0:c3a498a8091c | 11 | * Copyright (c) 2017 Kenji Arai / JH1PJL |
kenjiArai | 0:c3a498a8091c | 12 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:c3a498a8091c | 13 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:c3a498a8091c | 14 | * Created: October 27th, 2017 |
kenjiArai | 1:f2982d4f4037 | 15 | * Revised: October 30th, 2017 |
kenjiArai | 0:c3a498a8091c | 16 | */ |
kenjiArai | 0:c3a498a8091c | 17 | |
kenjiArai | 0:c3a498a8091c | 18 | /* |
kenjiArai | 0:c3a498a8091c | 19 | Tested condition |
kenjiArai | 0:c3a498a8091c | 20 | mbed-os-5.6.3 & mbed Rev.154 |
kenjiArai | 0:c3a498a8091c | 21 | Nucleo-F446RE TYBLE16 /also F411RE & F042K6(only mbed & pin assign differ) |
kenjiArai | 0:c3a498a8091c | 22 | PA_9 pin5 / P0.03(UART_RX) |
kenjiArai | 0:c3a498a8091c | 23 | PA_10 pin6 / P0.01(UART_TX) |
kenjiArai | 0:c3a498a8091c | 24 | pin7 / P0.02(UART_CTS) connected to pin8 / P0.00(UART_RTS) |
kenjiArai | 0:c3a498a8091c | 25 | +3.3v pin14 / +V |
kenjiArai | 0:c3a498a8091c | 26 | GND pin13 / GND |
kenjiArai | 0:c3a498a8091c | 27 | Nucleo-F446RE BME280 |
kenjiArai | 0:c3a498a8091c | 28 | PB_9(SDA) SDI |
kenjiArai | 0:c3a498a8091c | 29 | PB_8(SCL) SDK |
kenjiArai | 0:c3a498a8091c | 30 | SDO = GND, CSB = +3.3V |
kenjiArai | 0:c3a498a8091c | 31 | Communcation with iPhone 7 iOS 11.0.3 |
kenjiArai | 0:c3a498a8091c | 32 | TYs Terminal App |
kenjiArai | 0:c3a498a8091c | 33 | https://itunes.apple.com/jp/app/tys-terminal-app/id1184640145?mt=8 |
kenjiArai | 0:c3a498a8091c | 34 | */ |
kenjiArai | 0:c3a498a8091c | 35 | |
kenjiArai | 0:c3a498a8091c | 36 | // Include -------------------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 37 | #include "mbed.h" |
kenjiArai | 0:c3a498a8091c | 38 | #include "BME280.h" |
kenjiArai | 0:c3a498a8091c | 39 | |
kenjiArai | 0:c3a498a8091c | 40 | // Definition ----------------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 41 | #define TIME_OUT 5 // 5 sec |
kenjiArai | 0:c3a498a8091c | 42 | #define ADT_TIME 15 // 15 sec |
kenjiArai | 0:c3a498a8091c | 43 | |
kenjiArai | 0:c3a498a8091c | 44 | // Object/ Constructor -------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 45 | Serial pc(USBTX,USBRX); |
kenjiArai | 0:c3a498a8091c | 46 | Serial tyble16(PA_9, PA_10); |
kenjiArai | 0:c3a498a8091c | 47 | BME280 bme280(I2C_SDA, I2C_SCL); |
kenjiArai | 0:c3a498a8091c | 48 | |
kenjiArai | 0:c3a498a8091c | 49 | // RAM ------------------------------------------------------------------------ |
kenjiArai | 0:c3a498a8091c | 50 | bool state_connection = false; |
kenjiArai | 0:c3a498a8091c | 51 | bool received_data = false; |
kenjiArai | 0:c3a498a8091c | 52 | uint32_t cmd_timeout_cntr = ADT_TIME; |
kenjiArai | 0:c3a498a8091c | 53 | Ticker t; |
kenjiArai | 0:c3a498a8091c | 54 | |
kenjiArai | 0:c3a498a8091c | 55 | // ROM / Constant data -------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 56 | |
kenjiArai | 0:c3a498a8091c | 57 | // Function prototypes -------------------------------------------------------- |
kenjiArai | 0:c3a498a8091c | 58 | void check_connection(void); |
kenjiArai | 0:c3a498a8091c | 59 | void parse_input(char *buf); |
kenjiArai | 0:c3a498a8091c | 60 | |
kenjiArai | 0:c3a498a8091c | 61 | //------------------------------------------------------------------------------ |
kenjiArai | 0:c3a498a8091c | 62 | // Control Program |
kenjiArai | 0:c3a498a8091c | 63 | //------------------------------------------------------------------------------ |
kenjiArai | 0:c3a498a8091c | 64 | // special command for BME280 data collection |
kenjiArai | 0:c3a498a8091c | 65 | bool excute_command(char *buf) |
kenjiArai | 0:c3a498a8091c | 66 | { |
kenjiArai | 0:c3a498a8091c | 67 | char c = buf[1]; |
kenjiArai | 0:c3a498a8091c | 68 | switch (c){ |
kenjiArai | 0:c3a498a8091c | 69 | case 'a': // All data |
kenjiArai | 0:c3a498a8091c | 70 | case 'A': |
kenjiArai | 0:c3a498a8091c | 71 | tyble16.printf("Pressure: %04.2f hPa\r\n", |
kenjiArai | 0:c3a498a8091c | 72 | bme280.getPressure()); |
kenjiArai | 0:c3a498a8091c | 73 | tyble16.printf("Temperature: %2.2f degC\r\n", |
kenjiArai | 0:c3a498a8091c | 74 | bme280.getTemperature()); |
kenjiArai | 0:c3a498a8091c | 75 | tyble16.printf("Humidity: %2.2f %%\r\n", |
kenjiArai | 0:c3a498a8091c | 76 | bme280.getHumidity()); |
kenjiArai | 0:c3a498a8091c | 77 | break; |
kenjiArai | 0:c3a498a8091c | 78 | case 'p': // Pressure |
kenjiArai | 0:c3a498a8091c | 79 | case 'P': |
kenjiArai | 0:c3a498a8091c | 80 | tyble16.printf("Pressure: %04.2f hPa\r\n", |
kenjiArai | 0:c3a498a8091c | 81 | bme280.getPressure()); |
kenjiArai | 0:c3a498a8091c | 82 | break; |
kenjiArai | 0:c3a498a8091c | 83 | case 't': // Temperature |
kenjiArai | 0:c3a498a8091c | 84 | case 'T': |
kenjiArai | 0:c3a498a8091c | 85 | tyble16.printf("Temperature: %2.2f degC\r\n", |
kenjiArai | 0:c3a498a8091c | 86 | bme280.getTemperature()); |
kenjiArai | 0:c3a498a8091c | 87 | break; |
kenjiArai | 0:c3a498a8091c | 88 | case 'h': // Humidity |
kenjiArai | 0:c3a498a8091c | 89 | case 'H': |
kenjiArai | 0:c3a498a8091c | 90 | tyble16.printf("Humidity: %2.2f %%\r\n", |
kenjiArai | 0:c3a498a8091c | 91 | bme280.getHumidity()); |
kenjiArai | 0:c3a498a8091c | 92 | break; |
kenjiArai | 0:c3a498a8091c | 93 | case '?': // Help |
kenjiArai | 0:c3a498a8091c | 94 | tyble16.printf("Command syntax\r\n"); |
kenjiArai | 0:c3a498a8091c | 95 | tyble16.printf("@a All of data\r\n"); |
kenjiArai | 0:c3a498a8091c | 96 | tyble16.printf("@p Pressure\r\n"); |
kenjiArai | 0:c3a498a8091c | 97 | tyble16.printf("@t Temperature\r\n"); |
kenjiArai | 0:c3a498a8091c | 98 | tyble16.printf("@h Humidity\r\n"); |
kenjiArai | 0:c3a498a8091c | 99 | break; |
kenjiArai | 0:c3a498a8091c | 100 | default: // no available command |
kenjiArai | 1:f2982d4f4037 | 101 | tyble16.printf("ommand not available, hit '@?'\r\n"); |
kenjiArai | 0:c3a498a8091c | 102 | break; |
kenjiArai | 0:c3a498a8091c | 103 | } |
kenjiArai | 0:c3a498a8091c | 104 | return true; |
kenjiArai | 0:c3a498a8091c | 105 | } |
kenjiArai | 0:c3a498a8091c | 106 | |
kenjiArai | 0:c3a498a8091c | 107 | int main() |
kenjiArai | 0:c3a498a8091c | 108 | { |
kenjiArai | 0:c3a498a8091c | 109 | static char rcv_bf[128]; |
kenjiArai | 0:c3a498a8091c | 110 | static uint8_t n = 0; |
kenjiArai | 0:c3a498a8091c | 111 | char c = 0; |
kenjiArai | 0:c3a498a8091c | 112 | |
kenjiArai | 0:c3a498a8091c | 113 | pc.printf("\r\n\r\nApplication for AE-TYBLE16 Module "); |
kenjiArai | 0:c3a498a8091c | 114 | pc.printf(" Peripheral(Sever) side\r\n"); |
kenjiArai | 0:c3a498a8091c | 115 | pc.printf(" created on %s %s\r\n", __DATE__, __TIME__); |
kenjiArai | 0:c3a498a8091c | 116 | tyble16.printf("I'm TYBLE16 module!\r\n"); |
kenjiArai | 0:c3a498a8091c | 117 | // warming up the sensor |
kenjiArai | 0:c3a498a8091c | 118 | for (int n = 0; n < 6; n++){ |
kenjiArai | 0:c3a498a8091c | 119 | bme280.getPressure(); |
kenjiArai | 0:c3a498a8091c | 120 | bme280.getTemperature(); |
kenjiArai | 0:c3a498a8091c | 121 | bme280.getHumidity(); |
kenjiArai | 0:c3a498a8091c | 122 | } |
kenjiArai | 0:c3a498a8091c | 123 | t.attach(check_connection, 1); |
kenjiArai | 0:c3a498a8091c | 124 | while(true){ |
kenjiArai | 0:c3a498a8091c | 125 | while(tyble16.readable()){ |
kenjiArai | 0:c3a498a8091c | 126 | //----- data receive from Client ----------------------------------- |
kenjiArai | 0:c3a498a8091c | 127 | received_data = true; |
kenjiArai | 0:c3a498a8091c | 128 | c = tyble16.getc(); // received data from client |
kenjiArai | 0:c3a498a8091c | 129 | pc.putc(c); // show to console |
kenjiArai | 0:c3a498a8091c | 130 | rcv_bf[n++] = c; // save int buf |
kenjiArai | 0:c3a498a8091c | 131 | if (c == '\n'){ // end one line |
kenjiArai | 0:c3a498a8091c | 132 | pc.putc('\r'); |
kenjiArai | 0:c3a498a8091c | 133 | rcv_bf[n] = 0; |
kenjiArai | 0:c3a498a8091c | 134 | if (n >3){ |
kenjiArai | 0:c3a498a8091c | 135 | parse_input(rcv_bf); // ckeck command or not |
kenjiArai | 0:c3a498a8091c | 136 | /*for (int i=0;; i++){ |
kenjiArai | 0:c3a498a8091c | 137 | if (rcv_bf[i] == 0){break;} |
kenjiArai | 0:c3a498a8091c | 138 | pc.printf("0x%x,", rcv_bf[i]); |
kenjiArai | 0:c3a498a8091c | 139 | }*/ |
kenjiArai | 0:c3a498a8091c | 140 | if ((rcv_bf[0] == '@') && (rcv_bf[2] == '\r')){ |
kenjiArai | 0:c3a498a8091c | 141 | excute_command(rcv_bf); // BME280 data output |
kenjiArai | 0:c3a498a8091c | 142 | } |
kenjiArai | 0:c3a498a8091c | 143 | } |
kenjiArai | 0:c3a498a8091c | 144 | n = 0; // Clear buffer |
kenjiArai | 0:c3a498a8091c | 145 | } |
kenjiArai | 0:c3a498a8091c | 146 | } |
kenjiArai | 0:c3a498a8091c | 147 | while(pc.readable()){ |
kenjiArai | 0:c3a498a8091c | 148 | //----- data send to Client ---------------------------------------- |
kenjiArai | 0:c3a498a8091c | 149 | char c = pc.getc(); |
kenjiArai | 0:c3a498a8091c | 150 | tyble16.putc(c); |
kenjiArai | 0:c3a498a8091c | 151 | pc.putc(c); // echo back |
kenjiArai | 0:c3a498a8091c | 152 | if(c == '\r'){ // if CR then put LF |
kenjiArai | 0:c3a498a8091c | 153 | tyble16.putc('\n'); |
kenjiArai | 0:c3a498a8091c | 154 | pc.putc('\n'); |
kenjiArai | 0:c3a498a8091c | 155 | } |
kenjiArai | 0:c3a498a8091c | 156 | } |
kenjiArai | 0:c3a498a8091c | 157 | } |
kenjiArai | 0:c3a498a8091c | 158 | } |
kenjiArai | 0:c3a498a8091c | 159 | |
kenjiArai | 0:c3a498a8091c | 160 | // Check Response Events |
kenjiArai | 0:c3a498a8091c | 161 | void parse_input(char *buf) |
kenjiArai | 0:c3a498a8091c | 162 | { |
kenjiArai | 0:c3a498a8091c | 163 | if (strstr(buf, "CON")){ // Connection successful |
kenjiArai | 0:c3a498a8091c | 164 | state_connection = true; |
kenjiArai | 0:c3a498a8091c | 165 | } else if (strstr(buf, "DCO")){ // Disconnect |
kenjiArai | 0:c3a498a8091c | 166 | state_connection = false; |
kenjiArai | 0:c3a498a8091c | 167 | } else if (strstr(buf, "ADT")){ // Advertising Timeout |
kenjiArai | 0:c3a498a8091c | 168 | state_connection = false; |
kenjiArai | 0:c3a498a8091c | 169 | cmd_timeout_cntr = 0; |
kenjiArai | 0:c3a498a8091c | 170 | } else if (strstr(buf, "NAK")){ // Failed |
kenjiArai | 0:c3a498a8091c | 171 | state_connection = false; |
kenjiArai | 0:c3a498a8091c | 172 | if (cmd_timeout_cntr == 0){ |
kenjiArai | 0:c3a498a8091c | 173 | // Both Advertising Start. Connectable and Discoverable. |
kenjiArai | 1:f2982d4f4037 | 174 | tyble16.printf("BCD3\r\n"); // send Advertising command |
kenjiArai | 0:c3a498a8091c | 175 | cmd_timeout_cntr = ADT_TIME; |
kenjiArai | 0:c3a498a8091c | 176 | } |
kenjiArai | 0:c3a498a8091c | 177 | } |
kenjiArai | 0:c3a498a8091c | 178 | } |
kenjiArai | 0:c3a498a8091c | 179 | |
kenjiArai | 0:c3a498a8091c | 180 | // Every one second, check communication status |
kenjiArai | 0:c3a498a8091c | 181 | void check_connection(void) |
kenjiArai | 0:c3a498a8091c | 182 | { |
kenjiArai | 0:c3a498a8091c | 183 | static int8_t counter = 0; |
kenjiArai | 0:c3a498a8091c | 184 | |
kenjiArai | 0:c3a498a8091c | 185 | if ((received_data == false) && (state_connection == false)){ |
kenjiArai | 0:c3a498a8091c | 186 | if (++counter >= TIME_OUT){ |
kenjiArai | 0:c3a498a8091c | 187 | tyble16.putc('\n'); |
kenjiArai | 0:c3a498a8091c | 188 | counter = 0; |
kenjiArai | 0:c3a498a8091c | 189 | } |
kenjiArai | 0:c3a498a8091c | 190 | } else { |
kenjiArai | 0:c3a498a8091c | 191 | counter = 0; |
kenjiArai | 0:c3a498a8091c | 192 | } |
kenjiArai | 0:c3a498a8091c | 193 | if (cmd_timeout_cntr != 0){ |
kenjiArai | 0:c3a498a8091c | 194 | --cmd_timeout_cntr; |
kenjiArai | 0:c3a498a8091c | 195 | } |
kenjiArai | 0:c3a498a8091c | 196 | received_data = false; |
kenjiArai | 0:c3a498a8091c | 197 | } |