项目展示:
智能体重称演示视频
一、项目功能描述
- 四个压阻式压力传感器进行受力的数据采集,将受力产生的毫伏级压力信号传递给HX711压力芯片。
- HX711芯片将毫伏级压力信号进行放大,同时将接受到的模拟信号转换为数字信号并传送给STM32F103C8T6主控芯片。
- STM32F103C8T6主控芯片对HX711芯片放大转换过的数据进行校准,并发送到相关显示界面。 (1)显示方式1:采用了12C协议的四引脚的OLED屏,与主控芯片的相关通信引脚进行连接通信。在未使用时保持睡眠状态,当有数据需要显示时再对其进行唤醒。实现低功耗,兼容性强,高速率的数据传输和显示。 (2)显示方式2:采用MX-01蓝牙模块与主控芯片以及手机端进行连接。手机端与蓝牙建立连接之后可以进行去皮操作以及实时显示称重数据。蓝牙模块RX连接芯片TX,TX连接RX,实现双向通信;蓝牙模块BRTS则进行数据发送请求及模块唤醒实现功耗控制和数据传输协同。
- 思维导图

二、项目实现
1、PCB设计
采用嘉立创EDA进行PCB设计

3D效果图

2、元器件焊接
初始态

完成态
3、软件实现
(1)核心代码编写及烧录
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//让交互力传感器工作在正常状态
char numberstr[50];
/* USER CODE BEGIN WHILE */
OLED_Init(); //初始化OLED
OLED_Clear();
OLED_ShowString(24,1,"weight:",16);
HAL_UART_Receive_IT(&huart2, &aRxBuffer, 1);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Get_Weight();//获取当前交互力的值
//减去偏置值,并转换成KG
if( Weight_Shiwu > baseweight)
{
Weight_KG = Weight_Shiwu - baseweight;
}
else
{
Weight_KG = 0;
}
// 计算当前体重(保留一位小数)
current_weight = (float)(Weight_KG) / 168;
current_weight = (int)(current_weight * 10 + 0.5) / 10.0f; // 四舍五入
// 重量检测逻辑
if(current_weight >= 1.0f)
{
// 检查是否需要更新稳定状态
if(!is_stable)
{
// 首次检测到有效重量
if(stable_start_time == 0)
{
stable_weight = current_weight;
stable_start_time = HAL_GetTick();
}
else
{
// 计算与稳定值的差值(取绝对值)
float diff = current_weight - stable_weight;
if(diff < 0) diff = -diff;
// 差值在阈值内,继续计时
if(diff * 10 <= STABLE_THRESHOLD) // 转换为0.1kg单位比较
{
// 达到稳定时间
if(HAL_GetTick() - stable_start_time >= STABLE_TIME)
{
is_stable = 1;
is_blinked = 0;
}
}
// 差值超过阈值,重置计时
else
{
stable_weight = current_weight;
stable_start_time = HAL_GetTick();
}
}
// 显示当前重量(未稳定时)
sprintf(numberstr, "%.1f", current_weight);
OLED_ShowString(35,4,numberstr,16);
OLED_ShowString(80,4,"KG",16);
HAL_UART_Transmit(&huart2, (uint8_t *)numberstr, strlen(numberstr), 0xFFFF);
}
// 已稳定状态
else
{
// 执行闪烁操作
if(!is_blinked)
{
blink_screen(BLINK_COUNT);
is_blinked = 1;
}
// 检查是否有新的体重(差值超过10kg)
float new_diff = current_weight - stable_weight;
if(new_diff < 0) new_diff = -new_diff;
if(new_diff * 10 >= NEW_WEIGHT_THRESHOLD) // 转换为0.1kg单位比较
{
// 更新为新体重
stable_weight = current_weight;
is_stable = 0;
is_blinked = 0;
stable_start_time = HAL_GetTick();
}
else
{
// 显示固定的稳定重量
sprintf(numberstr, "%.1f", stable_weight);
OLED_ShowString(35,4,numberstr,16);
OLED_ShowString(80,4,"KG",16);
HAL_UART_Transmit(&huart2, (uint8_t *)numberstr, strlen(numberstr), 0xFFFF);
}
}
HAL_Delay(500);
}
else
{
// 重量小于1kg,重置状态
OLED_Clear();
stable_start_time = 0;
is_stable = 0;
is_blinked = 0;
// 发送0.0
sprintf(numberstr, "0.0");
HAL_UART_Transmit(&huart2, (uint8_t *)numberstr, strlen(numberstr), 0xFFFF);
}
}
}
(2)蓝牙模块的连接实现
搜索蓝牙并连接

同步称重数据

三、项目总结
本项目成功实现了一个功能完整、性能稳定的智能称重原型系统。系统能够快速响应重量变化,测量结果稳定,并通过OLED屏幕清晰显示。同时,手机端可通过蓝牙连接,实时接收重量数据并成功执行“去皮”等控制指令,验证了双向通信的可靠性。整个系统在精度、功耗和用户体验之间取得了良好平衡。本项目的设计涵盖了传感器信号采集、模拟信号调理、嵌入式数据处理、人机交互及低功耗设计等嵌入式系统的核心环节,是一个极具代表性的综合实践案例。
1513

被折叠的 条评论
为什么被折叠?



