基于STM32的智能药盒设计与实现

摘要

随着人口老龄化加剧和慢性病患者数量增多,按时、按量服药成为保障患者健康的关键,而传统药盒存在无提醒、无监测、管理不便等问题,无法满足现代健康管理的需求。本文设计并实现了一款基于STM32F103C8T6单片机的智能药盒,整合了温湿度监测、药品余量检测、定时提醒、语音播报、APP远程控制等多项功能,旨在解决传统药盒的弊端,为用户提供便捷、智能的用药管理服务。

本系统以STM32F103C8T6单片机作为主控单元,搭建了多模块协同工作的硬件架构,包括DHT11温湿度传感器、HX711称重模块、光电红外传感器、OLED显示屏、JR6001语音模块、BT04A蓝牙模块及有源蜂鸣器等元器件。软件部分采用模块化设计思路,基于Keil MDK开发环境编写代码,实现了温湿度实时采集、药品余量监测、缺药报警、实时时间显示与设置、5组可独立控制的定时吃药提醒、语音播报联动以及手机APP蓝牙通信控制等功能。

经过系统调试与测试,该智能药盒各项功能运行稳定,温湿度检测精度满足药品存储要求,称重模块能准确识别药品余量并触发缺药报警,定时提醒精准可靠,语音播报清晰可辨,手机APP可实现远程数据查看与参数设置。本设计结构简单、成本低廉、操作便捷,可广泛应用于家庭、养老院等场景,对提升用药依从性、保障用药安全具有重要的实际意义和应用价值。

关键词:STM32F103C8T6;智能药盒;定时提醒;蓝牙通信;多传感器监测

Abstract

With the aging of the population and the increase in the number of chronic disease patients, taking medicine on time and in the right amount has become the key to ensuring patients' health. However, traditional medicine boxes have problems such as no reminders, no monitoring, and inconvenient management, which cannot meet the needs of modern health management. This paper designs and implements an intelligent medicine box based on STM32F103C8T6 single-chip microcomputer, integrating multiple functions such as temperature and humidity monitoring, drug residue detection, timing reminder, voice broadcast, and APP remote control, aiming to solve the drawbacks of traditional medicine boxes and provide users with convenient and intelligent medication management services.

The system uses STM32F103C8T6 single-chip microcomputer as the main control unit, and builds a hardware architecture with multi-module collaborative work, including DHT11 temperature and humidity sensor, HX711 weighing module, photoelectric infrared sensor, OLED display screen, JR6001 voice module, BT04A Bluetooth module and active buzzer and other components. The software part adopts a modular design idea, and the code is written based on Keil MDK development environment, realizing functions such as real-time temperature and humidity collection, drug residue monitoring, drug shortage alarm, real-time time display and setting, 5 groups of independently controllable timing medication reminders, voice broadcast linkage, and mobile APP Bluetooth communication control.

After system debugging and testing, all functions of the intelligent medicine box run stably. The temperature and humidity detection accuracy meets the requirements of drug storage. The weighing module can accurately identify the drug residue and trigger the drug shortage alarm. The timing reminder is accurate and reliable, the voice broadcast is clear and distinguishable, and the mobile APP can realize remote data viewing and parameter setting. This design has the advantages of simple structure, low cost and convenient operation, and can be widely used in families, nursing homes and other scenarios. It has important practical significance and application value for improving medication compliance and ensuring medication safety.

Key words: STM32F103C8T6; Intelligent Medicine Box; Timing Reminder; Bluetooth Communication; Multi-sensor Monitoring

目录

  1. 绪论
            
  1. 研究背景与意义
  1. 国内外研究现状
  1. 研究内容与目标
  1. 论文结构安排
  1. 系统总体方案设计
  1. 设计原则
  1. 系统功能需求分析
  1. 系统总体架构设计
  1. 系统工作流程设计
  1. 系统硬件设计
            
  1. 硬件总体设计
  1. 主控单元设计(STM32F103C8T6)
  1. 监测模块设计
                
  1. DHT11温湿度检测模块
  1. HX711称重模块(药品余量检测)
  1. 光电红外传感器模块(吃药状态检测)
  1. 显示模块设计(OLED屏幕)
  1. 报警与提醒模块设计
                
  1. 有源蜂鸣器(缺药报警)
  1. JR6001语音模块(语音播报)
  1. 通信模块设计(BT04A蓝牙模块)
  1. 电源模块设计
  1. 硬件接线图与PCB设计
  1. 系统软件设计
            
  1. 软件总体设计思路
  1. 开发环境搭建
  1. 主程序设计
  1. 各功能模块软件实现
                
  1. 传感器数据采集模块(DHT11、HX711、光电红外)
  1. OLED显示模块(实时时间、温湿度、药品余量)
  1. 定时提醒模块(5组定时设置与控制)
  1. 语音播报模块(JR6001控制)
  1. 蓝牙通信模块(BT04A与手机APP交互)
  1. 缺药报警模块(蜂鸣器控制)
  1. 手机APP界面设计与通信实现
  1. 软件调试与优化
  1. 系统调试与测试
  1. 调试环境搭建
  1. 硬件调试
  1. 软件调试
  1. 系统功能测试
                
  1. 监测功能测试
  1. 定时提醒与语音播报测试
  1. 缺药报警测试
  1. 蓝牙通信与APP控制测试
  1. 时间设置与显示测试
  1. 测试结果分析
  1. 总结与展望
  1. 研究总结
  1. 存在的问题与不足
  1. 未来展望
  1. 参考文献
  1. 致谢
  1. 附录(源代码、硬件原理图、PCB图)

