找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2|回复: 0
收起左侧

QMC5883P电子罗盘

[复制链接]
ID:997011 发表于 2026-6-13 13:30 | 显示全部楼层 |阅读模式
  利用三轴磁场传感器QMC5883P测量地磁通过ATMEGA328P开发板计算和OLED来显示就构成了一个电子罗盘.
整机装在一个35*35*20透明PP塑料盒子中,小巧玲珑方便携带.使用时只要将电子罗盘平放OLED平幕正前方就是
电子罗盘三角指针指示的方位.

外观图

外观图

电路图

电路图

电子罗盘外观图电路图和程序如下:
  1. #include <Wire.h>
  2. #include <U8g2lib.h>

  3. //SSD1306 0.96寸I2C
  4. U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
  5. //SH1106打开下面注释
  6. //U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

  7. #define QMC_ADDR 0x2C
  8. int16_t mx, my, mz;
  9. float heading;
  10. char buf[8];  //存放角度字符串

  11. const uint8_t cx = 64;
  12. const uint8_t cy = 30;
  13. const uint8_t r = 27;

  14. void QMC_Read()
  15. {
  16.   uint8_t buff[6];
  17.   Wire.beginTransmission(QMC_ADDR);
  18.   Wire.write(0x01);
  19.   Wire.endTransmission();
  20.   Wire.requestFrom(QMC_ADDR,6);
  21.   for(uint8_t i=0;i<6;i++) buff[i] = Wire.read();
  22.   mx = (int16_t)(buff[1] << 8 | buff[0]);
  23.   my = (int16_t)(buff[3] << 8 | buff[2]);
  24. }

  25. float CalcHeading()
  26. {
  27.   float angle = atan2(my, mx) * 180.0 / PI;
  28.   if(angle < 0) angle += 360.0;
  29.   return angle;
  30. }

  31. void DrawCompass(float deg)
  32. {
  33.   u8g2.clearBuffer();
  34.   u8g2.drawCircle(cx, cy, r);

  35.   float rad;
  36.   int x1,y1,x2,y2;
  37.   for(uint8_t i=0;i<8;i++)
  38.   {
  39.     rad = radians(i*45.0);
  40.     x1 = cx + (r-4)*cos(rad);
  41.     y1 = cy - (r-4)*sin(rad);
  42.     x2 = cx + r*cos(rad);
  43.     y2 = cy - r*sin(rad);
  44.     u8g2.drawLine(x1,y1,x2,y2);
  45.   }

  46.   //实心三角指针不变
  47.   float mainRad = radians(deg);
  48.   int tipX = cx + r * cos(mainRad);
  49.   int tipY = cy - r * sin(mainRad);

  50.   float sideRad1 = radians(deg + 160);
  51.   float sideRad2 = radians(deg - 160);
  52.   int p1x = cx + (r*0.35)*cos(sideRad1);
  53.   int p1y = cy - (r*0.35)*sin(sideRad1);
  54.   int p2x = cx + (r*0.35)*cos(sideRad2);
  55.   int p2y = cy - (r*0.35)*sin(sideRad2);

  56.   u8g2.drawTriangle(tipX,tipY, p1x,p1y, p2x,p2y);

  57.   //=====替换原来drawNum,用sprintf转字符串=====
  58.   sprintf(buf,"%d",(int)deg);
  59.   u8g2.drawStr(5,63,buf);
  60.   u8g2.drawStr(25,63,"°");
  61. u8g2.setFont(u8g2_font_ncenB14_tr);
  62. u8g2.drawUTF8(4, 40, "W");
  63.   //u8g2.drawStr(cx-4, cy-r-2, "N");
  64. u8g2.drawUTF8(110, 40, "E");
  65.   u8g2.sendBuffer();
  66. }

  67. void setup()
  68. {
  69.   Serial.begin(9600);
  70.   u8g2.begin();
  71.   Wire.begin();

  72.   Wire.beginTransmission(QMC_ADDR);
  73.   Wire.write(0x0B); Wire.write(0x08);
  74.   Wire.endTransmission();
  75.   Wire.beginTransmission(QMC_ADDR);
  76.   Wire.write(0x0A); Wire.write(0x07);
  77.   Wire.endTransmission();
  78. }

  79. void loop()
  80. {
  81.   QMC_Read();
  82.   heading = CalcHeading();
  83.   DrawCompass(heading);
  84.   delay(70);
  85. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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