当前位置: 首页 > news >正文

基于STM32物联网智能鱼缸智能家居系统

基于STM32物联网智能鱼缸

(程序+原理图+PCB)

功能介绍

具体功能:

1.本设计采用的stm32f103c8t6单片机设计;

2.使用的esp8266 01s wifi模块实现物联网手机通信;

3.实现温度测量显示;

4.实现浊度测量超过阀值开始报警,提醒主人更换水了 ;

5.实现温度自动控制;

6.实现自动定时补氧控制 ;

7.实现自动定时喂食控制 ;

8.实现手机远程控制,有效查看鱼缸内的情况 ;

9.可以手机修改自动喂食、供氧时间 ;

添加图片注释,不超过 140 字(可选)

程序

//PB12板子占用了pwordown端口, 驱动LED需要关闭这个端口 
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "Hal_led.h"
#include "adc.h"
#include "delay.h"
/* USER CODE BEGIN Includes */
#include "hal_key.h"
#include "gizwits_product.h"
#include "common.h"
/* USER CODE END Includes */
#include "bsp_DS18B20.h"
#define intensity_Low  20
#define intensity_High  85
#define Temperature_High  32
#define Humidity_High 85
#include "Hal_Motor.h"/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
#define GPIO_KEY_NUM 2 ///< Defines the total number of key member
keyTypedef_t singleKey[GPIO_KEY_NUM]; ///< Defines a single key member array pointer
keysTypedef_t keys;
/* USER CODE END PV */
extern uint8_t Window_Open_Flag,Auto_Flag;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_NVIC_Init(void);
static void MX_TIM3_Init(void);
extern void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*//* USER CODE END PFP *//* USER CODE BEGIN 0 */
/**
* key1 short press handle
* @param none
* @return none
*/
void key1ShortPress(void)
{GIZWITS_LOG("KEY1 PRESS ,Production Mode\n");gizwitsSetMode(WIFI_PRODUCTION_TEST);
}/**
* key1 long press handle
* @param none
* @return none
*/
void key1LongPress(void)
{GIZWITS_LOG("KEY1 PRESS LONG ,Wifi Reset\n");gizwitsSetMode(WIFI_RESET_MODE);}/**
* key2 short press handle
* @param none
* @return none
*/
void key2ShortPress(void)
{GIZWITS_LOG("KEY2 PRESS ,Soft AP mode\n");
#if !MODULE_TYPEgizwitsSetMode(WIFI_SOFTAP_MODE);
#endif
}/**
* key2 long press handle
* @param none
* @return none
*/
void key2LongPress(void)
{//AirLink modeGIZWITS_LOG("KEY2 PRESS LONG ,AirLink mode\n");
#if !MODULE_TYPEgizwitsSetMode(WIFI_AIRLINK_MODE);
#endif
}/**
* Key init function
* @param none
* @return none
*/
void keyInit(void)
{singleKey[0] = keyInitOne(NULL, KEY1_GPIO_Port, KEY1_Pin, key1ShortPress, key1LongPress);singleKey[1] = keyInitOne(NULL, KEY2_GPIO_Port, KEY2_Pin, key2ShortPress, key2LongPress);keys.singleKey = (keyTypedef_t *)&singleKey;keyParaInit(&keys);
}
/* USER CODE END 0 */
uint8_t AddFoodFlag = 0,AddOxFlag = 0;
uint16_t AddFoodTime = 0,AddOxTime = 0;
void userHandle(void)
{static uint32_t thLastTimer = 0;if((gizGetTimerCount() - thLastTimer) > 1000)      //上报间隔读取温度2S{currentDataPoint.valueTemp = DS18B20_GetTemp_SkipRom();//Add Sensor Data CollectioncurrentDataPoint.valueTurbidity =  3291.3 - (float)Get_Adc_Average(ADC_CHANNEL_0,10)*3.3/4096*2*865.68;if( currentDataPoint.valueTemp  < currentDataPoint.valueHeatLimit)		//开启加热{TEMPON;}else{TEMPOFF;}if( currentDataPoint.valueAddFoodTime > 0){AddFoodTime ++;if(AddFoodTime >  currentDataPoint.valueAddFoodTime && AddFoodFlag == 0){	AddFoodTime = 0;				AddFoodFlag = 1;motorNcircle(32,0);//正转currentDataPoint.valueAddFoodKey = 1;}if(AddFoodFlag == 1 && AddFoodTime > 2){AddFoodTime = 0;motorNcircle(32,1);//反转AddFoodFlag = 0;currentDataPoint.valueAddFoodKey = 0;}}if( currentDataPoint.valueAddOxTime > 0){AddOxTime ++;if(AddOxTime >  currentDataPoint.valueAddOxTime && AddOxFlag == 0){AddOxTime = 0;				AddOxFlag = 1;				OxON;currentDataPoint.valueAddOxKey = 1;}if(AddOxFlag == 1 && AddOxTime > 2){AddOxTime = 0;AddOxFlag = 0;OxOFF;currentDataPoint.valueAddOxKey = 0;}}if(currentDataPoint.valueTurbidity < 1200){			BeepOFF;	}else {BeepON;	}thLastTimer = gizGetTimerCount();}
}int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration----------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();MX_TIM3_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();/* Initialize interrupts */MX_NVIC_Init();/* USER CODE BEGIN 2 */timerInit();uartInit();delay_init(72);  //初始化延迟函数   // 延时 初始化userInit();keyInit();LED_GPIO_Init();MY_ADC_Init(); //Moter_GPIO_Init();gizwitsInit();while(DS18B20_Init());Moter_GPIO_Init();GIZWITS_LOG("MCU Init Success \n");/* USER CODE END 2 */TEMPOFF;OxOFF;/* Infinite loop *//* USER CODE BEGIN WHILE */delay_ms(520);while (1){userHandle();	 gizwitsHandle((dataPoint_t *)&currentDataPoint);}/* USER CODE END 3 */}/** System Clock Configuration
*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct;RCC_ClkInitTypeDef RCC_ClkInitStruct;/**Initializes the CPU, AHB and APB busses clocks*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Initializes the CPU, AHB and APB busses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Configure the Systick interrupt time*/HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);/**Configure the Systick*/HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);/* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}/** NVIC Configuration
*/
static void MX_NVIC_Init(void)
{/* TIM2_IRQn interrupt configuration */HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0);HAL_NVIC_EnableIRQ(TIM2_IRQn);/* USART2_IRQn interrupt configuration */HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(USART2_IRQn);
}/* TIM2 init function */
static void MX_TIM2_Init(void)
{TIM_ClockConfigTypeDef sClockSourceConfig;TIM_MasterConfigTypeDef sMasterConfig;htim2.Instance = TIM2;htim2.Init.Prescaler = 7200-1;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 10-1;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim2) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}}
/* TIM3 init function */
static void MX_TIM3_Init(void)
{TIM_MasterConfigTypeDef sMasterConfig;TIM_OC_InitTypeDef sConfigOC;htim3.Instance = TIM3;htim3.Init.Prescaler = 9;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 7199;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 0;sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sConfigOC.Pulse = 500;if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}HAL_TIM_MspPostInit(&htim3);}
/* USART1 init function */
static void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}}/* USART2 init function */
static void MX_USART2_UART_Init(void)
{huart2.Instance = USART2;huart2.Init.BaudRate = 9600;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart2) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}}/** Configure pins as* Analog* Input* Output* EVENT_OUT* EXTI
*/
static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;/* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();/*Configure GPIO pin : KEY1_Pin */GPIO_InitStruct.Pin = KEY1_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP; //修改成上拉HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : KEY2_Pin */GPIO_InitStruct.Pin = KEY2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : GPRS_PWRON_Pin */ //IICGPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);//		GPIO_InitStruct.Pin = GPRS_PWRON_Pin;
//		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
//		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
//		HAL_GPIO_Init(GPRS_PWRON_DIN_GPIO_Port, &GPIO_InitStruct);
//		HAL_GPIO_WritePin(GPRS_PWRON_DIN_GPIO_Port, GPRS_PWRON_Pin, GPIO_PIN_RESET);}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @param  None* @retval None*/
void _Error_Handler(char * file, int line)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */while(1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t* file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */}
#include "adc.h"
#include "delay.h"
#include "stm32f1xx_hal.h"
//
*****//完整资料
****//***微信公众号:木子单片机****/
//All rights reserved
//ADC_HandleTypeDef ADC1_Handler;		//ADC句柄//初始化ADC
//ch: ADC_channels
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{RCC_PeriphCLKInitTypeDef ADC_CLKInit;ADC_CLKInit.PeriphClockSelection=RCC_PERIPHCLK_ADC;			//ADC外设时钟ADC_CLKInit.AdcClockSelection=RCC_ADCPCLK2_DIV6;			//分频因子6时钟为72M/6=12MHzHAL_RCCEx_PeriphCLKConfig(&ADC_CLKInit);					//设置ADC时钟ADC1_Handler.Instance=ADC1;ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐ADC1_Handler.Init.ScanConvMode=DISABLE;                      //非扫描模式ADC1_Handler.Init.ContinuousConvMode=DISABLE;                //关闭连续转换ADC1_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发HAL_ADC_Init(&ADC1_Handler);                                 //初始化HAL_ADCEx_Calibration_Start(&ADC1_Handler);					 //校准ADC
}//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟__HAL_RCC_GPIOA_CLK_ENABLE();			//开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;            //PA1GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
uint16_t Get_Adc(uint32_t ch)
{ADC_ChannelConfTypeDef ADC1_ChanConf;ADC1_ChanConf.Channel=ch;                                   //通道ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_239CYCLES_5;      //采样时间HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置HAL_ADC_Start(&ADC1_Handler);                               //开启ADCHAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换return (uint16_t)HAL_ADC_GetValue(&ADC1_Handler);	        	//返回最近一次ADC1规则组的转换结果
}
//获取指定通道的转换值,取times次,然后平均
//times:获取次数
//返回值:通道ch的times次转换结果平均值
uint16_t Get_Adc_Average(uint32_t ch,uint8_t times)
{uint32_t temp_val=0;uint8_t t;for(t=0; t<times; t++){temp_val+=Get_Adc(ch);delay_ms(5);}return temp_val/times;
}#endif

