1st release version. Set TYBLE16 as Central mode

Dependencies:   mbed

Fork of TYBLE16_BME280_data_sender by Kenji Arai

Please refer following page.
/users/kenjiArai/notebook/tyble16-module--uart-communication-between-central/#

Committer:
kenjiArai
Date:
Sat Oct 28 11:30:37 2017 +0000
Revision:
0:c3a498a8091c
Child:
1:f2982d4f4037
1st rev.

Who changed what in which revision?

UserRevisionLine numberNew 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 0:c3a498a8091c 15 * Revised: October 28th, 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 0:c3a498a8091c 101 tyble16.printf("ommand not avairable, 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 tyble16.printf("Hit q then enter <Uart Mode>\r\n");
kenjiArai 0:c3a498a8091c 118 // warming up the sensor
kenjiArai 0:c3a498a8091c 119 for (int n = 0; n < 6; n++){
kenjiArai 0:c3a498a8091c 120 bme280.getPressure();
kenjiArai 0:c3a498a8091c 121 bme280.getTemperature();
kenjiArai 0:c3a498a8091c 122 bme280.getHumidity();
kenjiArai 0:c3a498a8091c 123 }
kenjiArai 0:c3a498a8091c 124 t.attach(check_connection, 1);
kenjiArai 0:c3a498a8091c 125 while(true){
kenjiArai 0:c3a498a8091c 126 while(tyble16.readable()){
kenjiArai 0:c3a498a8091c 127 //----- data receive from Client -----------------------------------
kenjiArai 0:c3a498a8091c 128 received_data = true;
kenjiArai 0:c3a498a8091c 129 c = tyble16.getc(); // received data from client
kenjiArai 0:c3a498a8091c 130 pc.putc(c); // show to console
kenjiArai 0:c3a498a8091c 131 rcv_bf[n++] = c; // save int buf
kenjiArai 0:c3a498a8091c 132 if (c == '\n'){ // end one line
kenjiArai 0:c3a498a8091c 133 pc.putc('\r');
kenjiArai 0:c3a498a8091c 134 rcv_bf[n] = 0;
kenjiArai 0:c3a498a8091c 135 if (n >3){
kenjiArai 0:c3a498a8091c 136 parse_input(rcv_bf); // ckeck command or not
kenjiArai 0:c3a498a8091c 137 /*for (int i=0;; i++){
kenjiArai 0:c3a498a8091c 138 if (rcv_bf[i] == 0){break;}
kenjiArai 0:c3a498a8091c 139 pc.printf("0x%x,", rcv_bf[i]);
kenjiArai 0:c3a498a8091c 140 }*/
kenjiArai 0:c3a498a8091c 141 if ((rcv_bf[0] == '@') && (rcv_bf[2] == '\r')){
kenjiArai 0:c3a498a8091c 142 excute_command(rcv_bf); // BME280 data output
kenjiArai 0:c3a498a8091c 143 }
kenjiArai 0:c3a498a8091c 144 }
kenjiArai 0:c3a498a8091c 145 n = 0; // Clear buffer
kenjiArai 0:c3a498a8091c 146 }
kenjiArai 0:c3a498a8091c 147 }
kenjiArai 0:c3a498a8091c 148 while(pc.readable()){
kenjiArai 0:c3a498a8091c 149 //----- data send to Client ----------------------------------------
kenjiArai 0:c3a498a8091c 150 char c = pc.getc();
kenjiArai 0:c3a498a8091c 151 tyble16.putc(c);
kenjiArai 0:c3a498a8091c 152 pc.putc(c); // echo back
kenjiArai 0:c3a498a8091c 153 if(c == '\r'){ // if CR then put LF
kenjiArai 0:c3a498a8091c 154 tyble16.putc('\n');
kenjiArai 0:c3a498a8091c 155 pc.putc('\n');
kenjiArai 0:c3a498a8091c 156 }
kenjiArai 0:c3a498a8091c 157 }
kenjiArai 0:c3a498a8091c 158 }
kenjiArai 0:c3a498a8091c 159 }
kenjiArai 0:c3a498a8091c 160
kenjiArai 0:c3a498a8091c 161 // Check Response Events
kenjiArai 0:c3a498a8091c 162 void parse_input(char *buf)
kenjiArai 0:c3a498a8091c 163 {
kenjiArai 0:c3a498a8091c 164 if (strstr(buf, "CON")){ // Connection successful
kenjiArai 0:c3a498a8091c 165 state_connection = true;
kenjiArai 0:c3a498a8091c 166 } else if (strstr(buf, "DCO")){ // Disconnect
kenjiArai 0:c3a498a8091c 167 state_connection = false;
kenjiArai 0:c3a498a8091c 168 } else if (strstr(buf, "ADT")){ // Advertising Timeout
kenjiArai 0:c3a498a8091c 169 state_connection = false;
kenjiArai 0:c3a498a8091c 170 cmd_timeout_cntr = 0;
kenjiArai 0:c3a498a8091c 171 } else if (strstr(buf, "NAK")){ // Failed
kenjiArai 0:c3a498a8091c 172 state_connection = false;
kenjiArai 0:c3a498a8091c 173 if (cmd_timeout_cntr == 0){
kenjiArai 0:c3a498a8091c 174 // Both Advertising Start. Connectable and Discoverable.
kenjiArai 0:c3a498a8091c 175 tyble16.printf("BCD3\r\n"); // send above command
kenjiArai 0:c3a498a8091c 176 cmd_timeout_cntr = ADT_TIME;
kenjiArai 0:c3a498a8091c 177 }
kenjiArai 0:c3a498a8091c 178 }
kenjiArai 0:c3a498a8091c 179 }
kenjiArai 0:c3a498a8091c 180
kenjiArai 0:c3a498a8091c 181 // Every one second, check communication status
kenjiArai 0:c3a498a8091c 182 void check_connection(void)
kenjiArai 0:c3a498a8091c 183 {
kenjiArai 0:c3a498a8091c 184 static int8_t counter = 0;
kenjiArai 0:c3a498a8091c 185
kenjiArai 0:c3a498a8091c 186 if ((received_data == false) && (state_connection == false)){
kenjiArai 0:c3a498a8091c 187 if (++counter >= TIME_OUT){
kenjiArai 0:c3a498a8091c 188 tyble16.putc('\n');
kenjiArai 0:c3a498a8091c 189 counter = 0;
kenjiArai 0:c3a498a8091c 190 }
kenjiArai 0:c3a498a8091c 191 } else {
kenjiArai 0:c3a498a8091c 192 counter = 0;
kenjiArai 0:c3a498a8091c 193 }
kenjiArai 0:c3a498a8091c 194 if (cmd_timeout_cntr != 0){
kenjiArai 0:c3a498a8091c 195 --cmd_timeout_cntr;
kenjiArai 0:c3a498a8091c 196 }
kenjiArai 0:c3a498a8091c 197 received_data = false;
kenjiArai 0:c3a498a8091c 198 }