开发者社区> p3o53ei5jzzao> 正文

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

简介: 嵌入式单片机智能手表实验之优秀
+关注继续查看

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


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
单片机中利用SHT11实现温湿度实验
单片机中利用SHT11实现温湿度实验
47 0
单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)
单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)
34 0
复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)
复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)
42 0
复习单片机:IIC-EEPROM 实验(内含:1.IIC-EEPROM介绍+2.AT24C02 介绍+3.硬件设计+4.软件设计+5.实验现象)
复习单片机:IIC-EEPROM 实验(内含:1.IIC-EEPROM介绍+2.AT24C02 介绍+3.硬件设计+4.软件设计+5.实验现象)
14 0
复习单片机:串口通信(内含:1.代码部分+2.串口内部结构+3.串口控制寄存器 SCON+4.电源控制寄存器 PCON+5. 串口的使用方法+6.硬件设计+7.实验现象)
复习单片机:串口通信(内含:1.代码部分+2.串口内部结构+3.串口控制寄存器 SCON+4.电源控制寄存器 PCON+5. 串口的使用方法+6.硬件设计+7.实验现象)
57 0
复习单片机:定时器/计数器部分(内含:1.51 单片机定时器原理 +2.51 单片机定时/计数器结构+3.定时器配置+4.代码部分+5.实验现象)
复习单片机:定时器/计数器部分(内含:1.51 单片机定时器原理 +2.51 单片机定时/计数器结构+3.定时器配置+4.代码部分+5.实验现象)
63 0
复习单片机:外部中断(内含:1.外部中断原理图+2 外部中断配置+3 硬件设计+4 软件设计+5.实验现象)
复习单片机:外部中断(内含:1.外部中断原理图+2 外部中断配置+3 硬件设计+4 软件设计+5.实验现象)
43 0
单片机:步进电机(内含:1 步进电机简介+2 步进电机工作原理+ 3 步进电机技术指标 +4. 软件设计+5.原始代码+6.实验现象)
单片机:步进电机(内含:1 步进电机简介+2 步进电机工作原理+ 3 步进电机技术指标 +4. 软件设计+5.原始代码+6.实验现象)
77 0
复习单片机:直流电机(内含1 直流电机介绍+2 ULN2003 芯片介绍+3 硬件设计+4 软件设计+5原始代码+6. 实验现象)
复习单片机:直流电机(内含1 直流电机介绍+2 ULN2003 芯片介绍+3 硬件设计+4 软件设计+5原始代码+6. 实验现象)
37 0
复习单片机:8*8点阵---->点亮数字0(内含:1.设计思路+2.数字0的编程数据+3.原始代码+4.实验现象)(注:获得编程数据工具的下载和使用放在下一篇文章)
复习单片机:8*8点阵---->点亮数字0(内含:1.设计思路+2.数字0的编程数据+3.原始代码+4.实验现象)(注:获得编程数据工具的下载和使用放在下一篇文章)
62 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
《如何驱动一个传感器》
立即下载
阿里云 IoT 芯片模组合作之美
立即下载
阿里云IoT芯片模组合作之美
立即下载