
开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
首先感谢立创举办的这个夏日趣玩活动(我又可以白嫖券了哈哈)
在现代户外探险的浪潮中,一款先进的户外智能指南针无疑是探险者们的得力助手。这款智能指南针融合了尖端科技与人性化设计,为探险者提供准确、便捷的方向指引,让每一次户外之行都更加安全、高效。
这款户外智能指南针采用高精度陀螺仪和磁力传感器,能够实时感知地球磁场变化,即使在复杂的地理环境中也能提供精准的方向指示。帮助探险者快速规划路线,避免迷失方向。
智能指南针的外观设计简洁大气,采用轻量化材质,携带方便,可轻松挂在背包或腰带上。其显示屏采用高清触控技术,即使在强光下也能清晰可见。界面布局直观友好,探险者可以轻松操作各项功能。
除了基本的方向指引功能外,这款智能指南针还具备多种实用特性。
在续航能力方面,这款户外智能指南针表现出色。它采用大容量锂电池,支持长时间待机和连续使用。
1、硬件设计
主控采用都是ESP32S3R8,传感器QMC5883L,屏幕为浦洋的1.69寸触摸屏,使用tp4056对锂电池进行充电,电池自带保护板就没有使用保护电路。
支持供电与usb自动切换、通过LDO转3.3v,目前发现问题是ldo发热有点厉害,等有时间了改成专门的电源管理芯片试试。用0.5mm 30p座子引出了GPIO可以方便扩展后续功能,
烧录完全采用ESP32S3的usb口没有额外焊接排针,布局有限。板子比较简单,设计的一般般但是能用,哈哈。
2、焊接
焊接过程中比较难的就是ESP32S3了,其他都还好我是用风枪吹的,可以先把板子预热一下然后涂焊锡膏、多一点也没事、然后吹焊锡会自己跑出来、最后上点助焊剂用烙铁拖一下就好了。
那个屏幕座子注意温度就好不然容易吹化了


3、软件开发
所有代码都在github上面了,用的是idf开发的,屏幕驱动是st7789v+cst816s很常见,页面是lvgl、ui是参考油管的一位大佬的(没有审美哈哈)
wx-dev/esp32s3-idf-watch (github.com)
地磁传感器用的是QMC5883L
读取传感器
void qmc5883l_read_xyz(t_sQMC5883L *p) { uint8_t status, data_ready = 0; int16_t mag_reg[3];
qmc5883L_register_read(QMC5883L_STATUS, &status, 1); // 读状态寄存器
if (status & 0x01) { data_ready = 1; } if (data_ready == 1) { data_ready = 0; qmc5883L_register_read(QMC5883L_XOUT_L, (uint8_t *) mag_reg, 6);
p->mag_x = mag_reg[0]; p->mag_y = mag_reg[1]; p->mag_z = mag_reg[2]; }}
校准地磁传感器
void calibrateMag(){ int x,y,z; //三轴数据 int xMax, xMin, yMax, yMin, zMax, zMin; //初始化 t_sQMC5883L p; qmc5883l_read_xyz(&p); xMax=xMin=x=p.mag_x; yMax=yMin=y=p.mag_y; zMax=zMin=z=p.mag_z; offsetX = offsetY = offsetZ = 0; for(int i=0;i<200;i++) { qmc5883l_read_xyz(&p); x=p.mag_x; y=p.mag_y; z=p.mag_z; // 计算最大值与最小值 // 计算传感器绕X,Y,Z轴旋转时的磁场强度最大值和最小值 if (x > xMax) xMax = x; if (x < xMin ) xMin = x; if(y > yMax ) yMax = y; if(y < yMin ) yMin = y; if(z > zMax ) zMax = z; if(z < zMin ) zMin = z; vTaskDelay(100 / portTICK_PERIOD_MS); } //计算修正量 if (abs(xMax - xMin) > CalThreshold) offsetX = (xMax + xMin) / 2; if (abs(yMax - yMin) > CalThreshold) offsetY = (yMax + yMin) / 2; if (abs(zMax - zMin) > CalThreshold) offsetZ = (zMax + zMin) / 2; ESP_LOGI(TAG, "offsetX = %d offsetY = %d offsetZ = %d ", offsetX, offsetY, offsetZ); vTaskDelay(5000 / portTICK_PERIOD_MS);}
计算角度值
void qmc5883l_fetch_azimuth(t_sQMC5883L *p) { qmc5883l_read_xyz(p); float headingRadians = atan2((double)((p->mag_y)-offsetY),(double)((p->mag_x)-offsetX)); // 保证数据在0-2*PI之间 if (headingRadians < 0) { headingRadians += 2 * M_PI; } int headingDegrees = headingRadians * 180 / M_PI; headingDegrees += -5; //磁偏角 //保证数据在0-360之间 if (headingDegrees > 360) { headingDegrees -= 360; } p->azimuth = (float) headingDegrees;}
目前加了校准但是精度感觉还是不太行,特别是xy轴换成xz轴好一点,不知道是传感器的问题还是代码问题
页面设计


4、测试
目前测试地磁数据都能正常读取到没有啥大问题唯一就是精度有点差,等后续优化,硬件方面没有采用专门的电源管理芯片、板子有点热。
等后续板姿态传感器与温湿度传感器加上变成更高端的设备还能当开发板用了哈哈
5、成品展示




设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程工程成员
知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。


评论