风筝
发表于: 2019-12-26 22:20:25 | 显示全部楼层

目前,健身手环在人们的日常生活中变得越来越流行,它不仅可以计算人行走的步数,而且还可以记录您燃烧的卡路里、显示心跳、显示时间等等。通常这些物联网设备已与云平台连接同步,因此您可以在智能手机上轻松获取所有身体活动量的历史记录。在前面的文章中,我们还制作了一个基于物联网的患者监护系统,其重要数据发送到ThingSpeak云平台,用户可以从任何地方进行查看。


计步器(Pedometer)是一种用来计算人走路步数的设备。在本篇文章中,我们将使用Arduino开发板和加速度计ADXL335制作一个简单又便宜的计步器。该计步器计算走路步数,然后将计算结果显示在LCD1602显示屏上。


所需的组件

●    Arduino Nano开发板

●    ADXL335加速度计

●    LCD1602液晶显示屏模块

●    电池


ADXL335加速度计介绍

ADXL335是一款小尺寸、完整的三轴加速度计,基于电容式感应原理。它是一个小尺寸、薄型、低功耗的模块,带有一个经过多晶硅表面微机械加工的传感器和信号调理电路。 ADXL335加速度计可以测量静态和动态加速度。在本文中,ADXL335加速度计用作计步器传感器。


加速度计是一种可以将任意方向上的加速度转换为其相应的可变电压的设备。该设备通过使用电容器来实现的,随着加速度移动,位于其内部的电容器也将根据该运动而发生变化,由于电容是变化的,因此可以获得可变电压。

capacitive-Accelerometero.png

下面是加速度计模块的正视图和底视图:

ADXL335-Accelerometer.jpg


电路连接图

Arduino和加速度计组成的计步器电路图如下所示。

Arduino-Accelerometer-Step-Counter-Circuit-Diagram.png

在此电路中,我们将ADXL335加速度计连接到Arduino Nano开发板。加速度计的X、Y和Z引脚与Arduino Nano的模拟引脚(A1、A2和A3)连接。我们使用了一个I2C模块将LCD1602显示屏连接到Arduino开发板。 I2C模块的SCL和SDA引脚分别连接到Arduino Nano的A5和A4引脚。


我们按照上面所示的电路图在面包板上连接计步器的各个组件:

Pedometer-using-Arduino-Setup.jpg


计步器是如何工作的?

计步器使用向前、垂直和侧面的三个运动分量来计算一个人行走的总步数。计步器使用加速度计来获取这些值。每次取样后,加速度计都会不断更新3轴加速度的最大值和最小值。这些3轴(Max + Min)/ 2的平均值称为动态阈值水平,该阈值用于确定是否应该记录该步数。


计步器在运行时可以处于任何方向,因此计步器使用加速度变化最大的轴来计算步数。


现在,我们快速了解一下Arduino计步器的工作原理:

1.    首先,计步器上电后开始校准。

2.    然后在void loop函数中,连续获取从X、Y和Z轴的数据。

3.    然后,从起点算出总加速度矢量。

4.    加速度矢量是X、Y和Z轴值的平方根(x ^ 2 + y ^ 2 + z ^ 2)。

5.    然后将平均加速度值与阈值进行比较,以计算步数。

6.   如果加速度矢量超过阈值,则增加步数;否则,认为是无效的振动,丢弃该数据。

Pedometer.jpg


编程Arduino计步器

在本文的末尾处提供了完整的Arduino计步器代码。在这里,我们对一些重要代码片段进行说明。


首先在代码中包含所有必需的库。 ADXL335加速度计输出模拟输出信号,因此不需要任何库。

  1. #include <LiquidCrystal_I2C.h>
复制代码

之后,定义加速度计连接的Arduino引脚。

  1. const int xpin = A1;
  2. const int ypin = A2;
  3. const int zpin = A3;
复制代码

定义加速度计的阈值。将该阈值与加速度矢量进行比较,以计算步数。

  1. float threshold = 6;
复制代码

void setup()函数中,在开发板上电时调用以下函数对其进行校准。

  1. calibrate();
复制代码

void loop()函数中,将读取100个样本的X、Y和Z轴值。

  1. for (int a = 0; a < 100; a++)
  2.   {
  3.     xaccl[a] = float(analogRead(xpin) - 345);
  4.     delay(1);
  5.     yaccl[a] = float(analogRead(ypin) - 346);
  6.     delay(1);
  7.     zaccl[a] = float(analogRead(zpin) - 416);
  8.     delay(1);
复制代码

获得3个轴的值后,通过取X、Y和Z轴值的平方根来计算总加速度矢量。

  1. totvect[a] = sqrt(((xaccl[a] - xavg) * (xaccl[a] - xavg)) + ((yaccl[a] - yavg) * (yaccl[a] - yavg)) + ((zval[a] - zavg) * (zval[a] - zavg)));
复制代码

然后计算最大和最小加速度矢量值的平均值。

  1. totave[a] = (totvect[a] + totvect[a - 1]) / 2 ;
复制代码

接下来将加速度矢量值的平均值与阈值进行比较。如果平均值大于阈值,则增加步数并置位标志位。

  1. if (totave[a] > threshold && flag == 0)
  2.     {
  3.       steps = steps + 1;
  4.       flag = 1; }
复制代码

如果平均值大于阈值,但标志位置位,则什么也不做。

  1. else if (totave[a] > threshold && flag == 1)
  2.     {
  3.       // Don’t Count
  4.     }
复制代码

如果平均值小于阈值且标志位置位,则将标志位清零。

  1. if (totave[a] < threshold   && flag == 1)
  2.     {
  3.       flag = 0;
  4.     }
复制代码

在串口监视器和LCD显示屏上打印输出步数。

  1. Serial.println(steps );
  2. lcd.print("Steps: ");
  3. lcd.print(steps);
复制代码

测试Arduino计步器

准备好硬件和代码后,将Arduino开发板连接到笔记本电脑并上传代码。现在,将计步器握在手中,然后一步步走路,它应该会在LCD上显示步数。有时,计步器非常快速或缓慢地振动时,步数也会增加。

Pedometer-using-Arduino-Working.jpg


代码

以下是Arduino计步器的完整代码: main.rar (817 Bytes, 下载次数: 391)

跳转到指定楼层
王香盘
发表于: 2020-5-9 19:43:10 | 显示全部楼层

请问电池是接在哪里的呀
回复

使用道具 举报

fasgeg
发表于: 2021-5-11 17:15:40 | 显示全部楼层

为什么显示no matching function for call to 'LiquidCrystal_I2C::begin()'错误
回复

使用道具 举报

000
发表于: 2023-5-22 19:18:24 | 显示全部楼层

为什么有Compilation error: no matching function for call to 'LiquidCrystal_I2C::begin()'
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-29 20:10 , Processed in 0.245620 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表