1 绪论

1.1 研究背景与意义

随着社会经济的发展和人口老龄化进程的加快,我国60岁以上老年人口数量持续增长,同时慢性病患者群体也不断扩大,这类人群往往需要长期、规律地服用药物来控制病情。然而,由于记忆力衰退、生活节奏繁忙等原因,忘记服药、漏服药、过量服药等问题频繁出现,不仅影响治疗效果,还可能加重病情,甚至引发严重的健康风险。

传统药盒仅能实现药品的简单存放功能,缺乏定时提醒、药品余量监测、环境监测等智能化功能,无法满足用户对用药管理的精细化需求。因此,设计一款具备智能监测、定时提醒、远程控制等功能的智能药盒,能够有效帮助用户养成按时服药的习惯,实时掌握药品状态和存储环境,降低用药风险,对提升居民健康管理水平、减轻家庭和社会的医疗负担具有重要的现实意义。

此外,嵌入式技术、传感器技术和蓝牙通信技术的快速发展,为智能药盒的设计与实现提供了成熟的技术支撑,使得智能药盒能够以较低的成本实现多样化的智能化功能,具备广泛的市场应用前景。

1.2 国内外研究现状

目前,国内外对智能药盒的研究已取得一定进展。国外发达国家凭借先进的技术优势,推出了多款功能完善的智能药盒产品,如美国PillPack智能药盒,具备药品分装、定时提醒、远程监控等功能,可通过手机APP实现用药记录查询和参数设置;日本推出的智能药盒则注重小型化和便捷性,整合了语音提醒、药品余量检测等功能,适用于居家和外出使用。这些产品智能化程度高,但价格昂贵,难以在发展中国家广泛普及。

国内对智能药盒的研究多集中于高校和科研机构,主要以STM32、Arduino等单片机为核心,整合传感器和通信模块,实现基本的定时提醒和监测功能。现有产品大多注重单一功能的实现,部分产品缺乏APP远程控制、多组定时设置等实用功能,且在稳定性、易用性等方面仍有提升空间。因此,本文设计的基于STM32的智能药盒,兼顾功能全面性、成本经济性和操作便捷性,能够更好地满足国内用户的实际需求。

1.3 研究内容与目标

1.3.1 研究内容

本文围绕基于STM32的智能药盒设计与实现展开研究,具体研究内容如下:

  1. 分析智能药盒的功能需求,确定系统的总体设计方案,包括硬件架构和软件流程。
  1. 完成系统硬件设计,包括主控单元、监测模块、显示模块、报警提醒模块、通信模块和电源模块的选型与电路设计,绘制硬件接线图和PCB图。
  1. 完成系统软件设计,基于Keil MDK开发环境编写各模块的控制代码,实现温湿度监测、药品余量检测、定时提醒、语音播报、蓝牙通信、APP控制等功能。
  1. 搭建系统调试环境,对硬件和软件进行调试,解决系统运行过程中出现的问题,确保各项功能稳定可靠。
  1. 对系统进行全面的功能测试和性能测试,验证系统的实用性和稳定性,分析测试结果并进行优化。

1.3.2 研究目标

本研究的目标是设计并实现一款功能完善、性能稳定、成本低廉、操作便捷的智能药盒,具体目标如下:

  1. 实现温湿度实时监测,通过DHT11传感器采集药盒内温湿度数据,确保药品存储环境符合要求。
  1. 实现药品余量监测,通过HX711称重模块检测药品重量,当重量为零时触发蜂鸣器缺药报警。
  1. 实现实时时间显示与设置功能,通过OLED屏幕清晰显示当前时间,支持用户手动设置时间。
  1. 实现5组定时提醒功能,每组定时时间可自由设置和控制开关,定时时间到后通过语音播报提醒用户吃药。
  1. 实现语音播报功能,通过JR6001语音模块播报吃药提醒,当光电红外传感器检测到用户吃药后,停止语音播报。
  1. 实现蓝牙通信与APP控制功能,通过BT04A蓝牙模块连接手机APP,实现温湿度、药品余量等环境信息的实时查看,以及定时时间和开关的远程设置。

