毕业设计之-基于stm32的智能药箱系统设计与实现(代码片段)

DC-STDIO DC-STDIO     2023-01-10     622

关键词:


1 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目

基于STM32的智能药箱系统设计与实现

大家可用于 课程设计 或 毕业设计

技术解答、毕设帮助、开题指导
print("Q 746876041") 

2 绪论

2.1 课题背景

照顾老人, 特别是提醒老人准时吃药已经成为了一个社会关心的问题。长期记录吃药种类、 吃药时间能为分析老人的病理提供有力的依据。

基于目 前市场需求, 学长设计了一款基于 STM32F103 并结合网络来提醒老人按时吃药的系统。

整个智能药箱系统分为智能药箱端与远程服务器端两个部分, 智能药箱端用于提醒, 服务器端用于记录监督

2.2 实现功能

整个系统经过多次测试和应用, 各功能模块都可以正常运行, 符合设计要求。 具有的功
能包括: 从服务器端的数据库中实时获取药物信息, 闹钟信息等并存储。 播放音频文件提醒老人用药, 在液晶屏上提示吃药信息, 老人可以根据显示信息正确用药。 智能药箱端能记录药箱中每种药的数目, 并进行药量检测, 在药量不足时发出提醒, 提示用户配药。 另外还可以对老人取药动作进行记录, 将取药状态通过互联网传输给服务器监控端, 为以后看病做依据。 另外, 智能药箱端通过程序界面方便的配置智能药箱内部的网络信息,包括服务器地址、端口、 网关等。

它的主要功能分为下面几个部分:

    1. 提醒功能
    1. 取药监督
    1. 记录吃药时间
    1. 对老人是否吃药及时做出反应
    1. 显示吃药信息

服务器中记录下的取药时间可以作为以后看病的有力依据, 使医生能够准确对老人的病情做出判断, 减少一定的医学失误。

尽管智能药箱的发展并没有早期预期的那么快。 但是, 它的应用价值极高, 针对性也很
强, 可以有效的管理老年人用药, 减少儿女对父母吃药问题上的担心。 所以, 随着科技的发展, 智能药箱的普及将指日可待。

3 系统设计

3.1 系统架构

设计上必须从上图架构出发, 从上图可以得出智能药箱系统的总体功能:

  • a) 闹钟提醒吃药
  • b) 液晶显示吃药信息
  • c) 实时采集取药状态
  • d) 存储从服务器端获取的信息
  • e) 配置界面配置药箱端的网络参数
  • f) 实时检测药数量, 不足提醒用户
  • g) 增加服务器端, 记录药物信息, 闹钟, 取状态药等信息

3.2 硬件设计

3.2.1 wifi电路设计

3.2.2 其他电路设计

略,内容相对冗余,也不是本文介绍的重点,需要详细设计方案,可以在文章末尾联系学长。

3.3 软件设计

3.3.1 软件工作流程


程序包括模块的驱动与功能操作, 驱动主要是硬件的驱动, 每个模块只有在硬件驱动成功后, 才能执行其余功能。

3.3.2 闹铃提醒程序设计

下图是闹铃提醒的程序流程图, STM32 从 TF 卡中读取 512 字节数据, 按顺序传输给VS1003 进行音频转换和播放。 然后, 依次读取下一个扇区的 512 个字节进行播放。 如果播放过程中检测到药箱打开, 则停止闹铃并退出。

3.3.3 液晶显示程序设计

下图是闹铃提醒的程序流程图, STM32 从 TF 卡中读取 512 字节数据, 按顺序传输给VS1003 进行音频转换和播放。 然后, 依次读取下一个扇区的 512 个字节进行播放。 如果播放过程中检测到药箱打开, 则停止闹铃并退出。

3.3.4 信息存储程序设计

存储信息的过程如下:

