找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8488|回复: 7
收起左侧

基于6050的arduino计步手环源码

  [复制链接]
ID:248217 发表于 2018-6-13 16:32 | 显示全部楼层 |阅读模式
基于6050的计步手环
OLED 软件SPI   数字口 13-RES 12-CS 11-DC 10-SCK 9-SDA  
陀螺仪9250  I2C   A4-SDA  A5-SCL      
  1. #include "I2Cdev.h"
  2. #include "MPU6050.h"
  3. #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
  4. #include "Wire.h"
  5. #include <MsTimer2.h>
  6. #endif
  7. MPU6050 accelgyro;
  8. int16_t ax, ay, az;
  9. int16_t gx, gy, gz;
  10. int axoffs,ayoffs,azoffs;
  11. float rax,ray,raz;
  12. float ax0,ay0,az0;
  13. float ax1,ay1,az1;
  14. double t1;
  15. double t0;
  16. double t;
  17. int sum;
  18. int count=0;
  19. #define OUTPUT_READABLE_ACCELGYRO
  20. bool blinkState = false;

  21. #include <SPI.h>
  22. #include <Wire.h>
  23. #include <Adafruit_GFX.h>
  24. #include <Adafruit_SSD1306.h>
  25. #include <MsTimer2.h>
  26. #define OLED_MOSI   9
  27. #define OLED_CLK   10
  28. #define OLED_DC    11
  29. #define OLED_CS    12
  30. #define OLED_RESET 13
  31. Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  32. #define NUMFLAKES 10
  33. #define XPOS 0
  34. #define YPOS 1
  35. #define DELTAY 2
  36. //#define LOGO16_GLCD_HEIGHT 16
  37. //#define LOGO16_GLCD_WIDTH  16
  38. unsigned char str_30[16];//个
  39. unsigned char str_31[16];//十
  40. unsigned char str_32[16];//百
  41. unsigned char str_20[] =
  42. {
  43.   0xFF, 0xFF, 0xFF, 0xE7, 0xDB, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xDB, 0xE7, 0xFF, 0xFF, /*"0",0*/
  44.   0xFF, 0xFF, 0xFF, 0xEF, 0x8F, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83, 0xFF, 0xFF, /*"1",1*/
  45.   0xFF, 0xFF, 0xFF, 0xC3, 0xBD, 0xBD, 0xBD, 0xFB, 0xFB, 0xF7, 0xEF, 0xDF, 0xBD, 0x81, 0xFF, 0xFF, /*"2",2*/
  46.   0xFF, 0xFF, 0xFF, 0xC3, 0xBD, 0xBD, 0xFB, 0xE7, 0xFB, 0xFD, 0xFD, 0xBD, 0xBB, 0xC7, 0xFF, 0xFF, /*"3",3*/
  47.   0xFF, 0xFF, 0xFF, 0xFB, 0xF3, 0xEB, 0xDB, 0xDB, 0xBB, 0xBB, 0x81, 0xFB, 0xFB, 0xE1, 0xFF, 0xFF, /*"4",4*/
  48.   0xFF, 0xFF, 0xFF, 0x81, 0xBF, 0xBF, 0xBF, 0xA7, 0x9B, 0xFD, 0xFD, 0xBD, 0xBB, 0xC7, 0xFF, 0xFF, /*"5",5*/
  49.   0xFF, 0xFF, 0xFF, 0xE3, 0xDB, 0xBF, 0xBF, 0xA7, 0x9B, 0xBD, 0xBD, 0xBD, 0xDB, 0xE7, 0xFF, 0xFF, /*"6",6*/
  50.   0xFF, 0xFF, 0xFF, 0x81, 0xBB, 0xBB, 0xF7, 0xF7, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xFF, 0xFF, /*"7",7*/
  51.   0xFF, 0xFF, 0xFF, 0xC3, 0xBD, 0xBD, 0xBD, 0xDB, 0xE7, 0xDB, 0xBD, 0xBD, 0xBD, 0xC3, 0xFF, 0xFF, /*"8",8*/
  52.   0xFF, 0xFF, 0xFF, 0xE7, 0xDB, 0xBD, 0xBD, 0xBD, 0xD9, 0xE5, 0xFD, 0xFD, 0xDB, 0xC7, 0xFF, 0xFF /*"9",9*/
  53. };
  54. #if (SSD1306_LCDHEIGHT != 64)
  55. #error("Height incorrect, please fix Adafruit_SSD1306.h!");
  56. #endif
  57. int ge,shi,bai,qian;
  58. void jisuan();
  59. void setup()
  60. {
  61.         #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
  62.         Wire.begin();
  63.         #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
  64.         Fastwire::setup(400, true);
  65.         #endif
  66.         Serial.begin(9600);
  67.     display.clearDisplay();
  68.     display.begin(SSD1306_SWITCHCAPVCC);
  69.         Serial.println("Initializing I2C devices...");
  70.         accelgyro.initialize();
  71.         accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_500);
  72.         accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  73.         Serial.println("Testing device connections...");
  74.         Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
  75.         getoffs();
  76.         MsTimer2::set(1000,jisuan);
  77.         MsTimer2::start();

  78. }
  79. void jisuan()
  80. {
  81.       sum=abs(abs(ax1)+abs(ay1)+abs(az1));
  82.       if(sum>18)
  83.       {
  84.       count++;
  85.       sum=0;
  86.       }
  87.       if(count<10) {ge=count; shi=0; bai=0;}
  88.       if((count>=10)&&(count<100)) { ge=count%10; shi=count/10; bai=0;}
  89.       if((count>=100)&&(count<1000)) {ge=count%100%10; shi=count%100/10; bai=count/100;}
  90.       if(count>1000)          {ge=0;shi=0;bai=0;}
  91. }
  92. void xianshi()
  93. {
  94.   int i1,i2,i3;
  95.   for(i1=0;i1<16;i1++)
  96.       {
  97.        str_30[i1]=str_20[ge*16+i1];
  98.        }
  99.   for(i2=0;i2<16;i2++)
  100.       {
  101.        str_31[i2]=str_20[shi*16+i2];
  102.        }
  103.    for(i3=0;i3<16;i3++)
  104.         {
  105.          str_32[i3]=str_20[bai*16+i3];
  106.          }

  107.    display.clearDisplay();  
  108.   }
  109. void zhi()
  110. {
  111.     accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  112.     t0=t1;
  113.     t1=micros();
  114.     t=(t1-t0)/1000000;
  115.     ax=ax+axoffs;
  116.     ay=ay+ayoffs;
  117.     az=az+azoffs;
  118.     rax=ax;
  119.     ray=ay;
  120.     raz=az;
  121.     ax1=(rax/16384)*9.80;
  122.     ay1=(ray/16384)*9.80;
  123.     az1=(raz/16384)*9.80;
  124.   
  125.   }
  126. void getoffs()
  127. {
  128.       int16_t ax, ay, az;
  129.       int16_t gx, gy, gz;
  130.       long int axsum=0;
  131.       long int aysum=0;
  132.       long int azsum=0;
  133.       int i;
  134.           for(i=1;i<=2000;i++)
  135.           {
  136.               accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  137.               axsum=ax+axsum;
  138.               aysum=ay+aysum;
  139.               azsum=az+azsum-16384;
  140.           }
  141.       axoffs=-axsum/2000;
  142.       ayoffs=-aysum/2000;
  143.       azoffs=-azsum/2000;
  144. }
  145. void loop()
  146. {
  147.     zhi();
  148.     Serial.print(count);  Serial.print(bai);  Serial.print(shi);  Serial.println(ge);
  149.     xianshi();
  150.    display.clearDisplay();
  151. //   display.drawBitmap(39, 25, str_33, 8, 16, 1);//千
  152.    display.drawBitmap(47, 25, str_32, 8, 16, 1);//百
  153.    display.drawBitmap(55, 25, str_31, 8, 16, 1);//十
  154.    display.drawBitmap(63, 25, str_30, 8, 16, 1);//个
  155. //  display.setTextSize(1);             //设置字体大小
  156. //  display.setTextColor(WHITE); //设置字体黑色,字体背景白色
  157. //  display.setCursor(40,16);            //设置字体的起始位置
  158. //  display.println("Steps:");   //输出字符并换行
  159.     display.display();
  160.    
  161. }
