在环境监测中,常见的数据有气压、海拔、温度、湿度、风速、雨雪量等等,我们的BMP388的传感器可以支持气压、海拔、还有温度,我们可以通过读取BMP388的数据完成
我们在移植的过程中,还是需要注意一下引脚的配置关系以及输入输出和时序上的问题,由于H7de主频非常高,所以在使用的时候需要注意程序优化过程中数据的优化。在这里首先上传一个调试时序的抓包,
IIC的数据包是500ms发送一次,就是500ms查询一次数据。
可以通过逻辑分析仪进行详细的数据对比以及时序的分析,在调试过程中非常有必要的操作。
我们通过在线调试,可以看到BMP388的数据已经可以正产的额读取到,接下来就是做LCD的显示以及对外的通信了。
在正点原子的原始例程上,我们做了基础的修改,将气压数据以及高度数据做显示,具体的代码如下
lcd_show_string(30, 130, 200, 16, 16, "QMI8658A Ready!", RED);
lcd_show_string(30, 150, 200, 16, 16, "UPLOAD OFF", BLUE);
lcd_show_string(30, 170, 200, 16, 16, "Temp : . C", BLUE);
lcd_show_string(30, 190, 200, 16, 16, "Pitch: . C", BLUE);
lcd_show_string(30, 210, 200, 16, 16, "Roll : . C", BLUE);
lcd_show_string(30, 230, 200, 16, 16, "Yaw : . C", BLUE);
lcd_show_string(30, 250, 200, 16, 16, "Press: Pa ", BLUE);
lcd_show_string(30, 270, 200, 16, 16, "Alti : cm ", BLUE);
整体的代码可以后面再发上来。
看看整体的小事效果以及实物连接吧。
整体的连接就是使用了PE8和PE的两个引脚做为模拟IIC的引脚
整体的显示效果如上图,在基础的陀螺仪的基础上做修改,增加了气压和高度的显示,增加了传感器的型号,可以有这下面的显示结果
主函数代码发出来给大家看看
int main(void)
{
uint8_t t = 0;
uint8_t key;
uint8_t report = 0;
float temperature;
float gyro[3];
float accel[3];
float euler_angle[3] = {0, 0, 0};
sys_mpu_config();
sys_cache_enable();
HAL_Init();
sys_stm32_clock_init(300, 6, 2);
delay_init(600);
usart_init(500000);
led_init();
key_init();
pressSensorInit(&enPressureType);
hyperram_init();
lcd_init();
lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "QMI8658A TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "KEY0:UPLOAD ON/OFF", RED);
while (qmi8658_init() != 0)
{
lcd_show_string(30, 130, 200, 16, 16, "QMI8658A Error!", RED);
delay_ms(500);
lcd_show_string(30, 130, 200, 16, 16, "Please Check! ", RED);
delay_ms(500);
LED0_TOGGLE();
}
lcd_show_string(30, 130, 200, 16, 16, "QMI8658A Ready!", RED);
lcd_show_string(30, 150, 200, 16, 16, "UPLOAD OFF", BLUE);
lcd_show_string(30, 170, 200, 16, 16, "Temp : . C", BLUE);
lcd_show_string(30, 190, 200, 16, 16, "Pitch: . C", BLUE);
lcd_show_string(30, 210, 200, 16, 16, "Roll : . C", BLUE);
lcd_show_string(30, 230, 200, 16, 16, "Yaw : . C", BLUE);
lcd_show_string(30, 250, 200, 16, 16, "Press: Pa ", BLUE);
lcd_show_string(30, 270, 200, 16, 16, "Alti : cm ", BLUE);
while (1)
{
qmi8658_read_xyz(accel, gyro);
pressSensorDataGet(&s32TemperatureVal, &s32PressureVal, &s32AltitudeVal);
key = key_scan(0);
if (key == KEY0_PRES)
{
report = !report;
if (report == 0)
{
lcd_show_string(30, 150, 200, 16, 16, "UPLOAD OFF", BLUE);
}
else
{
lcd_show_string(30, 150, 200, 16, 16, "UPLOAD ON ", BLUE);
}
}
show_data(30, 170, qmi8658_get_temperature());
if (g_imu_init)
{
imu_get_eulerian_angles(accel, gyro, euler_angle, IMU_DELTA_T);
show_data(30, 190, euler_angle[0]);
show_data(30, 210, euler_angle[1]);
show_data(30, 230, euler_angle[2]);
lcd_show_num(80, 250,s32PressureVal ,9,16, BLUE);
lcd_show_num(80, 270, s32AltitudeVal,9,16, BLUE );
if (report != 0)
{
qmi8658_send_data(accel[0], accel[1], accel[2], gyro[0], gyro[1], gyro[2]);
usart1_report_imu((int)(euler_angle[1] * 100), (int)(euler_angle[0] * 100), (int)(euler_angle[2] * 100), 0, 0, 0);
}
}
LED0_TOGGLE();
delay_ms(200);
}
}
好了,今天的测试就分享到这里,后期给大家做CAN总线的通信调试相关的东西。