1.4 论文结构安排

本文共分为7个章节,各章节内容安排如下:

第1章为绪论,阐述本文的研究背景与意义、国内外研究现状、研究内容与目标,以及论文的结构安排,为全文的研究奠定基础。

第2章为系统总体方案设计,明确系统的设计原则和功能需求,设计系统的总体架构和工作流程,确定系统的硬件和软件设计思路。

第3章为系统硬件设计,详细介绍各硬件模块的选型依据、电路设计原理,绘制硬件接线图和PCB图,确保硬件架构合理、稳定。

第4章为系统软件设计,介绍软件开发环境,设计主程序和各功能模块的软件流程,编写相关控制代码,实现系统的各项智能化功能。

第5章为系统调试与测试,搭建调试环境,对硬件和软件进行调试,开展系统功能测试和性能测试,分析测试结果并进行优化。

第6章为总结与展望,总结本文的研究成果,分析系统存在的问题与不足,对未来的研究方向进行展望。

第7章为参考文献、致谢和附录,列出本文所引用的参考文献,表达对指导教师和相关人员的感谢,附上系统源代码、硬件原理图等相关资料。

2 系统总体方案设计

2.1 设计原则

本智能药盒的设计遵循以下原则,确保系统的实用性、稳定性和经济性:

  1. 实用性原则:围绕用户的实际需求设计功能,操作简单便捷,适合不同年龄段用户使用,尤其是老年人和慢性病患者。
  1. 稳定性原则:选用成熟、可靠的元器件和技术,优化硬件电路和软件程序,确保系统长时间稳定运行,避免出现误报警、漏提醒等问题。
  1. 经济性原则:在满足功能需求的前提下,选用性价比高的元器件,降低系统成本,便于批量生产和普及。
  1. 扩展性原则:系统硬件和软件采用模块化设计,预留接口,便于后续增加功能(如GPS定位、云端数据存储等)。
  1. 易用性原则:OLED屏幕显示清晰,操作步骤简单,语音播报清晰易懂,手机APP界面简洁,便于用户快速上手。

2.2 系统功能需求分析

结合用户需求和市场调研,本智能药盒的功能需求主要分为以下7个方面,与用户提供的功能要求一致,具体如下:

  1. 主控功能:采用STM32F103C8T6单片机作为主控单元,负责接收各传感器的数据,处理用户操作指令,控制各模块协同工作。
  1. 监测功能:通过DHT11传感器实时检测药盒内的温湿度数据,通过HX711称重模块检测药品余量,通过光电红外传感器检测用户吃药状态,为后续的报警和提醒功能提供数据支撑。
  1. 缺药报警功能:当HX711称重模块检测到药品重量为零时,主控单元控制有源蜂鸣器发出报警声,提醒用户及时补充药品。
  1. 时间显示功能:支持实时时间的显示和手动设置,通过OLED屏幕清晰展示当前时间,方便用户查看。
  1. 定时提醒功能:支持设置5组定时吃药时间,每组定时时间可独立设置和控制开关,定时时间到后触发提醒功能。
  1. 语音播报功能:定时吃药时间到后,JR6001语音模块通过扬声器播报语音提醒(如“请吃药”),当光电红外传感器检测到用户吃药后,语音播报自动停止。
  1. APP控制功能:通过BT04A蓝牙模块与手机APP建立连接,APP可实时接收药盒内的温湿度、药品余量等环境信息,同时支持远程设置定时时间和控制定时开关。

2.3 系统总体架构设计

本智能药盒系统采用模块化设计,总体架构分为硬件层和软件层,各模块相互独立又协同工作,确保系统的稳定性和可维护性。

2.3.1 硬件层架构

硬件层以STM32F103C8T6单片机为核心,分为以下6个模块,各模块的功能和连接关系如下:

  1. 主控模块:STM32F103C8T6单片机,作为系统的核心,负责数据处理、指令发送和模块控制,是整个系统的“大脑”。
  1. 监测模块:包括DHT11温湿度传感器、HX711称重模块和光电红外传感器,分别负责采集温湿度、药品余量和吃药状态数据,通过对应的接口与主控模块连接,将采集到的数据传输给主控单元。
  1. 显示模块:OLED屏幕,通过I2C接口与主控模块连接,用于显示实时时间、温湿度数据、药品余量、定时设置信息等内容,为用户提供直观的信息展示。
  1. 报警与提醒模块:包括有源蜂鸣器和JR6001语音模块,蜂鸣器用于缺药报警,语音模块用于定时吃药提醒,均由主控模块控制启动和停止。
  1. 通信模块:BT04A蓝牙模块,通过UART接口与主控模块连接,负责与手机APP进行数据交互,实现远程控制和数据查看。
  1. 电源模块:为整个系统提供稳定的供电,采用5V直流电源供电,通过稳压电路将电压转换为3.3V,满足STM32单片机和各模块的供电需求。

