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

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

1.1【实验目的】


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

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


1.2【实验原理】

  1. 显示时间原理:

表盘首界面的实时时间显示,是基于STM32中RTC实时时钟功能实现的时间显示,通过配置RTC相关寄存器,获得1Hz的时钟信号,使MCU精准计时。

5f934b030bcc4702b1fc321f52018987.png

  时间显示

    2.显示温湿度原理:

温湿度的获取是基于DHT11传感器实现的空间温湿度读取,根据DHT11传感器手册可知,通过特有时序可以激活DHT11获取空间温湿度值,通过对获取值算法解析,即可获得浮点型精度的温湿度值。

94ff6e53424e4a469ca03ddbbd28c202.png

温湿度显示


   3.计步器实现原理:


计步器的实现是基于MPU6050姿态检测传感器实现的,MPU6050传感器可以获取三轴角度值和加速度值,人在走路的时候都会有一定的幅度变化以及产生加速度,通过对获取值进行算法处理,由于每个人走路时候的步幅、姿态都不一样,所以通过算法处理后的值有一定的参考价值,并非精准计步。


28a21216b7b943178d2a62ab9d3245be.png

计步器显示

   4.抬腕唤醒功能:

该功能也是通过MPU6050传感器获取的X轴加速度进行判断实现的,使用者快速抬起手腕,在X轴方向会产生一定的加速度,当该加速度值满足变化量值,屏幕就会被点亮,从而实现抬腕唤醒。

 5.闹钟功能原理:


闹钟功能的实现,主要是在两个方面实现,一个是设置闹钟,一个是检测闹钟时间是否到达并启动蜂鸣器。设置时钟首先要在显示界面上显示设置界面,并通过定义一个数组存储空间,存储用户设定的闹钟,闹钟设定主要有时、分以及星期几或是每天,期间对屏幕信息的操作是通过按键实现的,通过按键按下的数量判断控制方位,并进行相应的操作;闹钟的检测则为后台程序执行代码,通过每次循环检测当前时间是否到达设定时间,如若到达,则启动蜂鸣器。


ecb7013ba75146438b209cb535042ea2.png

蜂鸣器原理图

   6.照明功能原理:

照明功能的实现是通过控制屏幕亮度使其亮度调到最大,屏幕的调节可以通过MCU中的通用定时器产生一个PWM波,通过调节占空比来控制屏幕背光管脚,从而调节屏幕的亮度。

767873b043c9445395cc51080501b545.png

LED灯原理图


   7.游戏功能原理:


游戏功能的实现是基于MPU6050传感器检测手腕姿态,利用MPU6050配套的DMP解析器获取出翻滚角(roll)、偏航角(yaw)、俯仰角(pitch)数据,也就是X轴旋转、Y轴旋转以及Z轴旋转的偏移量,根据这些偏移量控制操作圆点,当操作圆的像素点与目标圆点值相等时,像素熄灭


6207453323604a04906544467f9d67fd.png

MPU6050原理图

   8.系统设置原理:

设置功能主要是设置时间和日期,通过LCD显示和按键操作,通过设置MCU中的RTC实时时钟来设置对应的值。

1.【实验步骤】

  • 程序设计思路

image.png

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、闹钟功能实现现象:

f10a9d562995472ea8eda7311fec6b36.png

54ff1976c1474c4aa8b6a9424c732f30.png

699044cab8994d8c9ab1caf712e3ff18.png

闹钟显示界面

2.照明功能现象:

8901c107b4cf4e66a57b19c69d01fbaa.png

照明功能

3.游戏功能现象:

7b316000871c441686063bcf2b06182c.pngf6c40147e7a449c08dbe44860cfe0aa0.png

游戏功能实现

4.设置功能现象:

f6bc804c64254b028e856b88cd1be129.png4d1bfaba4b5044acac0e6d5bfa687868.png58af5657aaed4f8abdf4259f14a85cad.pngb2e9e597659e4ee4802b3aca37565e13.png

设置时钟和日期界面

1.5 【附件】

程序存在的问题:

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


目录
相关文章
|
5月前
|
物联网
STC51单片机-实验开发装置仿真-物联网应用系统设计
STC51单片机-实验开发装置仿真-物联网应用系统设计
57 0
|
8月前
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
134 0
|
8月前
单片机实验:兰花草
单片机实验:兰花草
52 0
|
8月前
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
319 0
|
4月前
|
网络协议 Linux
嵌入式单片机开源的串口示波器实现方法
嵌入式单片机开源的串口示波器实现方法
23 0
|
4月前
|
传感器 图形学 芯片
嵌入式单片机上练手的小型图形库
嵌入式单片机上练手的小型图形库
28 0
|
9月前
|
存储 安全 编译器
价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?
价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?
128 0
(嵌入式系列)STM32系列单片机的GPIO简介
(嵌入式系列)STM32系列单片机的GPIO简介
(嵌入式系列)STM32系列单片机的GPIO简介
|
11月前
|
C语言 芯片 智能硬件
51单片机基础实验1
51单片机基础实验1
171 0
|
11月前
单片机实验--单片机控制数码管
单片机实验--单片机控制数码管
116 0
单片机实验--单片机控制数码管