【毕业设计】往届案例分享 基于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、程序源码获取、其他毕设题目解答,欢迎私信。
或关注微信公众号“电子设计万事屋”,敬请关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值