2.3.2 软件层架构

软件层采用模块化设计,基于Keil MDK开发环境,以C语言为开发语言,主要分为以下5个模块:

  1. 主程序模块:负责初始化各模块,调度各功能模块协同工作,处理异常情况,确保系统正常运行。
  1. 数据采集模块:负责控制DHT11、HX711、光电红外传感器采集数据,对采集到的数据进行滤波、校准处理,确保数据的准确性。
  1. 显示控制模块:负责控制OLED屏幕的显示内容,根据主控单元的指令,实时更新时间、温湿度、药品余量等信息。
  1. 提醒与报警模块:负责处理定时提醒逻辑,控制语音模块播报提醒信息,检测药品余量并触发蜂鸣器报警。
  1. 蓝牙通信模块:负责处理BT04A蓝牙模块的通信逻辑,实现与手机APP的数据交互,接收APP发送的指令,上传药盒的环境信息。

2.4 系统工作流程设计

本智能药盒系统的工作流程如下,确保各项功能有序执行:

  1. 系统上电后,主控单元STM32F103C8T6初始化各模块(包括传感器、OLED屏幕、语音模块、蓝牙模块等),完成系统自检,若自检正常,OLED屏幕显示当前时间、温湿度初始值和药品余量初始值;若自检异常,蜂鸣器发出短鸣报警,提示用户检查硬件。
  1. 系统进入正常工作状态,各传感器实时采集数据:DHT11采集温湿度数据,HX711采集药品重量数据,光电红外传感器检测用户吃药状态,采集到的数据实时传输给主控单元。
  1. 主控单元对采集到的数据进行处理:将温湿度数据、药品余量数据实时显示在OLED屏幕上;判断药品重量是否为零,若为零,控制蜂鸣器持续报警,直到用户补充药品;判断光电红外传感器是否检测到吃药动作,若检测到,停止当前的语音播报。
  1. 主控单元实时检测定时设置,对比当前时间与5组定时时间,若某组定时时间到且该定时开关处于开启状态,控制JR6001语音模块播报吃药提醒,直到检测到用户吃药或用户手动停止。
  1. BT04A蓝牙模块持续处于待连接状态,当手机APP发起连接请求时,建立蓝牙通信链路,主控单元将温湿度、药品余量、定时设置等信息实时上传到APP,同时接收APP发送的定时设置指令和开关控制指令,更新系统参数。
  1. 用户可通过药盒上的按键手动设置实时时间、定时时间和定时开关,操作指令传输给主控单元后,主控单元更新相关参数,并在OLED屏幕上显示更新后的信息。

3 系统硬件设计

3.1 硬件总体设计

本系统硬件设计以STM32F103C8T6单片机为核心,整合各功能模块,实现智能药盒的各项功能。硬件总体设计的核心思路是:选用性价比高、稳定性好的元器件,采用模块化电路设计,简化接线,降低硬件故障率,同时预留接口,便于后续扩展。

硬件总体框图如图3-1所示(此处可插入硬件总体框图,附录中提供详细原理图),各模块通过对应的接口与主控单元连接,协同工作,完成数据采集、处理、显示、提醒和通信等功能。

3.2 主控单元设计(STM32F103C8T6)

3.2.1 元器件选型依据

STM32F103C8T6是ST公司推出的一款基于ARM Cortex-M3内核的32位单片机,具有以下优点,符合本系统的设计需求:

  1. 性能稳定:工作频率最高可达72MHz,具备较强的数据处理能力,能够满足多传感器数据采集和多模块控制的需求。
  1. 外设丰富:拥有多个GPIO口、UART接口、I2C接口、SPI接口等,可直接与各功能模块连接,无需额外扩展接口芯片,简化硬件设计。
  1. 成本低廉:性价比高,适合批量生产,能够降低系统的整体成本。
  1. 开发便捷:拥有成熟的开发环境和丰富的技术资料,便于软件编程和系统调试。
  1. 功耗较低:支持多种低功耗模式,适合长时间工作,延长药盒的使用时间。

3.2.2 主控单元电路设计

