1、在mbed上的例程是基于X-NUCLEO-IKS01A1的,其中因为元件差别比较大,除了温湿度和压力传感器以外都是新的型号。所以在上一次评测中,只能使用温度数据的读出。
这次移植了该例程,并导入了新的库,测试成功。
2. 代码
- /* Includes */
- #include "mbed.h"
- #include "XNucleoIKS01A2.h"
- /* Instantiate the expansion board */
- static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance();
- /* Retrieve the composing elements of the expansion board */
- static GyroSensor *gyroscope = mems_expansion_board->acc_gyro;
- static MotionSensor *accelerometer = mems_expansion_board->accelerometer;
- 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;
- /* 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);
- /* prepare fill in of fractional part */
- len = strlen(str);
- ptr = &str[len];
- /* 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;
- }
- /* Simple main function */
- int main() {
- uint8_t id;
- float value1, value2;
- char buffer1[32], buffer2[32];
- int32_t axes[3];
-
- printf("\r\n--- Starting new run ---\r\n");
- humidity_sensor->read_id(&id);
- printf("HTS221 humidity & temperature = 0x%X\r\n", id);
- pressure_sensor->read_id(&id);
- printf("LPS25H pressure & temperature = 0x%X\r\n", id);
- magnetometer->read_id(&id);
- printf("LIS3MDL magnetometer = 0x%X\r\n", id);
- gyroscope->read_id(&id);
- printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
-
- wait(3);
-
- while(1) {
- printf("\r\n");
- temp_sensor1->get_temperature(&value1);
- humidity_sensor->get_humidity(&value2);
- printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
-
- temp_sensor2->get_fahrenheit(&value1);
- pressure_sensor->get_pressure(&value2);
- printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
- printf("---\r\n");
- magnetometer->get_m_axes(axes);
- printf("LIS3MDL [mag/mgauss]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
- accelerometer->get_x_axes(axes);
- printf("LSM6DS0 [acc/mg]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
- gyroscope->get_g_axes(axes);
- printf("LSM6DS0 [gyro/mdps]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
- wait(1.5);
- }
- }
3. 分析
其中的创建instance是关键,这次的范例,在没有设定引脚的null参数下,也判读后创建,避免了自己引脚不熟悉的结果,其中I2C用的是D14和D15
static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance()
之后,需要声明传感器的读取变量,
/* Retrieve the composing elements of the expansion board */
static GyroSensor *gyroscope = mems_expansion_board->acc_gyro;
static MotionSensor *accelerometer = mems_expansion_board->accelerometer;
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;
这些传感器都在声明变量的时候初始化了,因此,不必再设定init指令,
在显示的数据中,还不是很正确,因为很多参数没有正确量化。不过,这个例程,可以供仔细分析和调试了。