硬件设计

使用元器件:

单片机:STM32F103C8T6;

温度:DS18B20;

电阻:10K 0805;

继电器:KY-019;

wifi模块:ESP8266 12F;

蜂鸣器:有源蜂鸣器模块;

充气泵;加热棒;浊度传感器;

步进电机驱动:ULN2003驱动;

电机:28BYJ48五线四相步进电机;

添加图片注释,不超过 140 字(可选)

设计资料

01原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

02PCB

本系统pcb采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件Keil5 MDK版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计资料

全部资料包括程序(含注释)、原理图、PCB、元件清单、实物图、演示视频等。具体内容如下,全网最全! !

点赞分享一起学习成长。

相关文章:

  • Java线上CPU飙高问题排查全指南
  • 如何在服务器上部署 Python Django 应用
  • 接地气的方式认识JVM(二)
  • Linux边缘智能:物联网的终极进化
  • 【最新案例】智能物料称重柜/生鲜称重售卖柜系统, 共享自助管理系统, 物联网应用定制开发
  • 职坐标物联网全栈开发全流程解析
  • VR 技术赋能南锣鼓巷的多元发展潜力与前景​
  • Python ROS2【机器人中间件框架】 简介
  • 【HTML-16】深入理解HTML中的块元素与行内元素
  • 基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
  • 基于 Spring Boot 策略模式的短信服务提供商动态切换实现
  • delphi安装SAP控件:SAPFunctionsSAPLogonControl
  • Fail2ban开源入侵检测,保护SSH,NGINX等
  • 基于Python的气象数据分析及可视化研究
  • Java性能测试工具列举
  • 【PostgreSQL系列】PostgreSQL连接参数
  • 雷达RCS计算中的旋转矩阵
  • 【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
  • SpringBoot API接口签名(防篡改)
  • AWS vs 阿里云:功能、服务与性能对比指南
  • 雨岑信息科技有限公司做企业型网站做的怎么样_公司规模如何/谷歌商店paypal下载官网
  • 有哪些网站可以做设计比赛/手机百度高级搜索入口在哪里
  • 免费做简历下载的网站/淘词神器
  • 联通营业厅做网站维护/网络推广是指什么
  • wordpress 全部头像无法显示/seo销售好做吗
  • 教育网站建设的策划方案/网络销售培训