STM32F103C8T6单片机的最小系统电路是整个硬件系统的基础,包括电源电路、复位电路和晶振电路,具体设计如下:

  1. 电源电路:采用5V直流电源供电,通过AMS1117-3.3V稳压芯片将5V电压转换为3.3V,为单片机和各模块提供稳定的3.3V供电。电源输入端并联一个10μF电容和一个0.1μF电容,用于滤波,减少电源噪声,确保电路稳定工作。
  1. 复位电路:采用手动复位和上电复位相结合的方式,复位引脚(NRST)通过一个10kΩ电阻接3.3V电源,通过一个0.1μF电容接地,同时连接一个复位按键,按下按键时,复位引脚接地,实现手动复位;上电时,电容充电,实现上电复位,确保单片机正常启动。
  1. 晶振电路:采用8MHz外部晶振,晶振两端分别连接单片机的OSC_IN和OSC_OUT引脚,同时各串联一个22pF电容接地,为单片机提供稳定的时钟信号,确保单片机的时序准确,保障各模块的协同工作。

主控单元的GPIO口分配如下(根据实际接线调整):

  • DHT11温湿度传感器:连接PA0引脚(GPIO输入),用于接收温湿度数据。
  • HX711称重模块:DT引脚连接PA1,SCK引脚连接PA2,用于与称重模块通信,采集药品重量数据。
  • 光电红外传感器:连接PA3引脚(GPIO输入),用于检测用户吃药状态。
  • OLED屏幕:SDA引脚连接PB0,SCL引脚连接PB1(I2C接口),用于控制屏幕显示。
  • 有源蜂鸣器:连接PB2引脚(GPIO输出),用于缺药报警。
  • JR6001语音模块:TX引脚连接PB3,RX引脚连接PB4(UART接口),用于控制语音播报。
  • BT04A蓝牙模块:TX引脚连接PB5,RX引脚连接PB6(UART接口),用于蓝牙通信。
  • 功能按键:连接PB7-PB9引脚,用于时间设置、定时设置和开关控制。

3.3 监测模块设计

3.3.1 DHT11温湿度检测模块

DHT11是一款低成本、高精度的数字温湿度传感器,采用单总线通信方式,仅需一根GPIO线即可实现与主控单元的通信,适合用于药盒内温湿度的实时监测。其测量范围为温度0-50℃,误差±2℃;湿度20%-90%RH,误差±5%RH,能够满足药品存储环境的监测需求。

DHT11的电路设计简单,VCC引脚接3.3V电源,GND引脚接地,DATA引脚连接STM32的PA0引脚,同时在DATA引脚与VCC引脚之间串联一个10kΩ的上拉电阻,确保通信稳定。DHT11采用单总线协议,主控单元通过发送起始信号、接收响应信号和数据信号的方式,读取温湿度数据,具体通信时序和驱动代码将在软件设计章节详细介绍。需要注意的是,DHT11对时序精度要求严苛,必须采用微秒级精准延时,直接依赖HAL库的通用延时函数无法满足要求,需采用NOP循环实现精准延时,确保通信可靠。

3.3.2 HX711称重模块(药品余量检测)

HX711是一款高精度的称重传感器专用模数转换芯片,能够将称重传感器的模拟信号转换为数字信号,具有精度高、响应快、功耗低等优点,适合用于药品余量的检测。HX711支持SPI通信方式,通过DT(数据输出)和SCK(时钟输入)引脚与主控单元连接,可直接连接称重传感器,无需额外的放大电路。

HX711的电路设计如下:VCC引脚接5V电源,GND引脚接地,DT引脚连接STM32的PA1引脚,SCK引脚连接STM32的PA2引脚,DOUT引脚(数据输出)与DT引脚复用,PD_SCK引脚(时钟输入)与SCK引脚复用。称重传感器的输出端连接HX711的AIN+和AIN-引脚,用于采集药品的重量信号。主控单元通过控制SCK引脚的时钟信号,读取HX711转换后的数字信号,经过校准和计算,得到药品的实际重量,当重量为零时,触发缺药报警。

3.3.3 光电红外传感器模块(吃药状态检测)

光电红外传感器采用反射式红外传感器,由红外发射管和红外接收管组成,当用户伸手取药(吃药)时,红外光线被遮挡,接收管接收不到红外信号,输出电平发生变化,主控单元通过检测电平变化,判断用户是否在吃药。该传感器响应快、灵敏度高,适合用于检测用户的吃药动作。

光电红外传感器的电路设计如下:VCC引脚接3.3V电源,GND引脚接地,OUT引脚连接STM32的PA3引脚。当没有物体遮挡时,红外接收管接收到发射管的光线,OUT引脚输出高电平;当有物体遮挡时,接收管接收不到光线,OUT引脚输出低电平。主控单元通过检测PA3引脚的电平变化,判断用户是否在吃药,若检测到低电平(有遮挡),则判定为用户正在吃药,控制语音模块停止播报。

3.4 显示模块设计(OLED屏幕)

本系统采用0.96英寸OLED屏幕,分辨率为128×64,采用I2C通信方式,具有显示清晰、功耗低、体积小、响应快等优点,适合用于智能药盒的信息显示。OLED屏幕能够显示实时时间、温湿度数据、药品余量、定时设置信息等内容,为用户提供直观的信息展示。