当智能药箱接收网络参数, 药物信息时, 首先对数据按协议正确处理, 然后向 24C08 发送存储地址, 如果地址上已经有数据, 则读取。 然后将地址上的数据清空, 将刚才接收并处理的信息与从存储芯片读取的数据进行统一处理, 保留不变的, 修改已改变的数据, 再存入地址中。 如果需要读取存储芯片上的数据, 则向 24C08 发送地址读取数据即可, 程序流程图如下图所示。

3.3.5 报警电路程序设计

智能药箱与服务器之间每半小时需要药数目的校正, 以便两者之间可以同步。 当药箱内部药量不足时, 就会触发蜂鸣器以示提醒。 蜂鸣器采用是有源蜂鸣器, 接通电流就会发声,整个报警的程序流程图如下图所示。

3.4 部分实现代码

#include <Arduino.h>

#include "MAX30105.h"
#include "heartRate.h"
#include "motor.h"

#define DEBUG

#define OUT_POSITION 1
#define TAKE_POSITION 2
#define OPEN_POSITION 5

bool isTaskTake = false;
int boxdisplacement = 0;
int pillsParameters[2] = 3, 1;
enum BOXNAME  BOX1 = 1, BOX2, BOX3, BOX4, BOX5, BOX6 ;
TaskHandle_t taskGreenLEDHandler;

void rotateToOpen(int boxName);
void rotateToClose(int boxName);
void rotateToTake(int boxName);
void rotateToOut(int boxName);
void takePills(int boxName, int pillsNumber);
void taskTakePills(void *pvParameters);
void takePillsTest();
void setup() 
    Serial.begin(115200);
    delay(1000);
    motor_init();
    // xTaskCreate(taskPrint, "taskPrint", 1000, NULL, 1, NULL);


void loop() 
    if (Serial.available()) 
        char message = ' ';
        message = Serial.read();
        if (message == 't') 
            if (!isTaskTake) 
                isTaskTake = true;
                Serial.println("*************\\n*开始取药过程*\\n*************");
                // xTaskCreate(taskTakePills, "taskTakePills", 20000,
                // pillsParameters, 1, NULL);
                takePills(3, 1);
             else 
                Serial.println("已经有一个取药任务了");
            
        
        if (message == 'i')   //开盖
            if (!isTaskTake) 
                isTaskTake = true;
                taskOpenBox(NULL);
                isTaskTake = false;
             else 
                Serial.println("已经有一个取药任务了");
            
        
        if (message == 'j')   //关盖
            if (!isTaskTake) 
                isTaskTake = true;
                taskCloseBox(NULL);
                digitalWrite(PIN_ENABLE, HIGH);
                isTaskTake = false;
             else 
                Serial.println("已经有一个取药任务了");
            
        
        if (message == 'm')   //关盖
            if (!isTaskTake) 
                isTaskTake = true;
                digitalWrite(PIN_ENABLE, LOW);
                takePillsTest();
                digitalWrite(PIN_ENABLE, HIGH);
                isTaskTake = false;
             else 
                Serial.println("已经有一个取药任务了");
            
        
        if (message == 'g')   //左旋
            if (!isTaskTake) 
                isTaskTake = true;
                digitalWrite(PIN_ENABLE, LOW);
                taskRotate(LEFT);
                boxdisplacement--;
                digitalWrite(PIN_ENABLE, HIGH);
                isTaskTake = false;
             else 
                Serial.println("已经有一个取药任务了");
            
        
        if (message == 'h')   //右旋
            if (!isTaskTake) 
                isTaskTake = true;
                digitalWrite(PIN_ENABLE, LOW);
                taskRotate(RIGHT);
                boxdisplacement++;
                digitalWrite(PIN_ENABLE, HIGH);
                isTaskTake = false;
             else 
                Serial.println("已经有一个取药任务了");
            
        
        if (message == 'k') 
            if (!isTaskTake) 
                isTaskTake = true;
                Serial.println("开始推出药盒");
                digitalWrite(PIN_ENABLE, LOW);
                taskPushBoxOut(NULL);
                delay(1000);
                Serial.println("开始推入药盒");
                taskPullBoxIn(NULL);
                digitalWrite(PIN_ENABLE, HIGH);
                isTaskTake = false;
             else 
                Serial.println("已经有一个取药任务了");
            
        
        if (message == '3') 
            taskPillsOut(NULL);
        
        if (message == 'a')   //开气泵
            openPump();
        
        if (message == 'b')   //关气泵
            closePump();
        
    


