Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API X_NUCLEO_IDB0XA1 X_NUCLEO_IKS01A1 mbed
Fork of HelloWorld_IKS01A1 by
Revision 7:4985455162fc, committed 2015-11-15
- Comitter:
- n0tform3
- Date:
- Sun Nov 15 07:30:17 2015 +0000
- Parent:
- 6:0460ce45e3d0
- Child:
- 8:1c6281289d67
- Commit message:
- first version working, no leds
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BLE_API.lib Sun Nov 15 07:30:17 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/Bluetooth-Low-Energy/code/BLE_API/#d494ad3e87bd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/X_NUCLEO_IDB0XA1.lib Sun Nov 15 07:30:17 2015 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/ST/code/X_NUCLEO_IDB0XA1/#32039585a969
--- a/main.cpp Fri Sep 04 08:29:53 2015 +0000
+++ b/main.cpp Sun Nov 15 07:30:17 2015 +0000
@@ -1,134 +1,104 @@
-/**
- ******************************************************************************
- * @file main.cpp
- * @author AST / EST
- * @version V0.0.1
- * @date 14-August-2015
- * @brief Simple Example application for using the X_NUCLEO_IKS01A1
- * MEMS Inertial & Environmental Sensor Nucleo expansion board.
- ******************************************************************************
- * @attention
- *
- * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of STMicroelectronics nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
-*/
-
-/* Includes */
#include "mbed.h"
#include "x_nucleo_iks01a1.h"
-
-/* Instantiate the expansion board */
-static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
+#include "mbed.h"
+#include "ble/BLE.h"
+#include "ble/services/HeartRateService.h"
+#include "ble/services/BatteryService.h"
+#include "ble/services/DeviceInformationService.h"
-/* Retrieve the composing elements of the expansion board */
-static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
-static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
-static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
-static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
-static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
-static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
-static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
-
-/* Helper function for printing floats & doubles */
-static char *printDouble(char* str, double v, int decimalDigits=2)
-{
- int i = 1;
- int intPart, fractPart;
- int len;
- char *ptr;
+BLE ble;
+DigitalOut led1(LED1);
- /* prepare decimal digits multiplicator */
- for (;decimalDigits!=0; i*=10, decimalDigits--);
-
- /* calculate integer & fractinal parts */
- intPart = (int)v;
- fractPart = (int)((v-(double)(int)v)*i);
-
- /* fill in integer part */
- sprintf(str, "%i.", intPart);
+const static char DEVICE_NAME[] = "HRM1";
+static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE,
+GattService::UUID_DEVICE_INFORMATION_SERVICE};
+static volatile bool triggerSensorPolling = false;
- /* prepare fill in of fractional part */
- len = strlen(str);
- ptr = &str[len];
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
+{
+ ble.gap().startAdvertising(); // restart advertising
+}
- /* fill in leading fractional zeros */
- for (i/=10;i>1; i/=10, ptr++) {
- if(fractPart >= i) break;
- *ptr = '0';
- }
-
- /* fill in (rest of) fractional part */
- sprintf(ptr, "%i", fractPart);
-
- return str;
+void periodicCallback(void)
+{
+ led1 = !led1;
+ triggerSensorPolling = true;
}
+static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
+static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
+
+
+
+Serial pc(USBTX, USBRX);
/* Simple main function */
int main() {
uint8_t id;
- float value1, value2;
- char buffer1[32], buffer2[32];
int32_t axes[3];
-
+ pc.baud(115200);
printf("\r\n--- Starting new run ---\r\n");
-
- humidity_sensor->ReadID(&id);
- printf("HTS221 humidity & temperature = 0x%X\r\n", id);
- pressure_sensor->ReadID(&id);
- printf("LPS25H pressure & temperature = 0x%X\r\n", id);
+
magnetometer->ReadID(&id);
printf("LIS3MDL magnetometer = 0x%X\r\n", id);
- gyroscope->ReadID(&id);
- printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
- wait(3);
-
- while(1) {
- printf("\r\n");
-
- temp_sensor1->GetTemperature(&value1);
- humidity_sensor->GetHumidity(&value2);
- printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
+ led1 = 1;
+ Ticker ticker;
+ ticker.attach(periodicCallback, 1); // blink LED every second
+
+ ble.init();
+ ble.gap().onDisconnection(disconnectionCallback);
+
+ /* Setup primary service. */
+ uint8_t hrmCounter = 0; // init HRM to 100bps
+ HeartRateService hrService(ble, hrmCounter, HeartRateService::LOCATION_FINGER);
+
+ /* Setup auxiliary service. */
+ DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
- temp_sensor2->GetFahrenheit(&value1);
- pressure_sensor->GetPressure(&value2);
- printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
+ /* Setup advertising. */
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+ ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+ ble.gap().setAdvertisingInterval(1000); /* 1000ms */
+
+ ble.gap().startAdvertising();
+
- printf("---\r\n");
+ uint8_t note = 0;
+ while(1) {
+ if (triggerSensorPolling && ble.getGapState().connected) {
+ triggerSensorPolling = false;
- magnetometer->Get_M_Axes(axes);
- printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-
- accelerometer->Get_X_Axes(axes);
- printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-
- gyroscope->Get_G_Axes(axes);
- printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
-
- wait(1.5);
+ magnetometer->Get_M_Axes(axes);
+ //printf("%6ld,\t %6ld,\t %6ld\r\n", axes[0], axes[1], axes[2]);
+
+ note = 0;
+ if (axes[0]>-81-40 && axes[0]<23+40 && axes[1]>-259-40 && axes[1]<-167+40 && axes[2]>827-40 && axes[2]<981+40)
+ note = 1;
+ else if (axes[0]>163-40 && axes[0]<289+40 && axes[1]>-397-40 && axes[1]<-316+40 && axes[2]>311-40 && axes[2]<357+40)
+ note = 2;
+ else if (axes[0]>-73-40 && axes[0]<43+40 && axes[1]>-441-40 && axes[1]<-313+40 && axes[2]>335-40 && axes[2]<420+40)
+ note = 3;
+ else if (axes[0]>-45-40 && axes[0]<25+40 && axes[1]>-612-40 && axes[1]<-561+40 && axes[2]>632-40 && axes[2]<761+40)
+ note = 4;
+ else if (axes[0]>-64-40 && axes[0]<-6+40 && axes[1]>-7-40 && axes[1]<35+40 && axes[2]>524-40 && axes[2]<677+40)
+ note = 5;
+ else if (axes[0]>-210-40 && axes[0]<-137+40 && axes[1]>-431-40 && axes[1]<-294+40 && axes[2]>455-40 && axes[2]<615+40)
+ note = 6;
+ else if (axes[0]>429-40 && axes[0]<471+40 && axes[1]>-145-40 && axes[1]<-91+40 && axes[2]>480-40 && axes[2]<580+40)
+ note = 7;
+ else if (axes[0]>164-40 && axes[0]<264+40 && axes[1]>-650-40 && axes[1]<-604+40 && axes[2]>560-40 && axes[2]<700+40)
+ note = 8;
+
+ printf("%d\n", note);
+
+ hrService.updateHeartRate(note);
+ wait(0.3);
+ } else {
+ ble.waitForEvent(); // low power wait for event
+ }
}
}
