STM32项目分享:智能水产养殖系统

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

[六、实验效果 ​编辑](#六、实验效果 编辑)

七、包含内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1jhW1zAEGu/?spm_id_from=333.337.search-card.all.click&vd_source=a90461cae133c0c360a3780433efae62

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32的智能水产养殖系统

功能如下:

  1. 主控芯片为STM32F103C8T6单片机
  2. DS18B20温度传感器测量水温度
  3. JW01用来监测环境CO2的值
  4. 光敏传感器用来监测环境光照值
  5. PH传感器用来监测PH值
  6. 水位传感器用来监测水位
  7. OLED显示屏实时显示当前水温、CO2值、光照值、PH值和水位
  8. 按键可设置阈值和模式切换
  9. 自动模式下水温、水位、光照值和PH值超过阈值范围触发蜂鸣器报警,并打开继电器
  10. 手动模式下可通过按键控制继电器开关
  11. 蓝牙APP显示信息并完成控制指令下发

2.主要器件

  • STM32F103C8T6单片机
  • OLED 屏幕
  • DS18B20数字温度传感器
  • JW01三合一气体传感器
  • PH传感器
  • 水位传感器
  • 光敏传感器
  • 继电器
  • 蜂鸣器

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

cpp 复制代码
#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "usart.h"
#include "usart2.h"
#include "delay.h"
#include "jdq.h"
#include "ds18b20.h"
#include "LDR.h"
#include "oled.h"
#include "key.h"
#include "Modules.h"
#include "TIM2.h"
#include "TIM3.h"
#include "adcx.h"
#include "flash.h"
#include "fan.h"
#include "bump.h"
#include "water.h"
#include "ph.h"

/****************异方辰电子工作室******************
		             STM32				
								
*文件          	 :	STM32智能水产养殖系统
*版本	   		 :	V1.0
*日期	   		 :	2025.10.14
*MCU	   		 :	STM32F103C8T6
*接口	   		 :	见代码
*BILIBILI	   	 :	异方辰电子
*小红书	    	 :	异方辰电子
*CSDN	    	 :	异方辰电子
*授权IP	   		 :	辰哥单片机设计、异方辰、YFC电子、北海单片机设计

**********************BEGIN***********************/
#define KEY_Long1	11

#define KEY_1	1
#define KEY_2	2
#define KEY_3	3
#define KEY_4	4

#define FLASH_START_ADDR	0x0801f000	//写入的起始地址

//传感器变量声明
u16 lux;//光照值变量
u16 soil_temp;//土壤温度变量
u16 soil_Humi;//土壤湿度变量
u32 dat;
u16 co2Data;//二氧化碳变量
uint16_t time_num = 0;								//10ms计时


SensorModules sensorData;								//声明传感器数据结构体变量
SensorThresholdValue Sensorthreshold;		//声明传感器阈值结构体变量
DriveModules driveData;									//声明驱动器状态结构体变量
static uint8_t app_cmd = 0;   // 0 无指令  3 开  4 关
uint8_t mode = 0;	//系统模式  1自动  2手动  3设置

//系统静态变量
static uint8_t count_a = 1;  //自动模式按键数
 uint8_t count_m = 1;  //手动模式按键数
static uint8_t count_s = 1;	 //设置模式按键数

extern uint8_t usart2_buf[256];				//串口2接收数组
char display_buf[16];					        //显示数组

/**
  * @brief  显示菜单内容
  * @param  无
  * @retval 无
  */
enum 
{
	AUTO_MODE = 0,
	MANUAL_MODE,
	SETTINGS_MODE
	
}MODE_PAGES;

int main(void)
{ 
  SystemInit();//配置系统时钟为72M	
	delay_init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中断优先分组
	
	//传感器初始化
	LDR_Init();//光敏电阻初始化
	DS18B20_Init();//ds18b20初始化
	WATER_Init();
	PH_Init();
	
	//执行器初始化
	LED_Init();//大功率LED灯初始化
	FAN_Init();//风扇初始化
	BUMP1_Init();//水泵1初始化
	BUMP2_Init();//水泵2初始化
	BEEP_Init();//蜂鸣器初始化
	JDQ_Init();//加热片初始化
	
	Key_Init();//按键初始化
	OLED_Init();//OLED初始化
	USART1_Config();//串口1初始化
	USART2_Config();//串口2初始化
	USART3_Config();//串口3初始化
  TIM2_Init(72-1,1000-1);//定时器2初始化
	FLASH_ReadThreshold();//阈值读取函数
////	TIM3_Int_Init(1000-1,72-1);		//定时1ms中断
	
	OLED_Clear();//清屏
  while (1)
  {
		SensorScan();	//获取传感器数据
		
		time_num++;												//计时变量+1
		if(time_num >= 5000)
		{
			time_num = 0;
		}
		Bluetooth_Control();//蓝牙控制函数
		
		switch(mode)
		{
			case AUTO_MODE://默认自动模式
					if(SetAuto() ==1 )//自动模式下按键2按下的次数等于1
				{
					OLED_autoPage1();	//显示主页面1固定信息
					SensorDataDisplay1();	//显示传感器1数据
				}
				else
				{
					OLED_autoPage2();	//显示主页面2固定信息
					SensorDataDisplay2();	//显示传感器2数据
				}
				AutoControl();//自动模式控制函数
				
				/*按键1按下时切换模式*/
				if (KeyNum == KEY_1)   //系统模式mode  1自动  2手动  3设置
				{
					KeyNum = 0;
					mode = MANUAL_MODE;//进入手动模式
					count_m = 1;//手动模式下按键2的次数置一
					OLED_Clear();
				}
				
				if (KeyNum == KEY_Long1)
				{
					KeyNum = 0;
					mode = SETTINGS_MODE;//进入阈值设置模式
					count_s = 1;//阈值设置模式下按键2按下的次数置一
					OLED_Clear();
				}
				
				Control_Manager();//执行器执行函数
				
				break;
				
			case MANUAL_MODE://手动模式下
				OLED_manualOption(SetManual());//手动模式光标显示函数
				ManualControl(SetManual());//手动模式控制函数
				if (SetManual() <= 4)		//手动模式下按键2按下的次数小于等于4次
				{	
					OLED_manualPage1();//手动模式界面1显示
					ManualSettingsDisplay1();//手动模式界面1的开关显示
				}
				else//手动模式下按键2按下的次数大于4次
				{
					OLED_manualPage2();//手动模式界面2显示
					ManualSettingsDisplay2();//手动模式界面2的开关显示
				}
				
				if (KeyNum == KEY_1)   //系统模式mode  0手动  1自动(默认)
				{
					KeyNum = 0;
					mode = AUTO_MODE;//进入自动模式
					count_a = 1;//自动模式下按键2按下的次数置一
					OLED_Clear();
				}
				Control_Manager();//执行器执行函数
				
				break;
				
			case SETTINGS_MODE://阈值设置函数

				OLED_settingsOption(SetSelection());	//实现阈值设置页面的选择功能
				ThresholdSettings(SetSelection());	//实现阈值调节功能	
					
				if (SetSelection() <= 4)	
				{
					OLED_settingsPage1();	//显示阈值设置界面1固定信息
					SettingsThresholdDisplay1();	//显示传感器阈值1数据	
				}
				else
				{
					OLED_settingsPage2();	//显示阈值设置界面2固定信息
					SettingsThresholdDisplay2();	//显示传感器阈值2数据
				}
					//判断是否退出阈值设置界面
					if (KeyNum == KEY_1)
					{
						KeyNum = 0;
						mode = AUTO_MODE;	//进入自动模式
						count_a = 1;//自动模式下按键2按下的次数置一
						OLED_Clear();	//清屏
						//存储修改的传感器阈值至flash内
						FLASH_W(FLASH_START_ADDR, Sensorthreshold.luxValue,
						Sensorthreshold.tempValue_H,Sensorthreshold.tempValue_L, Sensorthreshold.co2DataValue,
						Sensorthreshold.PHValue_H,Sensorthreshold.PHValue_L);
					}
				break;
				default: break;
		}
		
		
		
  }
}

六、实验效果

七、包含内容

项目分享

相关推荐
一枝小雨2 小时前
【OTA专题】2 初级bootloader架构和基础工程移植
stm32·单片机·嵌入式·ota·bootloader·固件升级·加密升级
BreezeJuvenile9 小时前
外设模块学习(15)——MQ-2烟雾气体传感器(STM32)
stm32·单片机·学习·mq-2·烟雾气体传感器
Jie_jiejiayou11 小时前
定时器详解以及呼吸灯实现 — STM32(HAL库)
stm32·单片机·嵌入式硬件·定时器
逆小舟11 小时前
【STM32】定时器、PWM
stm32·单片机·嵌入式硬件
XH1.11 小时前
学习RT-thread(RT-thread定时器)
stm32·单片机·学习
QT 小鲜肉12 小时前
【个人成长笔记】在 Linux 系统下撰写老化测试脚本以实现自动压测效果(亲测有效)
linux·开发语言·笔记·单片机·压力测试
申克Lab12 小时前
STM32 串口概念 UART协议
stm32·单片机·嵌入式硬件
小莞尔12 小时前
【51单片机】【protues仿真】基于51单片机自动浇花系统
单片机·嵌入式硬件
沐欣工作室_lvyiyi13 小时前
基于51单片机的宠物喂食器的设计与实现(论文+源码)
单片机·嵌入式硬件·毕业设计·51单片机·宠物