自动化毕设 基于单片机的智能语音药箱系统(源码+硬件+论文)

您所在的位置:网站首页 家用智能药箱设计课题 自动化毕设 基于单片机的智能语音药箱系统(源码+硬件+论文)

自动化毕设 基于单片机的智能语音药箱系统(源码+硬件+论文)

2024-06-08 23:37| 来源: 网络整理| 查看: 265

文章目录 0 前言1 主要功能2 硬件设计(原理图)3 核心软件设计4 实现效果5 最后

0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 基于单片机的智能语音药箱系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

难度系数:3分工作量:3分创新点:4分

🧿 项目分享:见文末!

在这里插入图片描述

1 主要功能

利用STC90C516单片机、8个按键、LCD1602液晶显示屏、蜂鸣器、LED发光二极管等设计一个家庭用智能药盒。 该系统硬件部分由单片机最小系统、按键电路、液晶显示电路、声光报警电路组成, 系统能完成时间的实时显示、每天四次定时、每次用药四种药用量提醒的功能。

系统基本功能如下:

(1)显示 采用LCD1602显示实时时间、用药量、 调设信息显示等。

(2)定时时间与用药量的设定 系统须实现每天四次时间的定时,每次用药时须对四种药做出用量的提醒,通过6个按键完成,1个功能键,1个调节键, 4次定时对应的4个定时按键。

(3)实时时间调节 实时时间通过另外2个按键进行调节,其中之一为功能键,另一个为调节键。

(4)报警功能 实时时钟运行到定时时间时,LCD1602显示此次用药量,蜂鸣器响起,LED闪烁,提醒用药时间到。

2 硬件设计(原理图)

在这里插入图片描述

PCB

在这里插入图片描述

3 核心软件设计

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

存储信息的过程如下:

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

在这里插入图片描述

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

在这里插入图片描述

关键代码

#include #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 #ifdef DEBUG Serial.println("rorate left " + String(-targetRotation) + " step to open."); Serial.println("向左旋转 " + String(-targetRotation) + " 步以开盖."); #endif for (int i = 0; i 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 #ifdef DEBUG Serial.println("rorate right " + String(-targetRotation) + " step to close."); Serial.println("向左旋转 " + String(-targetRotation) + " 步以关盖."); #endif for (int i = 0; i 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 #ifdef DEBUG Serial.println("rorate right " + String(-targetRotation) + " step to take pills."); Serial.println("向左旋转 " + String(-targetRotation) + " 步以取药."); #endif for (int i = 0; i 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 #ifdef DEBUG Serial.println("rorate right " + String(-targetRotation) + " step to add pills."); Serial.println("向左旋转 " + String(-targetRotation) + " 步以换(加)药."); #endif for (int i = 0; i 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 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 int boxName = ((int *)pvParameters)[0]; int pillsNumber = ((int *)pvParameters)[1]; #ifdef DEBUG Serial.println("boxName: " + String(boxName)); Serial.println("pillsNumber: " + String(pillsNumber)); #endif takePills(boxName, pillsNumber); vTaskDelete(NULL); } void takePillsTest() { midToLeft(); openPump(); // stepper2.runToNewPosition(6400); delay(1000); digitalWrite(PIN_STEPPER2_DIR, LOW); for (int j = 0; j 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3