OLED屏幕的电路设计如下:VCC引脚接3.3V电源,GND引脚接地,SDA引脚(数据线)连接STM32的PB0引脚,SCL引脚(时钟线)连接STM32的PB1引脚。I2C通信方式仅需两根线即可实现与主控单元的通信,简化了硬件接线。主控单元通过发送I2C指令,控制OLED屏幕的显示内容,包括字符、数字和简单图形的显示,具体的显示控制代码将在软件设计章节详细介绍。

3.5 报警与提醒模块设计

3.5.1 有源蜂鸣器(缺药报警)

有源蜂鸣器是一种自带振荡电路的蜂鸣器,只需接入电源和控制信号,即可发出固定频率的报警声,具有结构简单、使用方便等优点,适合用于缺药报警。本系统采用5V有源蜂鸣器,当药品重量为零时,主控单元控制蜂鸣器发出持续的报警声,提醒用户及时补充药品。

有源蜂鸣器的电路设计如下:VCC引脚接5V电源,GND引脚通过一个NPN三极管(PNP三极管也可)接地,三极管的基极通过一个1kΩ电阻连接STM32的PB2引脚。当主控单元输出高电平时,三极管导通,蜂鸣器通电发出报警声;当输出低电平时,三极管截止,蜂鸣器停止发声。这种设计可以避免主控单元GPIO口直接驱动蜂鸣器,保护GPIO口,同时增强蜂鸣器的发声功率。

3.5.2 JR6001语音模块(语音播报)

JR6001是一款低成本、高音质的语音模块,支持UART串口通信,可通过发送指令控制语音的播放、停止、音量调节等,内置多种语音芯片,也可自定义录制语音,适合用于定时吃药提醒。本系统通过JR6001语音模块播报“请吃药”等提醒语音,当检测到用户吃药后,停止语音播报。

JR6001语音模块的电路设计如下:VCC引脚接5V电源,GND引脚接地,TX引脚(语音模块发送端)连接STM32的PB4引脚,RX引脚(语音模块接收端)连接STM32的PB3引脚,通过UART接口与主控单元通信。主控单元通过发送串口指令,控制语音模块播放指定的语音,例如播放指定音轨的指令为0xAA 0x07 0x02 0x00 0x01 0xB4(具体指令需参考JR6001模块手册),同时可通过指令设置语音音量、停止播放等。JR6001模块初始化后,等待主控单元的指令,执行相应的语音播放操作。

3.6 通信模块设计(BT04A蓝牙模块)

BT04A是一款蓝牙低功耗(BLE)模块,支持蓝牙4.0标准,采用UART串口通信方式,具有通信稳定、功耗低、传输距离远(最大10m)等优点,适合用于智能药盒与手机APP的通信。BT04A模块支持从模式,配对码为1234,串口参数默认为9600bps、8位数据位、1位停止位、无校验位,可与手机APP建立蓝牙连接,实现数据交互。

BT04A蓝牙模块的电路设计如下:VCC引脚接3.3V电源,GND引脚接地,TX引脚(蓝牙模块发送端)连接STM32的PB6引脚,RX引脚(蓝牙模块接收端)连接STM32的PB5引脚,KEY引脚(模式切换引脚)可悬空或接地(根据实际需求设置)。主控单元通过UART接口向蓝牙模块发送数据(如温湿度、药品余量等),蓝牙模块将数据传输给手机APP;同时,手机APP发送的指令(如定时设置、开关控制等)通过蓝牙模块传输给主控单元,主控单元执行相应的操作。

3.7 电源模块设计

本系统采用5V直流电源供电,电源模块的核心功能是将输入的5V电压转换为3.3V稳定电压,为STM32单片机和各模块提供可靠的供电。电源模块采用AMS1117-3.3V稳压芯片,该芯片具有输出电压稳定、纹波小、功耗低等优点,适合用于嵌入式系统的电源设计。

电源模块的电路设计如下:输入电压(5V)通过一个二极管连接到AMS1117-3.3V的输入端(IN引脚),二极管用于防止电源反接,保护电路;AMS1117-3.3V的输出端(OUT引脚)输出3.3V电压,连接到各模块的VCC引脚;输入端和输出端分别并联一个10μF电容和一个0.1μF电容,用于滤波,减少电源噪声,确保电压稳定。同时,电源模块预留电池接口,可接入锂电池,便于外出使用,锂电池通过充电模块充电,确保系统长时间工作。

3.8 硬件接线图与PCB设计

根据上述各模块的电路设计,绘制系统硬件接线图,明确各元器件之间的连接关系,确保接线正确、合理,避免出现短路、断路等问题。硬件接线图采用Altium Designer软件绘制,清晰标注各引脚的连接关系、元器件型号和参数,便于硬件焊接和调试。

