系列文章目录
- 基于单片机的超声波测距器设计
- 基于51单片机的自动浇花器设计
- 基于51单片机的红外遥控自动风扇设计
- 基于STM32的条形码识别器
文章目录
0 前言
🔥近几年随着人工智能等新技术的不断火热,带动了嵌入式等的传统行业的进一步发展。最近带过的几届同学反馈:以往的毕设题目缺乏创新性和亮点,不能满足学校的答辩要求。为了方便毕业生们顺利、省心、高效的通过毕设,这里分享一些优质的低投入高产出毕业设计。
今天给大家分享一个比较实用且有一定创新力的题目
🚩基于STM32鱼缸水族缸温度浊度氧溶解量监测系统
🥇首先对这道题目给出一个量化的评价(每项满分5⭐):
- 难度:⭐⭐⭐
- 工作量:⭐⭐⭐
- 创新性:⭐⭐⭐
1 题目
2 方案设计
2.1 方案框图
分析题目功能点,结合开发经验,构思整体方案,形成整体方案框图
2.2 器件选型
根据市售器件,进一步确定所用器件的具体型号:
主控:采用 STM32F103 系列嵌入式芯片,具体型号/规格暂定 STM32F103C8T6 最小系统板,系统主频 72 MHz;
氧溶解度传感器:采用荧光法监测探头,检测范围020mg/L(0200%饱和度),模拟量输出,主控通过ADC采集数据;
水位传感器:采用格栅电阻板,测定被水浸没的尺寸从而反应水位,模拟量输出,主控通过ADC采集数据,为通用市售型号;
水质传感器:检测水中的泥沙、有机物、微生物等悬浮物质造成的浑浊程度,模拟量输出,主控通过ADC采集数据,型号 TS-300B;
水温传感器:检测水体温度,采用防水型温度传感器,通过单总线协议通信,型号 DS18B20(不锈钢防水型);
液晶显示屏:显示系统的必要信息,主控通过I2C协议与其通信,型号 OLED 液晶屏;
电磁阀等控制器件:用来控制水缸的进水、放水、增氧器等设备工作,主控通过IO带动继电器控制;
蓝牙模块:HC-06 串口蓝牙模块,主控通过 UART 协议通信,为手机端APP提供互联功能;
系统采用5V供电,对特定器件采用额外供电方案。
2.3 小结-设计要点、难点解析
1、----------------------------------------------------
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 "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 ADC_PARTIAL_BASE 3300 // 分压电阻值 单位Ω
#define ADC_PARTIAL_EXTERN 2000 // 分压电阻值 单位Ω
#define ADC_MAX_VOLT 3300 // STM32 ADC 最高测量电压 3300 mV
#define OXYGEN_MAX_VALUE 20 // 氧传感器最大量程 20mg/L
#define OXYGEN_MAX_VOLT 5000 // 氧传感器最大输出电压 5000mV
#define WATER_LINE_LOW 3400 // 水位下限ADC值 小于此值水位过低
#define WATER_REPLENISH_THR 1800 // 加水上限ADC值 小于此值水位极低
#define WATER_TURBID_THR 3800 // 水浑浊度ADC阈值 小于此值水浑浊
#define OXYGEN_LOW_THR 5 // 氧溶解度最低阈值 低于此值需要加氧 单位 mg/L
/* 系统状态 */
uint8_t SYS_STATE; // 系统主状态标志位,不可直接修改,修改务必调用接口
//uint8_t uart_rx_data; // 串口接收到的数据
extern vu16 ADC_DMA_IN[6]; //声明外部变量
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 enum
{
CHANNEL_0_OXYGEN_P = 0,
CHANNEL_1_OXYGEN_N,
CHANNEL_2_LINE_1,
CHANNEL_3_LINE_2,
CHANNEL_4_TURBID_1,
CHANNEL_5_TURBID_2,
CHANNEL_CNT
}FILTER_CHANAL_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"},
};
uint16_t bt_data[7];
uint8_t *sys_state2str(SYSTEM_STATE_E const state);
uint16_t multi_mean_filter(uint8_t channel, uint16_t value, uint8_t initial);
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, "TANK: 1 | 2 "); // 显示字符串
OLED_DISPLAY_8x16_BUFFER(2, "LN/Q: _/_ | _/_ ");
OLED_DISPLAY_8x16_BUFFER(4, "TEMP:__._C|__._C");
OLED_DISPLAY_8x16_BUFFER(6, "OXGN: __mg/L ");
}
#if 0
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、程序源码获取、其他毕设题目解答,欢迎私信。
或关注微信公众号“电子设计万事屋”,敬请关注