复制代码


chenggong.rar

2.1 KB, 下载次数: 121, 下载积分: 黑币 -5

计步手环

回复

使用道具 举报

ID:416112 发表于 2018-10-30 05:31 | 显示全部楼层
十分感谢
回复

使用道具 举报

ID:416112 发表于 2018-11-1 08:08 | 显示全部楼层
你好,我还想问一下,我在实际使用的时候有事移动MPU6050步数也没有增加,这个是什么问题呢,谢谢
回复

使用道具 举报

ID:479101 发表于 2019-4-18 00:18 | 显示全部楼层
xjxj01 发表于 2018-11-1 08:08
你好,我还想问一下,我在实际使用的时候有事移动MPU6050步数也没有增加,这个是什么问题呢,谢谢

你好,请问一下,是怎么实现MPU6050计算步数的呢?
回复

使用道具 举报

ID:618469 发表于 2019-12-21 20:44 | 显示全部楼层
好像是好东西
回复

使用道具 举报

ID:710985 发表于 2020-3-18 16:38 | 显示全部楼层
#include "I2Cdev.h"
#include "MPU6050.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#include <MsTimer2.h>
#endif
MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;
int axoffs,ayoffs,azoffs;
float rax,ray,raz;
float ax0,ay0,az0;
float ax1,ay1,az1;
double t1;
double t0;
double t;
int sum;
int count=0;
#define OUTPUT_READABLE_ACCELGYRO
bool blinkState = false;

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MsTimer2.h>
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
//#define LOGO16_GLCD_HEIGHT 16
//#define LOGO16_GLCD_WIDTH  16
unsigned char str_30[16];//个
unsigned char str_31[16];//十
unsigned char str_32[16];//百
unsigned char str_20[] =
{
  0xFF, 0xFF, 0xFF, 0xE7, 0xDB, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xDB, 0xE7, 0xFF, 0xFF, /*"0",0*/
  0xFF, 0xFF, 0xFF, 0xEF, 0x8F, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0x83, 0xFF, 0xFF, /*"1",1*/
  0xFF, 0xFF, 0xFF, 0xC3, 0xBD, 0xBD, 0xBD, 0xFB, 0xFB, 0xF7, 0xEF, 0xDF, 0xBD, 0x81, 0xFF, 0xFF, /*"2",2*/
  0xFF, 0xFF, 0xFF, 0xC3, 0xBD, 0xBD, 0xFB, 0xE7, 0xFB, 0xFD, 0xFD, 0xBD, 0xBB, 0xC7, 0xFF, 0xFF, /*"3",3*/
  0xFF, 0xFF, 0xFF, 0xFB, 0xF3, 0xEB, 0xDB, 0xDB, 0xBB, 0xBB, 0x81, 0xFB, 0xFB, 0xE1, 0xFF, 0xFF, /*"4",4*/
  0xFF, 0xFF, 0xFF, 0x81, 0xBF, 0xBF, 0xBF, 0xA7, 0x9B, 0xFD, 0xFD, 0xBD, 0xBB, 0xC7, 0xFF, 0xFF, /*"5",5*/
  0xFF, 0xFF, 0xFF, 0xE3, 0xDB, 0xBF, 0xBF, 0xA7, 0x9B, 0xBD, 0xBD, 0xBD, 0xDB, 0xE7, 0xFF, 0xFF, /*"6",6*/
  0xFF, 0xFF, 0xFF, 0x81, 0xBB, 0xBB, 0xF7, 0xF7, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xFF, 0xFF, /*"7",7*/
  0xFF, 0xFF, 0xFF, 0xC3, 0xBD, 0xBD, 0xBD, 0xDB, 0xE7, 0xDB, 0xBD, 0xBD, 0xBD, 0xC3, 0xFF, 0xFF, /*"8",8*/
  0xFF, 0xFF, 0xFF, 0xE7, 0xDB, 0xBD, 0xBD, 0xBD, 0xD9, 0xE5, 0xFD, 0xFD, 0xDB, 0xC7, 0xFF, 0xFF /*"9",9*/
};
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
int ge,shi,bai,qian;
void jisuan();
void setup()
{
        #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
        #endif
        Serial.begin(9600);
    display.clearDisplay();
    display.begin(SSD1306_SWITCHCAPVCC);
        Serial.println("Initializing I2C devices...");
        accelgyro.initialize();
        accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_500);
        accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
        Serial.println("Testing device connections...");
        Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
        getoffs();
        MsTimer2::set(1000,jisuan);
        MsTimer2::start();

}
void jisuan()
{
      sum=abs(abs(ax1)+abs(ay1)+abs(az1));
      if(sum>18)
      {
      count++;
      sum=0;
      }
      if(count<10) {ge=count; shi=0; bai=0;}
      if((count>=10)&&(count<100)) { ge=count%10; shi=count/10; bai=0;}
      if((count>=100)&&(count<1000)) {ge=count%100%10; shi=count%100/10; bai=count/100;}
      if(count>1000)          {ge=0;shi=0;bai=0;}
}
void xianshi()
{
  int i1,i2,i3;
  for(i1=0;i1<16;i1++)
      {
       str_30[i1]=str_20[ge*16+i1];
       }
  for(i2=0;i2<16;i2++)
      {
       str_31[i2]=str_20[shi*16+i2];
       }
   for(i3=0;i3<16;i3++)
        {
         str_32[i3]=str_20[bai*16+i3];
         }

   display.clearDisplay();  
  }
