电子说
硬件:
开发板:小熊派
主控MCU:Hi3861
接线:
MPU6050:
SCL:IO_01
SDA:IO_00
OLED:
SCL:IO_09
SDA:IO_10
效果图:
运行效果图
软件方案:
MPU6050驱动
这部分代码参考使用小熊派例程代码
初始化引脚:
GpioInit(); IoSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA IoSetFunc(WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL I2cInit(WIFI_IOT_I2C_IDX_1, 400000); /* baudrate: 400kbps */ I2cSetBaudrate(WIFI_IOT_I2C_IDX_1, 400000);
OLED驱动
相关代码在文末附件中。
在oled.c中初始化引脚:
//初始化 GpioInit(); //GPIO_10复用为I2C0_SDA IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_I2C0_SDA); //GPIO_9复用为I2C0_SCL IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_I2C0_SCL); //baudrate: 400kbps I2cInit(WIFI_IOT_I2C_IDX_0, 400000); I2cSetBaudrate(WIFI_IOT_I2C_IDX_0, 400000);
在主线程中获取mpu6050数据,并在oled显示
// 定义陀螺仪数据 Sensor_Data_TypeDef Sensor_Data; char array[64]; static int task_sensor_entry(void) { float k = 127.0/4200; OLED_Init(); Sensor_Init(); OLED_Clear(); while(1) { //OLED_Show(); usleep(100000); // 读取数据 Sensor_Read_Data(); // 逻辑处理 printf("Accel[0]:%6d Accel[1]:%6d Accel[2]:%6drn", (int)Sensor_Data.Accel[0],(int)Sensor_Data.Accel[1],(int)Sensor_Data.Accel[2]); // 显示实时数据 memset(array, 0, sizeof(array) - 1); sprintf(array, "x:%6d", (int)Sensor_Data.Accel[0]); OLED_ShowString(0,0,array,16); memset(array, 0, sizeof(array) - 1); sprintf(array, "y:%6d", (int)Sensor_Data.Accel[1]); OLED_ShowString(0,20,array,16); OLED_ProcessBar(0,40,(int)((Sensor_Data.Accel[1]+2100)*k)); OLED_Refresh(); } return 0; } static void OC_mpu6050_oled(void) { osThreadAttr_t attr; attr.name = "task_main_entry"; attr.attr_bits = 0U; attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = 2048; attr.priority = 25; attr.name = "task_sensor_entry"; if (osThreadNew((osThreadFunc_t)task_sensor_entry, NULL, &attr) == NULL) { printf("Falied to create task_sensor_entry!n"); } } APP_FEATURE_INIT(OC_mpu6050_oled);
相关代码文件
完整代码在资源中
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !