基于STM32F103与HX711的立创智能体重秤:硬件设计、蓝牙通信与微信小程序开发全解析
基于STM32F103与HX711的立创智能体重秤硬件设计、蓝牙通信与微信小程序开发全解析最近有不少朋友问我想自己动手做一个能连手机、能看历史记录的智能体重秤该怎么入手今天我就以“立创智能体重秤”这个开源项目为例带大家从硬件到软件从单片机到手机小程序完整地走一遍开发流程。这个项目麻雀虽小五脏俱全用到了STM32做主控、HX711处理称重信号、蓝牙模块传输数据最后还用微信小程序做了个数据看板非常适合想学习物联网项目全栈开发的朋友。咱们的目标是看完这篇教程你不仅能理解这个体重秤是怎么工作的还能自己动手复现出来甚至举一反三应用到其他传感器项目里。话不多说咱们开始吧1. 项目整体方案一个智能体重秤是如何构成的在动手画电路图、写代码之前咱们先得把整个项目的“骨架”搭起来搞清楚各个部分是怎么协同工作的。这个智能体重秤的核心功能很简单站上去称体重然后把数据显示在屏幕上同时通过蓝牙发送到手机保存和分析。为了实现这个功能我们需要以下几个关键部分感知层手和脚压力传感器。通常是由四个金属应变片组成的“全桥”人站上去时应变片形变导致电阻变化从而产生微弱的电压信号。信号处理翻译官HX711芯片。传感器输出的电压信号非常微弱而且是模拟信号单片机看不懂。HX711的作用就是把这个微弱信号放大并转换成单片机可以处理的数字信号。大脑指挥官STM32F103C8T6微控制器。它负责与HX711“对话”读取重量数据进行换算然后把结果显示到OLED屏上同时通过串口把数据发给蓝牙模块。通信模块传令兵MX-01A蓝牙模块。它通过串口接收STM32发来的数据然后以无线蓝牙的方式发送给附近的手机。手机端数据看板微信小程序。手机上的小程序负责搜索并连接蓝牙接收实时体重数据并提供记录、存储、历史数据统计和图表展示的功能。能源系统心脏锂电池供电系统。包括3.7V锂电池、TP4056充电管理芯片和AMS1117稳压芯片确保整个系统稳定、便携地工作。整个数据流是这样的压力传感器 - HX711 - STM32 - (OLED显示 / 蓝牙模块) - 手机微信小程序。理清了这个脉络咱们再深入每个环节的细节。2. 硬件电路设计详解硬件是项目的基石设计得好后期调试能省一半的力气。咱们按照信号流向一块一块来看。2.1 主控与最小系统让STM32跑起来项目选用了经典的STM32F103C8T6作为主控这款芯片性价比极高资源也足够我们使用。核心参数基于ARM Cortex-M3内核最高主频72MHz拥有64KB的Flash和20KB的SRAM。对于处理称重数据、驱动显示和蓝牙通信来说性能绰绰有余。工作电压2.0V ~ 3.6V所以我们后续需要用稳压电路给它提供稳定的3.3V电压。丰富的外设我们主要会用到它的GPIO控制HX711、I2C驱动OLED屏和USART与蓝牙模块串口通信。要让一块单片机工作除了芯片本身还需要搭建“最小系统”主要包括电源、复位和时钟。电源电路如图在芯片的电源引脚VDD/VSS附近一定要放置100nF0.1uF的退耦电容并且尽量靠近引脚。这个电容的作用是滤除电源线上的高频噪声为芯片提供瞬间的大电流是保证系统稳定运行的关键千万不能省。复位电路采用经典的RC复位电路。当按键按下时NRST引脚被拉低到GND芯片复位松开后通过电阻上拉到3.3V芯片开始正常工作。晶振电路使用了两个晶振。8MHz高速晶振HSE作为系统的主时钟源经过内部PLL倍频后可以达到72MHz的主频。32.768kHz低速晶振LSE通常提供给实时时钟RTC使用在这个项目中如果不需要精确计时可以不用焊接。但为了电路完整性设计时一般会预留位置。注意在PCB布线时晶振电路要特别小心。晶振本身、负载电容及其走线应尽量靠近芯片的振荡引脚下方最好“净空”即不走其他信号线且挖空铺铜以减少干扰保证起振稳定。2.2 称重核心HX711与压力传感器连接这是整个项目的精度关键。HX711是一款专为电子秤设计的24位高精度ADC模数转换器芯片。HX711的作用它内部集成了可编程增益放大器PGA能直接接收压力传感器应变片电桥输出的毫伏级差分信号并将其放大、转换成数字值。我们只需要通过简单的两根线数据线DT和时钟线SCK与STM32通信就能读取到重量对应的原始数据。传感器连接项目中使用了四个压力应变片组成全桥电路。这种接法灵敏度最高温漂影响小。连接时传感器的四根线通常为红、黑、白、绿需要正确对应到HX711的四个桥压输入引脚E、E-、A、A-。具体对应关系需要参考你的传感器说明书接反了会导致读数错误。E E-给传感器电桥提供激励电压通常等于HX711的VCC如5V或3.3V。A A-接收传感器电桥输出的差分电压信号。提示如果你手头没有四片一组的传感器也可以先用一个单独的电阻应变片通常是350欧姆进行测试配合三个精密电阻组成半桥或1/4桥接在HX711的A和A-之间。这样可以先验证HX711和STM32的通信是否正常。2.3 人机交互与通信OLED与蓝牙OLED显示接口选用的是最常用的0.96寸I2C接口OLED屏。I2C协议只需要两根线PB6配置为I2C1_SCL时钟线PB7配置为I2C1_SDA数据线 在STM32CubeMX中配置好I2C外设后就可以使用现成的OLED驱动库如SSD1306来显示文字和图形了。蓝牙通信电路项目使用了MX-01A蓝牙模块它支持BLE 5.2功耗低、连接快。它与STM32的连接非常简单就是串口透传模块的TX接 STM32的USART_RX引脚如PA3模块的RX接 STM32的USART_TX引脚如PA2模块的VCC和GND接3.3V电源。注意这里有个新手常踩的坑串口交叉连接记住一个口诀“发TX对收RX”。蓝牙模块要发送数据给STM32所以它的TX要接到STM32的RX反之亦然。接反了会导致通信完全失败。2.4 电源管理续航与稳定的保障作为一个便携设备电源设计很重要。供电输入采用通用的Type-C接口作为充电和数据接口本项目仅充电。充电管理使用TP4056芯片负责给3.7V锂电池充电。它可以根据电池状态自动调整充电电流恒流/恒压充满后自动停止。LED2是充电状态指示灯。电压转换锂电池电压在3.7V-4.2V之间而STM32等芯片需要稳定的3.3V。这里使用了AMS1117-3.3线性稳压芯片将电池电压降压到稳定的3.3V给整个系统供电。3. 嵌入式软件让硬件“活”起来硬件搭好了接下来就是写代码赋予它灵魂。我们使用STM32CubeMX来初始化工程能省去大量配置外设寄存器的繁琐工作。3.1 工程初始化与时钟配置首先用STM32CubeMX新建一个STM32F103C8T6的工程。配置时钟树Clock Configuration这是提高系统性能的关键一步。在时钟树图中将时钟源选择为HSE外部高速时钟即我们板子上的8MHz晶振。然后经过PLL倍频将系统时钟SYSCLK设置为最大值72MHz。HCLK、PCLK1、PCLK2等总线时钟会自动配置好。配置外设引脚HX711将两个GPIO引脚如PA0-DT, PA1-SCK配置为输出模式。因为HX711的通信协议是类似SPI的同步串行接口需要我们用GPIO模拟时序来读写。OLED (I2C)将PB6和PB7配置为I2C1功能。蓝牙 (USART)将PA2和PA3配置为USART2功能模式为异步通信Asynchronous并设置好波特率如9600或115200。调试接口将PA13和PA14配置为SWD功能方便后续下载和调试程序。生成工程代码后我们就可以在Keil或IAR中编写业务逻辑了。3.2 核心代码解析如何读取和处理重量项目的核心逻辑在main.c中我们重点看两个函数。1. HX711数据读取函数HX711_Read()这个函数负责与HX711芯片通信读取原始的24位ADC值。HX711的通信时序需要严格遵循其数据手册。// 假设 HX711_DT_Pin PA0, HX711_SCK_Pin PA1 long HX711_Read(void) { long count 0; uint8_t i; // 等待HX711准备好DT引脚为低电平 while (HAL_GPIO_ReadPin(HX711_DT_GPIO_Port, HX711_DT_Pin)); // 禁用中断保证读取时序的准确性 __disable_irq(); // 读取24位数据 for (i 0; i 24; i) { HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET); // 拉高SCK count count 1; // 左移一位为下一位数据腾出位置 HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET); // 拉低SCK if (HAL_GPIO_ReadPin(HX711_DT_GPIO_Port, HX711_DT_Pin)) { count; } } // 发送第25个脉冲选择下一次的通道和增益例如通道A增益128 HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET); __enable_irq(); // 重新启用中断 // HX711输出的是补码需要转换为原码 count count ^ 0x800000; return count; }2. 重量换算函数Get_Weight()读回来的原始数据count并不是重量需要经过换算。最简单的是线性标定法。float Get_Weight(void) { long adc_value HX711_Read(); float weight; // 1. 去皮Tare在空载时读取一个值作为零点偏移 // weight (adc_value - g_zero_offset) / g_scale_factor; // 2. 标定放上一个已知重量的砝码如5kg记录此时的adc_value // g_scale_factor (adc_value_with_weight - g_zero_offset) / 5.0; // 以下为示例具体系数需要根据实际标定得到 weight (adc_value - 8388608) / 2280.0; // 假设的系数单位是kg // 简单的滤波连续采样多次取平均可以放在这个函数外部做 return weight; }提示想要高精度线性标定可能不够。可以在多个重量点如1kg, 3kg, 5kg, 10kg进行标定记录多组ADC值然后在程序里使用查表法或分段线性插值来计算重量这样精度会高很多。3.3 数据发送与显示逻辑在主循环中我们需要定时读取重量并更新显示和蓝牙发送。while (1) { // 1. 读取重量 current_weight Get_Weight(); // 2. 判断是否有人例如重量大于0.5kg if (current_weight 0.5) { // 3. 更新OLED显示 char disp_buf[20]; sprintf(disp_buf, Weight:%.2fkg, current_weight); OLED_ShowString(0, 0, (uint8_t *)disp_buf, 16); // 4. 通过串口发送给蓝牙模块 sprintf(uart_buf, %.2f\r\n, current_weight); // 添加回车换行便于手机端解析 HAL_UART_Transmit(huart2, (uint8_t*)uart_buf, strlen(uart_buf), 1000); HAL_Delay(200); // 每200ms更新一次 } else { // 无人状态进入低功耗或显示待机信息 OLED_ShowString(0, 0, (uint8_t *)Standby..., 16); HAL_Delay(1000); } }4. 手机端微信小程序开发硬件和嵌入式端把数据通过蓝牙发出来了手机端需要一个小程序来接收、显示和存储。微信小程序开发门槛相对较低是物联网项目很好的手机端选择。4.1 小程序页面与功能项目的小程序主要有三个页面结构清晰index页面首页/蓝牙连接一进入小程序自动搜索周围的蓝牙设备。列表中会显示找到的设备如HC-01、MX-01A等点击我们的体重秤设备名进行连接。WeightUI页面称重主页面连接成功后自动跳转到此页。页面中央大字体显示实时体重数值。有“归零”按钮实现去皮功能和“记录”按钮将当前体重保存到手机本地。还有一个“历史分析”按钮点击后跳转到数据分析页。analyse页面历史数据分析页以列表形式展示最近10次或更多的称重记录。并使用ec-canvas控件基于百度ECharts绘制体重变化的折线图。同时会计算并显示平均体重、最重和最轻体重。4.2 核心代码逻辑解析小程序开发的核心是js文件中的逻辑。这里讲几个关键点初始化蓝牙适配器在onLoad生命周期函数中调用wx.openBluetoothAdapter初始化蓝牙。搜索与连接设备调用wx.startBluetoothDevicesDiscovery开始搜索在回调中获取设备列表并展示。用户选择后调用wx.createBLEConnection连接指定设备。监听数据接收连接成功后需要获取蓝牙服务的特征值UUID然后启用wx.notifyBLECharacteristicValueChange监听。当STM32通过蓝牙发送数据时会触发回调函数在这里解析收到的数据通常是字符串格式的体重数字并更新页面显示。数据存储使用微信小程序的本地存储APIwx.setStorageSync和wx.getStorageSync来保存和读取历史体重记录。每次点击“记录”就将当前体重和时间戳组成一个对象存入一个数组再保存到本地。图表绘制使用开源库ec-canvas。在analyse页面从本地存储读取历史数据数组提取出体重值和日期格式化成ECharts需要的option配置项然后调用图表实例的setOption方法就能画出漂亮的折线图了。注意小程序真机调试时需要在微信开发者工具的“详情-本地设置”中勾选“不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书”。因为蓝牙调试功能需要。5. 调试与实战注意事项项目做完了能不能成功一半看设计一半看调试。这里分享几个我踩过的坑和心得。HX711读数不稳定或全是0检查接线确保传感器、HX711、STM32之间的连线牢固特别是传感器的全桥接法是否正确。检查电源用万用表测量HX711的VCC和AVDD电压是否正常如5V或3.3V。给传感器的激励电压EE-是否正常。检查时序用逻辑分析仪或示波器抓取DT和SCK引脚的波形对照HX711数据手册的时序图看我们的GPIO模拟时序是否正确特别是SCK高低电平的持续时间。空载标定在代码中先不进行任何系数换算直接打印HX711_Read()读出的原始值。空载时这个值应该在一个固定的数值附近小范围波动比如8388608附近。如果跳动巨大或为0说明硬件或通信有问题。蓝牙连接不上或收不到数据确认线序再次检查STM32的TX/RX和蓝牙模块的TX/RX是否交叉连接。确认波特率确保STM32串口初始化设置的波特率如9600和蓝牙模块的默认波特率一致。有的模块需要AT指令修改波特率。手机系统权限确保手机已经开启了蓝牙和定位服务微信小程序搜索蓝牙需要定位权限。小程序调试在微信开发者工具的Console中查看蓝牙API的调用是否报错。OLED屏不显示检查地址常用的I2C OLED地址是0x787位地址有时是0x7A。用I2C扫描程序确认一下。检查初始化序列不同的OLED驱动ICSSD1306、SH1106初始化命令略有不同确保你用的驱动库和屏幕匹配。功耗问题如果想用电池获得更长续航在无人称重时可以让STM32进入停止Stop模式或睡眠Sleep模式同时关闭OLED屏背光。通过压力传感器触发一个外部中断需要硬件设计支持来唤醒MCU这样可以极大降低待机功耗。这个项目从传感器选型、电路设计、单片机编程到手机应用开发覆盖了一个典型物联网产品的大部分环节。希望这份详细的解析能帮你打通任督二脉。遇到问题别怕多查数据手册多用调试工具每一个坑踩过去都是宝贵的经验。祝你制作成功
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419220.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!