电子说
硬件:
开发板:小熊派
主控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条评论
快来发表一下你的评论吧 !