基于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_TYPE
- gizwitsSetMode(WIFI_SOFTAP_MODE);
- #endif
- }
- /**
- * key2 long press handle
- * @param none
- * @return none
- */
- void key2LongPress(void)
- {
- //AirLink mode
- GIZWITS_LOG("KEY2 PRESS LONG ,AirLink mode\n");
- #if !MODULE_TYPE
- gizwitsSetMode(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 Collection
- currentDataPoint.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 *)¤tDataPoint);
-
- }
- /* 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 */ //IIC
- GPIO_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=12MHz
- HAL_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个转换在规则序列中 也就是只转换规则序列1
- ADC1_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式
- ADC1_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为0
- ADC1_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; //PA1
- GPIO_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个序列,序列1
- ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_239CYCLES_5; //采样时间
- HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
- HAL_ADC_Start(&ADC1_Handler); //开启ADC
- HAL_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;
温度 S18B20;
电阻: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、元件清单、实物图、演示视频等。具体内容如下,全网最全! !
点赞分享一起学习发展。
|