zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

嵌入式单片机智能手表实验之优秀

嵌入式单片机智能 实验 优秀 手表
2023-09-14 09:13:23 时间

1.1【实验目的】

1、实现基于STM32的智能手表程序设计

2、实现闹钟、显示时间、照明、游戏等功能

1.2【实验原理】

  1. 显示时间原理:

表盘首界面的实时时间显示,是基于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 【附件】

程序存在的问题:

  1. LCD屏无法通过PWM波控制背光亮度
  2. 闹钟设置界面存在bug,在设置好第一个闹钟的前提下,删除下面的闹钟,第一个设置好的闹钟的数据会出错
  3. 闹钟设置界面进入就显示出无用的闹钟信息,不想要显示要一个一个删除,很麻烦。
  4. 设置界面功能还不完善,要进一步添加相应的功能