void rotateToOpen(int boxName) 
    int currentPosition = boxName + boxdisplacement;
    int targetRotation = OPEN_POSITION - currentPosition;
    if (targetRotation >= 0) 
#ifdef DEBUG
        Serial.println("rorate right " + String(targetRotation) +
                       " step to open.");
        Serial.println("向右旋转 " + String(targetRotation) + " 步以开盖.");
#endif
        for (int i = 0; i < targetRotation; i++) 
            taskRotate(RIGHT);
            boxdisplacement++;
        
     else 
#ifdef DEBUG
        Serial.println("rorate left " + String(-targetRotation) +
                       " step to open.");
        Serial.println("向左旋转 " + String(-targetRotation) + " 步以开盖.");
#endif
        for (int i = 0; i < -targetRotation; i++) 
            taskRotate(LEFT);
            boxdisplacement--;
        
    

void rotateToClose(int boxName) 
    int currentPosition = boxName + boxdisplacement;
    int targetRotation = OPEN_POSITION - currentPosition;
    if (targetRotation >= 0) 
#ifdef DEBUG
        Serial.println("rorate right " + String(targetRotation) +
                       " step to close.");
        Serial.println("向右旋转 " + String(targetRotation) + " 步以关盖.");
#endif
        for (int i = 0; i < targetRotation; i++) 
            taskRotate(RIGHT);
            boxdisplacement++;
        
     else 
#ifdef DEBUG
        Serial.println("rorate right " + String(-targetRotation) +
                       " step to close.");
        Serial.println("向左旋转 " + String(-targetRotation) + " 步以关盖.");
#endif
        for (int i = 0; i < -targetRotation; i++) 
            taskRotate(LEFT);
            boxdisplacement--;
        
    

void rotateToTake(int boxName) 
    int currentPosition = boxName + boxdisplacement;
    int targetRotation = TAKE_POSITION - currentPosition;
    if (targetRotation >= 0) 
#ifdef DEBUG
        Serial.println("rorate right " + String(targetRotation) +
                       " step to take pills.");
        Serial.println("向右旋转 " + String(targetRotation) + " 步以取药.");
#endif
        for (int i = 0; i < targetRotation; i++) 
            taskRotate(RIGHT);
            boxdisplacement++;
        
     else 
#ifdef DEBUG
        Serial.println("rorate right " + String(-targetRotation) +
                       " step to take pills.");
        Serial.println("向左旋转 " + String(-targetRotation) + " 步以取药.");
#endif
        for (int i = 0; i < -targetRotation; i++) 
            taskRotate(LEFT);
            boxdisplacement--;
        
    

void rotateToOut(int boxName) 
    int currentPosition = boxName + boxdisplacement;
    int targetRotation = OUT_POSITION - currentPosition;
    if (targetRotation >= 0) 
#ifdef DEBUG
        Serial.println("rorate right " + String(targetRotation) +
                       " step to add pills.");
        Serial.println("向右旋转 " + String(targetRotation) + " 步以换(加)药.");
#endif
        for (int i = 0; i < targetRotation; i++) 
            taskRotate(RIGHT);
            boxdisplacement++;
        
     else 
#ifdef DEBUG
        Serial.println("rorate right " + String(-targetRotation) +
                       " step to add pills.");
        Serial.println("向左旋转 " + String(-targetRotation) +
                       " 步以换(加)药.");
#endif
        for (int i = 0; i < -targetRotation; i++) 
            taskRotate(LEFT);
            boxdisplacement--;
        
    