void zhi()
{
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    t0=t1;
    t1=micros();
    t=(t1-t0)/1000000;
    ax=ax+axoffs;
    ay=ay+ayoffs;
    az=az+azoffs;
    rax=ax;
    ray=ay;
    raz=az;
    ax1=(rax/16384)*9.80;
    ay1=(ray/16384)*9.80;
    az1=(raz/16384)*9.80;
  
  }
void getoffs()
{
      int16_t ax, ay, az;
      int16_t gx, gy, gz;
      long int axsum=0;
      long int aysum=0;
      long int azsum=0;
      int i;
          for(i=1;i<=2000;i++)
          {
              accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
              axsum=ax+axsum;
              aysum=ay+aysum;
              azsum=az+azsum-16384;
          }
      axoffs=-axsum/2000;
      ayoffs=-aysum/2000;
      azoffs=-azsum/2000;
}
void loop()
{
    zhi();
    Serial.print(count);  Serial.print(bai);  Serial.print(shi);  Serial.println(ge);
    xianshi();
   display.clearDisplay();
//   display.drawBitmap(39, 25, str_33, 8, 16, 1);//千
   display.drawBitmap(47, 25, str_32, 8, 16, 1);//百
   display.drawBitmap(55, 25, str_31, 8, 16, 1);//十
   display.drawBitmap(63, 25, str_30, 8, 16, 1);//个
//  display.setTextSize(1);             //设置字体大小
//  display.setTextColor(WHITE); //设置字体黑色,字体背景白色
//  display.setCursor(40,16);            //设置字体的起始位置
//  display.println("Steps:");   //输出字符并换行
    display.display();
   
}
回复

使用道具 举报

ID:710985 发表于 2020-3-26 15:03 | 显示全部楼层
<MsTimer2.h>的库在哪啊
回复

使用道具 举报

ID:565663 发表于 2020-11-19 08:28 | 显示全部楼层
13141075188 发表于 2020-3-26 15:03
的库在哪啊
自行替换.
https://www点pjrc点com/teensy/td_libs_MsTimer2.html

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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