嵌入式单片机智能手表实验之优秀
1.1【实验目的】
1、实现基于STM32的智能手表程序设计
2、实现闹钟、显示时间、照明、游戏等功能
1.2【实验原理】
- 显示时间原理:
表盘首界面的实时时间显示,是基于STM32中RTC实时时钟功能实现的时间显示,通过配置RTC相关寄存器,获得1Hz的时钟信号,使MCU精准计时。
时间显示
2.显示温湿度原理:
温湿度的获取是基于DHT11传感器实现的空间温湿度读取,根据DHT11传感器手册可知,通过特有时序可以激活DHT11获取空间温湿度值,通过对获取值算法解析,即可获得浮点型精度的温湿度值。
温湿度显示
3.计步器实现原理:
计步器的实现是基于MPU6050姿态检测传感器实现的,MPU6050传感器可以获取三轴角度值和加速度值,人在走路的时候都会有一定的幅度变化以及产生加速度,通过对获取值进行算法处理,由于每个人走路时候的步幅、姿态都不一样,所以通过算法处理后的值有一定的参考价值,并非精准计步。
计步器显示
4.抬腕唤醒功能:
该功能也是通过MPU6050传感器获取的X轴加速度进行判断实现的,使用者快速抬起手腕,在X轴方向会产生一定的加速度,当该加速度值满足变化量值,屏幕就会被点亮,从而实现抬腕唤醒。
5.闹钟功能原理:
闹钟功能的实现,主要是在两个方面实现,一个是设置闹钟,一个是检测闹钟时间是否到达并启动蜂鸣器。设置时钟首先要在显示界面上显示设置界面,并通过定义一个数组存储空间,存储用户设定的闹钟,闹钟设定主要有时、分以及星期几或是每天,期间对屏幕信息的操作是通过按键实现的,通过按键按下的数量判断控制方位,并进行相应的操作;闹钟的检测则为后台程序执行代码,通过每次循环检测当前时间是否到达设定时间,如若到达,则启动蜂鸣器。
蜂鸣器原理图
6.照明功能原理:
照明功能的实现是通过控制屏幕亮度使其亮度调到最大,屏幕的调节可以通过MCU中的通用定时器产生一个PWM波,通过调节占空比来控制屏幕背光管脚,从而调节屏幕的亮度。
LED灯原理图
7.游戏功能原理:
游戏功能的实现是基于MPU6050传感器检测手腕姿态,利用MPU6050配套的DMP解析器获取出翻滚角(roll)、偏航角(yaw)、俯仰角(pitch)数据,也就是X轴旋转、Y轴旋转以及Z轴旋转的偏移量,根据这些偏移量控制操作圆点,当操作圆的像素点与目标圆点值相等时,像素熄灭。
MPU6050原理图
8.系统设置原理:
设置功能主要是设置时间和日期,通过LCD显示和按键操作,通过设置MCU中的RTC实时时钟来设置对应的值。
1.【实验步骤】
- 程序设计思路
2.编写代码
核心函数代码实现:
1、计步器计算步数 int dmp_get_pedometer_step_count(unsigned long *count) { unsigned char tmp[4]; if (!count) return -1;
if (mpu_read_mem(D_PEDSTD_STEPCTR, 4, tmp)) return -1;
count[0] = ((unsigned long)tmp[0] << 24) | ((unsigned long)tmp[1] << 16) | ((unsigned long)tmp[2] << 8) | tmp[3]; return 0; }
2、DHT11获取温湿度值 u8 buf[6] = {0,0,0,0,0,'\0'}; //用来存取8bit湿度整数部分 + 8bit湿度小数部分+8bit温度整数部分+8bit温度小数部分+8bit校验和 u8 DHT11_Read_Data(float *temp,float *humi) { u8 i = 0; DHT11_Start(); if(DHT11_Check() == 0) //正常响应后 { for(i = 0; i < 5; i++) //读取40位数据 { buf[i] = DHT11_Read_Byte(); //读取5个字节数据存储到数组中 } if( (buf[0]+buf[1]+buf[2]+buf[3]) == buf[4] ) //检验数据是否接收正确 { *humi=buf[0] + buf[1] / 256.0; //存储湿度值,整数和小数 *temp=buf[2] + buf[3] / 256.0; //存储温度值,整数和小数 } } else return 1; //异常响应返回1 return 0; //正常响应返回0 }
3、游戏功能实现程序 int X_cricle ,Y_cricle; int X_cricle_his ,Y_cricle_his;
void APP_GAME(void) { unsigned char switch_value;
float pitch,roll,yaw; //欧拉角 float Jpitch,Jroll,Jyaw; //欧拉角//校准值 begin: X_cricle = LCD_W/2; Y_cricle = LCD_H/2; LCD_Fill(0,0,LCD_W,LCD_H,BLACK); // Draw_Circle( X_cricle, Y_cricle, 5, RED ); Draw_Circle( 2, 18, 5, RED ); Draw_Circle( 67, 1, 5, RED ); Draw_Circle( 23, 96, 5, RED ); Draw_Circle( 76, 24, 5, RED ); Draw_Circle( 19, 200, 5, RED ); Draw_Circle( 90, 210, 5, RED ); Draw_Circle( 100, 18, 5, RED ); //HAL_Delay(200); //等待 printf("游戏初始化\r\n"); /*重新对陀螺仪进行校准*/ while(1) { if( mpu_dmp_get_data( &pitch, &roll, &yaw ) == 0 ) { printf("%.2f %.2f %.2f \r\n",pitch,roll,yaw); Jpitch = pitch; //对获取到的角度进行校准 Jroll = roll; Jyaw = yaw; printf("游戏初始化完成\r\n"); break; } } printf("进入了游戏\r\n"); /*LCD_W 135 LCD_H 240*/ while(1) { switch_value = Get_Key_value(0); if( switch_value == Button_1_pressed || switch_value == Button_3_pressed ) goto begin; if( switch_value == Button_2_pressed ) break; if( mpu_dmp_get_data( &pitch, &roll, &yaw ) == 0 ) { printf("%.2f %.2f %.2f \r\n",pitch,roll,yaw); pitch = pitch - Jpitch ; roll = roll - Jroll ; yaw = yaw - Jyaw ; }
Draw_Circle( X_cricle_his, Y_cricle_his, 10, BLACK ); if( pitch > 8 ) { Y_cricle -- ; } if(pitch < -8 ) { Y_cricle++ ; }
if( roll > 8 ) { X_cricle++ ; } if( roll < -8 ) { X_cricle-- ; }
if( X_cricle > LCD_W ) { X_cricle = LCD_W; } if( X_cricle < 0 ) { X_cricle = 0; } if( Y_cricle > LCD_H ) { Y_cricle = LCD_H; } if( Y_cricle < 0 ) { Y_cricle = 0; }
Draw_Circle(X_cricle,Y_cricle,10,GREEN); Delay_ms(5); X_cricle_his = X_cricle; Y_cricle_his = Y_cricle;
}//游戏主循环结束 printf("退出了游戏\r\n"); } |
3.【实验现象】
1、闹钟功能实现现象:
闹钟显示界面
2.照明功能现象:
照明功能
3.游戏功能现象:
游戏功能实现
4.设置功能现象:
设置时钟和日期界面
1.5 【附件】
程序存在的问题:
- LCD屏无法通过PWM波控制背光亮度
- 闹钟设置界面存在bug,在设置好第一个闹钟的前提下,删除下面的闹钟,第一个设置好的闹钟的数据会出错
- 闹钟设置界面进入就显示出无用的闹钟信息,不想要显示要一个一个删除,很麻烦。
- 设置界面功能还不完善,要进一步添加相应的功能
相关文章
- 《安富莱嵌入式周报》第291期:分分钟设计数字芯片,单片机版JS,神经网络DSP,microPLC,FatFS升级至V0.15,微软Arm64 VS正式版发布
- 聊聊身边的嵌入式:价格不菲的护眼灯,是眼睛保护神还是智商税?
- 嵌入式必读!瑞芯微RK3568J/RK3568B2开发板规格书
- 如何成为高级嵌入式硬件工程师?
- 安卓与嵌入式Linux:无缝连接的移动未来(安卓嵌入式linux)
- 探索嵌入式Linux开发之路(嵌入式linux开发)
- 嵌入式Linux编程完全指南(嵌入式linux书)
- 嵌入式Linux下数据库助力系统转型(嵌入式linux数据库)
- 嵌入式Linux期末考察:学习成果如何表现(嵌入式linux期末考试)
- 实现Linux嵌入式开发认证的必要性(linux嵌入式认证)
- Linux嵌入式系统调试实战(linux嵌入式调试)
- 轻松学会嵌入式linux烧写技巧(嵌入式linux烧写)
- 设备嵌入式Linux设备智能化提升新思路(嵌入linux)
- 通信入门科普:嵌入式和单片机,是同一个东西吗?