PCB设计采用双层PCB板,遵循PCB设计规范,合理布局各元器件,缩短信号线长度,减少干扰;电源线和地线尽量粗,确保供电稳定;各模块之间的连线尽量短,避免信号衰减和干扰。PCB板预留焊接孔和接口,便于元器件焊接和后续扩展,同时设计散热片,确保芯片工作时的散热效果,提高系统的稳定性。PCB设计完成后,生成Gerber文件,用于PCB板的制作。

4 系统软件设计

4.1 软件总体设计思路

本系统软件采用模块化设计思路,基于Keil MDK5开发环境,以C语言为开发语言,围绕STM32F103C8T6单片机展开编程。软件设计的核心思路是:将系统的各项功能拆分为独立的模块,每个模块负责实现特定的功能,通过主程序调度各模块协同工作,确保系统的稳定性和可维护性。

软件总体流程如下:系统上电后,首先进行各模块的初始化(包括GPIO口初始化、UART初始化、I2C初始化、传感器初始化等),完成系统自检;自检通过后,进入主循环,主循环中依次执行数据采集、数据处理、显示更新、定时判断、蓝牙通信等操作,同时响应用户的按键操作和APP指令,确保各项功能有序执行。

软件模块化设计的优点的是:各模块相互独立,便于代码的编写、调试和维护;当需要修改某一功能时,只需修改对应的模块代码,不影响其他模块的正常工作;便于后续功能扩展,可根据需求增加新的模块。

4.2 开发环境搭建

4.2.1 硬件开发环境

硬件开发环境主要包括:STM32F103C8T6最小系统板、各功能模块(DHT11、HX711、OLED等)、USB转串口模块、电脑、示波器(用于调试电路时序)、焊接工具(用于PCB板焊接)等。通过USB转串口模块将STM32最小系统板与电脑连接,实现程序的下载和调试;示波器用于检测传感器通信时序和电路信号,确保电路工作正常。

4.2.2 软件开发环境

软件开发环境采用Keil MDK5,具体搭建步骤如下:

  1. 安装Keil MDK5软件,选择合适的安装路径,完成软件安装。
  1. 安装STM32F103系列单片机的芯片包(Keil.STM32F1xx_DFP),用于支持STM32F103C8T6单片机的编程和调试。
  1. 创建新的工程,选择STM32F103C8T6芯片,配置工程参数(如时钟频率、堆栈大小等)。
  1. 添加相关的头文件和源文件,包括STM32标准库文件、各模块的驱动文件和主程序文件,建立工程目录,规范代码管理。
  1. 配置编译参数,选择合适的编译器,设置优化等级,确保代码编译正确、高效。
  1. 安装USB转串口驱动,将STM32最小系统板与电脑连接,配置下载参数(如串口端口、波特率等),实现程序的下载和调试。

4.3 主程序设计

主程序是系统软件的核心,负责调度各功能模块协同工作,处理异常情况,确保系统正常运行。主程序的流程如下:

  1. 系统上电后,执行系统初始化函数,包括GPIO口初始化、UART初始化(用于蓝牙和语音模块通信)、I2C初始化(用于OLED屏幕通信)、RTC初始化(用于实时时间)、各传感器初始化(DHT11、HX711、光电红外)等。
  1. 初始化完成后,执行系统自检函数,检测各模块是否正常工作(如传感器是否能采集到数据、OLED屏幕是否正常显示、蓝牙模块是否正常初始化等)。若自检异常,控制蜂鸣器发出短鸣报警,OLED屏幕显示错误信息;若自检正常,OLED屏幕显示初始界面(当前时间、温湿度初始值、药品余量初始值)。
  1. 进入主循环,主循环中依次执行以下操作:
            
  1. 数据采集:调用各传感器的数据采集函数,采集温湿度、药品重量、吃药状态等数据,对采集到的数据进行滤波、校准处理,确保数据准确。
  1. 数据处理:判断药品重量是否为零,若为零,设置缺药报警标志,控制蜂鸣器报警;判断光电红外传感器是否检测到吃药动作,若检测到,设置吃药标志,控制语音模块停止播报;处理定时时间,对比当前时间与5组定时时间,若定时时间到且开关开启,设置定时提醒标志,控制语音模块播报提醒。
  1. 显示更新:调用OLED显示函数,将实时时间、温湿度数据、药品余量、定时设置信息、报警状态等内容更新到OLED屏幕上。
  1. 蓝牙通信:调用蓝牙通信函数,检测蓝牙连接状态,若已连接,将温湿度、药品余量、定时设置等信息上传到手机APP,同时接收APP发送的指令,更新系统参数(如定时时间、定时开关等)。
  1. 按键处理:调用按键扫描函数,检测用户的按键操作,根据按键指令执行相应的操作(如时间设置、定时设置、报警停止等)。
  1. 主循环持续执行,不断更新数据和状态,确保系统各项功能正常运行。