void takePills(int boxName, int pillsNumber) 
    digitalWrite(PIN_ENABLE, LOW);
    // taskPillsUp(NULL);
    rotateToOpen(boxName);
    taskOpenBox(NULL);
    rotateToTake(boxName);
    // stepper2.runToNewPosition(5000);
    midToLeft();
    openPump();
    // stepper2.runToNewPosition(6400);
    delay(1000);
    digitalWrite(PIN_STEPPER2_DIR, LOW);
    for (int j = 0; j <= 5; j++) 
        for (int i = 0; i < 500; i++) 
            digitalWrite(PIN_STEPPER2_STEP, HIGH);
            delayMicroseconds(400);
            digitalWrite(PIN_STEPPER2_STEP, LOW);
            delayMicroseconds(400);
        
        delay(500);
        digitalWrite(PIN_STEPPER2_DIR, HIGH);
        for (int k = 0; k < 500; k++) 
            digitalWrite(PIN_STEPPER2_STEP, HIGH);
            delayMicroseconds(400);
            digitalWrite(PIN_STEPPER2_STEP, LOW);
            delayMicroseconds(400);
        
        digitalWrite(PIN_STEPPER2_DIR, LOW);
    
    // stepper2.setMaxSpeed(2500);
    // stepper2.setAcceleration(1500);
    // stepper2.runToNewPosition(-20000);
    leftToMid();
    taskMidToRight(NULL);
    closePump();
    openAir();
    delay(3000);
    closeAir();
    delay(2000);
    taskPillsOut(NULL);
    taskRightToMid(NULL);
    // xTaskCreate(taskRightToMid, "taskRightToMid", 1000, NULL, 1, NULL);
    isTaskTake = false;
    digitalWrite(PIN_ENABLE, HIGH);


void taskTakePills(void *pvParameters) 
    int boxName = ((int *)pvParameters)[0];
    int pillsNumber = ((int *)pvParameters)查看详情  

毕业设计-题目:基于stm32的智能温控风扇设计与实现(代码片段)

文章目录1简介2绪论2.1课题背景3系统设计3.1系统架构3.2硬件部分3.2.1DS18B20简介3.2.2LCD1602液晶屏简介3.3软件部分3.3.1整体软件流程3.3.2初始化3.3.3温度采集与显示3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成... 查看详情

11基于stm32的智能药盒

11、基于STM32的智能药盒引言1系统概述1.1设计任务1.2设计要求2方案设计与论证2.1芯片选择方案2.2系统概述:2.3设计要求:2.4系统总体设计思路2.5各功能模块程序实现原理分析2.5.1显示模块:2.5.2按键模块:2.5.3语音模块:2.5.4时钟... 查看详情

5♥☆基于stm32的智能手环√★☆(代码片段)

5、♥☆基于STM32的智能手环√★☆💙💙文章目录5、♥☆基于STM32的智能手环√★☆💙💙Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2系统概述2.3、设计要求2.4、系... 查看详情

5♥☆基于stm32的智能手环√★☆(代码片段)

5、♥☆基于STM32的智能手环√★☆💙💙文章目录5、♥☆基于STM32的智能手环√★☆💙💙Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2系统概述2.3、设计要求2.4、系... 查看详情

基于stm32设计物联网在线智能称重系统(onenet)_2022

...辆称重地螃的智能化升级要求。需要结合这些场合,设计基于物联网的智能在线称重方案,开发智能称重控制器,合理选择部署多个重量传感器和必要的算法、NB一IoT或GPRS等通信模块、GPS定位模块,采集车辆重数据一地理位置信... 查看详情

基于stm32设计物联网在线智能称重系统(onenet)_2022

...辆称重地螃的智能化升级要求。需要结合这些场合,设计基于物联网的智能在线称重方案,开发智能称重控制器,合理选择部署多个重量传感器和必要的算法、NB一IoT或GPRS等通信模块、GPS定位模块,采集车辆重数据一地理位置信... 查看详情

毕业设计-题目:基于stm32的智能扫地机器人设计与实现(代码片段)

