系列文章目录
- 基于单片机的超声波测距器设计
- 基于51单片机的自动浇花器设计
- 基于51单片机的红外遥控自动风扇设计
- 基于STM32的条形码识别器
文章目录
0 前言
🔥近几年随着人工智能等新技术的不断火热,带动了嵌入式等的传统行业的进一步发展。最近带过的几届同学反馈:以往的毕设题目缺乏创新性和亮点,不能满足学校的答辩要求。为了方便毕业生们顺利、省心、高效的通过毕设,这里分享一些优质的低投入高产出毕业设计。
今天给大家分享一个比较实用且有一定创新力的题目
🚩智能鱼缸监测控制系统
🥇首先对这道题目给出一个量化的评价(每项满分5⭐):
- 难度:⭐⭐⭐
- 工作量:⭐⭐⭐
- 创新性:⭐⭐⭐
1 题目
2 方案设计
2.1 方案框图
分析题目功能点,结合开发经验,构思整体方案,形成整体方案框图
2.2 器件选型
主控:采用 STM32F103 系列嵌入式芯片,具体型号/规格暂定 STM32F103C8T6 最小系统板,系统主频 72 MHz;
水浑浊度传感器:检测水中的泥沙、有机物、微生物等悬浮物质造成的浑浊程度,模拟量输出,型号暂定 TS-300B;
人体红外热释电传感器:检测是否有人靠近水族缸,避免无人靠近时控制系统发出无意义、会干扰用户的提示,通过IO与主控连接,市面常见款,无特定型号;
语音播放模块:CN-TTS 中文串口语音合成模块,通过串口与主控通信;
时钟芯片:获取实时时间,与主控通过芯片自定义协议通信,型号 DS1302;
水位传感器:检测水族缸内的水位,模拟量输出,无特定型号;
水温度传感器:检测水的温度,通过单总线协议通信,型号 DS18B20;
液晶显示屏:显示控制系统的必要信息,通过I2C协议通信,型号 OLED 液晶屏;
系统采用5V供电。
2.3 小结-设计要点、难点解析
1、各类传感器的原理、使用方法与通信协议;
2、传感器数据的解析、去噪和拟合;
3、系统软件应具备高效的传感器数据采集顺序和逻辑,提升传感器响应速度;
4、语音合成模组的原理、使用方法和通信协议;
5、液晶显示屏的驱动原理、通信协议;
6、时钟芯片中的数据格式、读写原理和通信协议;
7、具备良好的人机工程学,能有效提示用户,又能避免对用户产生干扰;
8、系统软件总体流程设计,能够准确快速的响应用户操作;
9、系统需具备高鲁棒性,提升设备可靠性。
3 硬件设计——原理图及PCB
使用 Altium Designer 软件进行硬件原理图和PCB绘制
4 软件设计——软件模块划分及主程序源码
使用 Keil-MDK ARM建立工程
工程文件树
主程序部分源码展示:
/************************************************************
* @file main.c
* Description:
* $Revision: #1 $
* $Date: 2021/1101 $
* $Author:
* $Change: $
* $Warning: This file must save and open as encoding 'ANSI' or 'GBK' which is only support by TTS-module
* 主控MCU STM32F103C8T6 外部晶振8MHz RCC函数设置主频72MHz
*
*
***********************************************************/
#include "sys.h"
#include <stdio.h>
#include "basic_type_redef.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "oled0561.h"
#include "digital_io_device.h"
#include "adc.h"
#include "ds1302.h"
#include "ds18b20.h"
#if 0
#define MSG_MSG(fmt, ...) USART1_printf("[MSG] -I-:" fmt, ##__VA_ARGS__)
#define MSG_INF(fmt, ...) USART1_printf("[MSG] -I-:" fmt, ##__VA_ARGS__)
#define MSG_DBG(fmt, ...) USART1_printf("[MSG] -D-:" fmt, ##__VA_ARGS__)
#define MSG_WRN(fmt, ...) USART1_printf("[MSG] -W-:" fmt, ##__VA_ARGS__)
#define UART_LOG(_level, _mod, _fmt, ...) USART1_printf(_fmt, ##__VA_ARGS__)
#define LOG_MSG(fmt, ...) UART_LOG(INFO, mod, fmt, ##__VA_ARGS__)
#endif
/* 全局变量声明 */
#define WATER_LINE_LOW 3400 // 水位下限ADC值
#define WATER_REPLENISH_THR 1800 // 加水上限ADC值
#define WATER_TURBID_THR 3800 // 水浑浊度ADC阈值
#define MIN_SPEAK_TIME 30 // 最小播放时间间隔 单位:分钟
#define SPK_TIME 6000 // 语音播放时长 6000ms
#define HUMAN_DETECT_CNT 200 // 人体检测重复次数
#define HUMAN_DETECT_THR 30 // 此值为实测推算,每HUMAN_DETECT_CNT次有HUMAN_DETECT_THR次检测到人体,则认定有人体
#define WATER_CHANGE_TIME 30 // 换水时长 30天
/* 系统状态 */
uint8_t SYS_STATE; // 系统主状态标志位,不可直接修改,修改务必调用接口
uint8_t LAMP_LIGHT_TIME; // 路灯点亮的时长
uint8_t LAMP_LIGHT_CNT; // 路灯点亮的次数
uint8_t LAST_TIME_STAMP[2]; // 上一次感应到人体并播放的时间戳数组 时、分
uint8_t CUR_TIME_STAMP[2]; // 当前时间戳
uint8_t WATER_CHANGE_STAMP[2];// 上次换水时间戳 月日
uint8_t HUMAN_CONBINE_TIME; // 人体检测及时钟标志位
//uint8_t uart_rx_data; // 串口接收到的数据
extern vu16 ADC_DMA_IN[2]; //声明外部变量
extern DS18B20_MEASURE DS18B20_Measure;
/* 系统工作状态 */
typedef enum
{
SYS_STATE_NONE = 0,
SYS_STATE_READY,
SYS_STATE_RESPONSE,
SYS_STATE_WATER_REPLENISH,
SYS_STATE_CNT
}SYSTEM_STATE_E;
typedef struct
{
uint16_t enum_idx;
uint8_t* str;
}enum_str_t;
enum_str_t const sys_state_str[SYS_STATE_CNT] =
{
{SYS_STATE_NONE, (uint8_t *)"NONE"},
{SYS_STATE_READY, (uint8_t *)"REDY"},
{SYS_STATE_RESPONSE, (uint8_t *)"RSPS"},
{SYS_STATE_WATER_REPLENISH, (uint8_t *)"RPLS"},
};
uint8_t *sys_state2str(SYSTEM_STATE_E const state);
uint16_t mean_filter(uint16_t value);
uint16_t mean_filter4water_turbidity(uint16_t value);
/* 状态转换 */
void state_update(uint8_t current_state)
{
if (current_state != SYS_STATE)
{
//OLED_DISPLAY_CLEAR();
if (SYS_STATE_READY == current_state)
{
OLED_DISPLAY_CLEAR();
MSG_DBG("STATE from [ %s ] to [ %s ] \r", sys_state2str(SYS_STATE), sys_state2str(current_state));
OLED_DISPLAY_8x16_BUFFER(0, "------REDY------"); // 显示字符串
OLED_DISPLAY_8x16_BUFFER(2, "TBDT: ");
OLED_DISPLAY_8x16_BUFFER(4, "LINE: ");
}
#if 10
else if (SYS_STATE_RESPONSE == current_state)
{
MSG_DBG("STATE from [ %s ] to [ %s ] \r", sys_state2str(SYS_STATE), sys_state2str(current_state));
OLED_DISPLAY_8x16_BUFFER(0, "------RSPS------");
//OLED_DISPLAY_8x16_BUFFER(2, "LUMI:");
//OLED_DISPLAY_8x16_BUFFER(4, "TIME: CNT:");
}
else if (SYS_STATE_WATER_REPLENISH == current_state)
{
OLED_DISPLAY_CLEAR();
MSG_DBG("STATE from [ %s ] to [ %s ] \r", sys_state2str(SYS_STATE), sys_state2str(current_state));
OLED_DISPLAY_8x16_BUFFER(0, "------RPLS------");
//OLED_DISPLAY_8x16_BUFFER(2, "LUMI:");
}
#endif
else if (SYS_STATE_NONE == current_state || SYS_STATE_CNT == current_state)
{
MSG_DBG("STATE from [ %s ] to [ %s ] \r", sys_state2str(SYS_STATE), sys_state2str(current_state));
OLED_DISPLAY_8x16_BUFFER(0, "!!!FATALERROR!!!");
}
SYS_STATE = current_state;
}
}
5 成果——实现效果展示
6 最后总结——项目资料获取
想获取设计方案、器件资料、原理图、PCB、程序源码获取、其他毕设题目解答,欢迎私信。
或关注微信公众号“电子设计万事屋”,敬请关注