主程序核心代码框架如下(简化版):

c

#include "stm32f10x.h"
#include "dht11.h"
#include "hx711.h"
#include "oled.h"
#include "jr6001.h"
#include "bt04a.h"
#include "key.h"
#include "rtc.h"

// 全局变量定义
uint8_t temp = 0; // 温度值
uint8_t humi = 0; // 湿度值
uint32_t weight = 0; // 药品重量
uint8_t eat_flag = 0; // 吃药标志(0:未吃药,1:已吃药)
uint8_t drug_lack_flag = 0; // 缺药标志(0:有药,1:缺药)
uint8_t timer_flag[5] = {0}; // 5组定时提醒标志

int main(void)
{
    // 系统初始化
    SystemInit(); // 系统时钟初始化
    GPIO_InitConfig(); // GPIO口初始化
    UART_InitConfig(); // UART初始化(蓝牙、语音)
    I2C_InitConfig(); // I2C初始化(OLED)
    RTC_InitConfig(); // RTC初始化(实时时间)
    DHT11_Init(); // DHT11初始化
    HX711_Init(); // HX711初始化
    OLED_Init(); // OLED初始化
    JR6001_Init(&huart2); // JR6001语音模块初始化(串口2)
    BT04A_Init(&huart3); // BT04A蓝牙模块初始化(串口3)
    KEY_Init(); // 按键初始化
    
    // 系统自检
    if(SelfCheck() != 0)
    {
        OLED_ShowString(0,0,"Check Error!");
        Beep_Alarm(1); // 蜂鸣器短鸣报警
        while(1); // 停止运行,等待用户检查
    }
    
    // 初始界面显示
    OLED_ShowString(0,0,"Time: 00:00:00");
    OLED_ShowString(0,2,"Temp: 00C");
    OLED_ShowString(0,4,"Humi: 00%RH");
    OLED_ShowString(0,6,"Weight: 00g");
    
    while(1)
    {
        // 数据采集
        DHT11_Read_Data(&temp, &humi); // 读取温湿度数据
        weight = HX711_Read_Weight(); // 读取药品重量数据
        eat_flag = IR_Sensor_Detect(); // 检测吃药状态
        
        // 数据处理
        Drug_Lack_Detect(); // 缺药检测
        Timer_Remind_Detect(); // 定时提醒检测
        Eat_Action_Handle(); // 吃药动作处理
        
        // 显示更新
        OLED_Update_Display(temp, humi, weight, timer_flag, drug_lack_flag);
        
        // 蓝牙通信
        Bluetooth_Communicate(temp, humi, weight, timer_flag);
        
        // 按键处理
        Key_Handle();
        
        delay_ms(100); // 延时,降低CPU占用率
    }
}

4.4 各功能模块软件实现

4.4.1 传感器数据采集模块(DHT11、HX711、光电红外)

传感器数据采集模块负责控制各传感器采集数据,并对采集到的数据进行滤波、校准处理,确保数据的准确性和可靠性。

  1. DHT11温湿度采集:DHT11采用单总线通信,采集流程如下:主控单元发送起始信号(拉低总线20ms,再拉高80μs),DHT11返回响应信号(拉低80μs,再拉高80μs),随后发送40位数据(8位湿度整数、8位湿度小数、8位温度整数、8位温度小数、8位校验位)。主控单元接收数据后,进行校验,若校验通过,提取温湿度数据;若校验失败,重新采集。由于DHT11对时序精度要求高,采用NOP循环实现微秒级延时,确保通信可靠。核心代码参考DHT11的单总线通信协议,实现GPIO模式的动态切换(推挽输出与浮空输入)和数据解析。
  1. HX711称重采集:HX711采用SPI通信,采集流程如下:主控单元通过SCK引脚发送时钟信号,DT引脚输出数据,主控单元逐位读取数据,完成一次数据采集。采集到的数据需要进行校准(通过已知重量的物体校准),消除误差,得到实际的药品重量。校准完成后,实时采集药品重量数据,当重量小于设定的阈值(如1g)时,判定为缺药,设置缺药标志。
  1. 光电红外传感器采集:光电红外传感器的采集较为简单,主控单元通过GPIO口读取传感器的OUT引脚电平,若电平为低电平,说明有物体遮挡(用户正在吃药),设置吃药标志;若电平为高电平,说明无遮挡(用户未吃药),清除吃药标志。为了避免干扰,采用多次采集取平均值的方式,提高检测的准确性。

4.4.2 OLED显示模块(实时时间、温湿度、药品余量)

OLED显示模块负责

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