...stm32的智能扫地机器人设计与实现大家可用于课程设计或毕业设计技术解答、毕设帮助、开题指导print("Q746876041")1课题背景随着人口老龄化的到来和人民对提升生活品质的需要,人们对在现实生活场景中取代人力的服务... 查看详情

基于stm32单片机项目设计目录-加油吧√

★♥基于STM32单片机项目设计目录√♥※目录★♥基于STM32单片机项目设计目录√♥※1、基于STM32的音乐喷泉2、STM32的智能浇水补光系统3、基于STM32的手机通过wifi控LED灯4、基于STM32的电子打铃器5、基于STM32的智能手环6、基于STM32... 查看详情

基于stm32单片机项目设计目录-加油吧√

★♥基于STM32单片机项目设计目录√♥※目录★♥基于STM32单片机项目设计目录√♥※1、基于STM32的音乐喷泉2、STM32的智能浇水补光系统3、基于STM32的手机通过wifi控LED灯4、基于STM32的电子打铃器5、基于STM32的智能手环6、基于STM32... 查看详情

基于esp32的智能家居管理系统的设计与实现

基于ESP32的智能家居管理系统的设计与实现一、需求分析1.1硬件需求1.1.1 蓝牙收发数据1.1.2 网络收发数据1.1.3 传感器检测1.1.4 开关控制1.1.5PWM电机控制1.1.6 舵机控制1.1.7OLED显示1.1.8 自动控制1.2 微信小程... 查看详情

毕业设计之-题目:基于stm32的wifi监控小车(代码片段)

文章目录1背景2系统设计方案2.1实现功能2.1.1硬件部分:2.1.2软件部分:2.1.3WIFI通信功能:2.2系统架构2.2.1WiFi通信2.2.2电机驱动2.2.3摄像头2.2.4舵机2.2.5PWM舵机控制2.2.6红外循迹模块3软件设计4测试效果5部分关键代码6最后1... 查看详情

基于stm32设计的智能家居控制系统设计_语音+环境检测(onenet)_2022(代码片段)

1.前言如今的智能家居越来越深入人心,越来越受人们的欢迎。智能家居作为与人们日常生活息息相关的科技智能产物,可以给我们的生活带来舒适便利。随着物联网、云计算、无线通信等新技术的发展,智能家居得... 查看详情

基于stm32设计智能称重系统(华为云iot)

伴随着网络技术,各种通讯技术,传感器技术的飞速发展,物联网技术成为了当今技术领域发展为迅速的技术。而物联网技术的核心仍然是以互联网技术为基础的,物联网是新一代信息技术的重要组成部分,也是信息化时代的重... 查看详情

基于stm32设计智能称重系统(华为云iot)

伴随着网络技术,各种通讯技术,传感器技术的飞速发展,物联网技术成为了当今技术领域发展为迅速的技术。而物联网技术的核心仍然是以互联网技术为基础的,物联网是新一代信息技术的重要组成部分,也是信息化时代的重... 查看详情

基于stm32的智能鱼缸设计(代码片段)

...省鱼友时间、劳力、增加养鱼乐趣;为此,本文基于STM32单片机设计了一款智能鱼缸。该鱼缸可以实现水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能为一体的控制系统,可通过控制... 查看详情

基于stm32单片机智能rfid刷卡汽车位锁设计(开题报告)

...及体系结构设计四、主要参考文献与资料获得情况:五、毕业设计(论文)进度安排(按周说明)六、元器件一、课题的背景及意义射频识别,RFID(RadioFrequencyIdentification)技术,又称无线射频识别 查看详情

基于stm32+腾讯云io+微信小程序设计的混凝土智能养护系统

1.前言混凝土是现在建筑工程中非常重要的一个模块,在桥梁、道路、隧道、房子等等的建设上都少不了混凝土的使用;混凝土一般会与钢筋结合使用,作为建筑的承重结构,包括承重墙、楼板等等,需要用到混凝土,而混凝土... 查看详情