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

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

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. 设置界面功能还不完善,要进一步添加相应的功能


目录
相关文章
|
1月前
|
物联网
STC51单片机-实验开发装置仿真-物联网应用系统设计
STC51单片机-实验开发装置仿真-物联网应用系统设计
71 0
|
9月前
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
153 0
|
9月前
单片机实验:兰花草
单片机实验:兰花草
57 0
|
8天前
|
Web App开发 传感器 Linux
【嵌入式软件工程师面经】STM32单片机
【嵌入式软件工程师面经】STM32单片机
16 1
|
10天前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
15 4
|
9月前
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
单片机实验:外部中断系统实验 如何1357,2468灯交替亮
346 0
|
1月前
|
网络协议 Linux
嵌入式单片机开源的串口示波器实现方法
嵌入式单片机开源的串口示波器实现方法
28 0
|
1月前
|
传感器 图形学 芯片
嵌入式单片机上练手的小型图形库
嵌入式单片机上练手的小型图形库
32 0
|
1月前
|
缓存 编译器 程序员
嵌入式开发环境Vscode开发STM32单片机程序
嵌入式开发环境Vscode开发STM32单片机程序
79 0
|
10月前
|
存储 安全 编译器
价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?
价值 1k 嵌入式面试题-单片机 main 函数之前都做了啥?
145 0