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

[复制链接]
发表于 2025-6-11 00:41:41 | 显示全部楼层 |阅读模式
基于STM32物联网智能鱼缸


(程序+原理图+PCB)




功能介绍

具体功能:

1.本设计接纳的stm32f103c8t6单片机设计;
2.利用的esp8266 01s wifi模块实现物联网手机通信;
3.实现温度测量显示;
4.实现浊度测量超过阀值开始报警,提醒主人更换水了 ;
5.实现温度自动控制;
6.实现自动定时补氧控制 ;
7.实现自动定时喂食控制 ;
8.实现手机长途控制,有用检察鱼缸内的情况 ;
9.可以手机修改自动喂食、供氧时间 ;


添加图片表明,不超过 140 字(可选)
程序

  1. //PB12板子占用了pwordown端口, 驱动LED需要关闭这个端口
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"
  4. #include "stm32f1xx_hal.h"
  5. #include "Hal_led.h"
  6. #include "adc.h"
  7. #include "delay.h"
  8. /* USER CODE BEGIN Includes */
  9. #include "hal_key.h"
  10. #include "gizwits_product.h"
  11. #include "common.h"
  12. /* USER CODE END Includes */
  13. #include "bsp_DS18B20.h"
  14. #define intensity_Low  20
  15. #define intensity_High  85
  16. #define Temperature_High  32
  17. #define Humidity_High 85
  18. #include "Hal_Motor.h"
  19. /* Private variables ---------------------------------------------------------*/
  20. TIM_HandleTypeDef htim2;
  21. TIM_HandleTypeDef htim3;
  22. UART_HandleTypeDef huart1;
  23. UART_HandleTypeDef huart2;
  24. /* USER CODE BEGIN PV */
  25. /* Private variables ---------------------------------------------------------*/
  26. #define GPIO_KEY_NUM 2 ///< Defines the total number of key member
  27. keyTypedef_t singleKey[GPIO_KEY_NUM]; ///< Defines a single key member array pointer
  28. keysTypedef_t keys;
  29. /* USER CODE END PV */
  30. extern uint8_t Window_Open_Flag,Auto_Flag;
  31. /* Private function prototypes -----------------------------------------------*/
  32. void SystemClock_Config(void);
  33. static void MX_GPIO_Init(void);
  34. static void MX_TIM2_Init(void);
  35. static void MX_USART1_UART_Init(void);
  36. static void MX_USART2_UART_Init(void);
  37. static void MX_NVIC_Init(void);
  38. static void MX_TIM3_Init(void);
  39. extern void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim);
  40. /* USER CODE BEGIN PFP */
  41. /* Private function prototypes -----------------------------------------------*/
  42. /* USER CODE END PFP */
  43. /* USER CODE BEGIN 0 */
  44. /**
  45. * key1 short press handle
  46. * @param none
  47. * @return none
  48. */
  49. void key1ShortPress(void)
  50. {
  51.     GIZWITS_LOG("KEY1 PRESS ,Production Mode\n");
  52.     gizwitsSetMode(WIFI_PRODUCTION_TEST);
  53. }
  54. /**
  55. * key1 long press handle
  56. * @param none
  57. * @return none
  58. */
  59. void key1LongPress(void)
  60. {
  61.     GIZWITS_LOG("KEY1 PRESS LONG ,Wifi Reset\n");
  62.     gizwitsSetMode(WIFI_RESET_MODE);
  63. }
  64. /**
  65. * key2 short press handle
  66. * @param none
  67. * @return none
  68. */
  69. void key2ShortPress(void)
  70. {
  71.     GIZWITS_LOG("KEY2 PRESS ,Soft AP mode\n");
  72. #if !MODULE_TYPE
  73.     gizwitsSetMode(WIFI_SOFTAP_MODE);
  74. #endif
  75. }
  76. /**
  77. * key2 long press handle
  78. * @param none
  79. * @return none
  80. */
  81. void key2LongPress(void)
  82. {
  83.     //AirLink mode
  84.     GIZWITS_LOG("KEY2 PRESS LONG ,AirLink mode\n");
  85. #if !MODULE_TYPE
  86.     gizwitsSetMode(WIFI_AIRLINK_MODE);
  87. #endif
  88. }
  89. /**
  90. * Key init function
  91. * @param none
  92. * @return none
  93. */
  94. void keyInit(void)
  95. {
  96.     singleKey[0] = keyInitOne(NULL, KEY1_GPIO_Port, KEY1_Pin, key1ShortPress, key1LongPress);
  97.     singleKey[1] = keyInitOne(NULL, KEY2_GPIO_Port, KEY2_Pin, key2ShortPress, key2LongPress);
  98.     keys.singleKey = (keyTypedef_t *)&singleKey;
  99.     keyParaInit(&keys);
  100. }
  101. /* USER CODE END 0 */
  102. uint8_t AddFoodFlag = 0,AddOxFlag = 0;
  103. uint16_t AddFoodTime = 0,AddOxTime = 0;
  104. void userHandle(void)
  105. {
  106.         static uint32_t thLastTimer = 0;
  107.         if((gizGetTimerCount() - thLastTimer) > 1000)      //上报间隔读取温度2S
  108.         {
  109.             currentDataPoint.valueTemp = DS18B20_GetTemp_SkipRom();//Add Sensor Data Collection
  110.       currentDataPoint.valueTurbidity =  3291.3 - (float)Get_Adc_Average(ADC_CHANNEL_0,10)*3.3/4096*2*865.68;
  111.       if( currentDataPoint.valueTemp  < currentDataPoint.valueHeatLimit)                //开启加热
  112.                         {
  113.                           TEMPON;
  114.                         }
  115.                         else
  116.                         {
  117.                           TEMPOFF;
  118.                         }
  119.                         if( currentDataPoint.valueAddFoodTime > 0)
  120.                         {
  121.                                 AddFoodTime ++;
  122.                                 if(AddFoodTime >  currentDataPoint.valueAddFoodTime && AddFoodFlag == 0)
  123.                                 {        AddFoodTime = 0;                               
  124.                                         AddFoodFlag = 1;
  125.                                         motorNcircle(32,0);//正转
  126.                                         currentDataPoint.valueAddFoodKey = 1;
  127.                                 }
  128.                                 if(AddFoodFlag == 1 && AddFoodTime > 2)
  129.                                 {
  130.                                         AddFoodTime = 0;
  131.                                         motorNcircle(32,1);//反转
  132.                                   AddFoodFlag = 0;
  133.                                         currentDataPoint.valueAddFoodKey = 0;
  134.                                 }
  135.                         }
  136.                         if( currentDataPoint.valueAddOxTime > 0)
  137.                         {
  138.                                 AddOxTime ++;
  139.                                 if(AddOxTime >  currentDataPoint.valueAddOxTime && AddOxFlag == 0)
  140.                                 {
  141.                                         AddOxTime = 0;                               
  142.                                         AddOxFlag = 1;                               
  143.                                         OxON;
  144.                                         currentDataPoint.valueAddOxKey = 1;
  145.                                 }
  146.                                 if(AddOxFlag == 1 && AddOxTime > 2)
  147.                                 {
  148.                                         AddOxTime = 0;
  149.                                   AddOxFlag = 0;
  150.                                         OxOFF;
  151.                                   currentDataPoint.valueAddOxKey = 0;
  152.                                 }
  153.                         }
  154.                        
  155.                   if(currentDataPoint.valueTurbidity < 1200)
  156.                         {                       
  157.                                 BeepOFF;       
  158.                         }
  159.                   else
  160.                         {
  161.                                 BeepON;       
  162.                         }
  163.      
  164.                         thLastTimer = gizGetTimerCount();
  165.         }
  166. }
  167. int main(void)
  168. {
  169.     /* USER CODE BEGIN 1 */
  170.     /* USER CODE END 1 */
  171.     /* MCU Configuration----------------------------------------------------------*/
  172.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  173.     HAL_Init();
  174.     /* USER CODE BEGIN Init */
  175.     /* USER CODE END Init */
  176.     /* Configure the system clock */
  177.     SystemClock_Config();
  178.     /* USER CODE BEGIN SysInit */
  179.     /* USER CODE END SysInit */
  180.     /* Initialize all configured peripherals */
  181.     MX_GPIO_Init();
  182.     MX_TIM2_Init();
  183.                 MX_TIM3_Init();
  184.     MX_USART1_UART_Init();
  185.     MX_USART2_UART_Init();
  186.     /* Initialize interrupts */
  187.     MX_NVIC_Init();
  188.     /* USER CODE BEGIN 2 */
  189.     timerInit();
  190.     uartInit();
  191.           delay_init(72);  //初始化延迟函数   // 延时 初始化
  192.     userInit();
  193.     keyInit();
  194.     LED_GPIO_Init();
  195.     MY_ADC_Init();
  196.                 //Moter_GPIO_Init();
  197.                 gizwitsInit();
  198.     while(DS18B20_Init());
  199.                 Moter_GPIO_Init();
  200.     GIZWITS_LOG("MCU Init Success \n");
  201.     /* USER CODE END 2 */
  202.     TEMPOFF;OxOFF;
  203.     /* Infinite loop */
  204.     /* USER CODE BEGIN WHILE */
  205.                 delay_ms(520);
  206.        
  207.     while (1)
  208.     {
  209.                
  210.                         userHandle();         
  211.       gizwitsHandle((dataPoint_t *)&currentDataPoint);
  212.                           
  213.     }
  214.     /* USER CODE END 3 */
  215. }
  216. /** System Clock Configuration
  217. */
  218. void SystemClock_Config(void)
  219. {
  220.     RCC_OscInitTypeDef RCC_OscInitStruct;
  221.     RCC_ClkInitTypeDef RCC_ClkInitStruct;
  222.     /**Initializes the CPU, AHB and APB busses clocks
  223.     */
  224.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  225.     RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  226.     RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  227.     RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  228.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  229.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  230.     RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  231.     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  232.     {
  233.         _Error_Handler(__FILE__, __LINE__);
  234.     }
  235.     /**Initializes the CPU, AHB and APB busses clocks
  236.     */
  237.     RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  238.                                   |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  239.     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  240.     RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  241.     RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  242.     RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  243.     if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  244.     {
  245.         _Error_Handler(__FILE__, __LINE__);
  246.     }
  247.     /**Configure the Systick interrupt time
  248.     */
  249.     HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  250.     /**Configure the Systick
  251.     */
  252.     HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  253.     /* SysTick_IRQn interrupt configuration */
  254.     HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  255. }
  256. /** NVIC Configuration
  257. */
  258. static void MX_NVIC_Init(void)
  259. {
  260.     /* TIM2_IRQn interrupt configuration */
  261.     HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0);
  262.     HAL_NVIC_EnableIRQ(TIM2_IRQn);
  263.     /* USART2_IRQn interrupt configuration */
  264.     HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
  265.     HAL_NVIC_EnableIRQ(USART2_IRQn);
  266. }
  267. /* TIM2 init function */
  268. static void MX_TIM2_Init(void)
  269. {
  270.     TIM_ClockConfigTypeDef sClockSourceConfig;
  271.     TIM_MasterConfigTypeDef sMasterConfig;
  272.     htim2.Instance = TIM2;
  273.     htim2.Init.Prescaler = 7200-1;
  274.     htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  275.     htim2.Init.Period = 10-1;
  276.     htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  277.     htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  278.     if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  279.     {
  280.         _Error_Handler(__FILE__, __LINE__);
  281.     }
  282.     sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  283.     if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  284.     {
  285.         _Error_Handler(__FILE__, __LINE__);
  286.     }
  287.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  288.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  289.     if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  290.     {
  291.         _Error_Handler(__FILE__, __LINE__);
  292.     }
  293.                
  294. }
  295. /* TIM3 init function */
  296. static void MX_TIM3_Init(void)
  297. {
  298.     TIM_MasterConfigTypeDef sMasterConfig;
  299.     TIM_OC_InitTypeDef sConfigOC;
  300.     htim3.Instance = TIM3;
  301.     htim3.Init.Prescaler = 9;
  302.     htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  303.     htim3.Init.Period = 7199;
  304.     htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  305.     htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  306.     if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  307.     {
  308.         _Error_Handler(__FILE__, __LINE__);
  309.     }
  310.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  311.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  312.     if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  313.     {
  314.         _Error_Handler(__FILE__, __LINE__);
  315.     }
  316.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  317.     sConfigOC.Pulse = 0;
  318.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  319.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  320.     if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  321.     {
  322.         _Error_Handler(__FILE__, __LINE__);
  323.     }
  324.     sConfigOC.Pulse = 500;
  325.     if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  326.     {
  327.         _Error_Handler(__FILE__, __LINE__);
  328.     }
  329.     HAL_TIM_MspPostInit(&htim3);
  330. }
  331. /* USART1 init function */
  332. static void MX_USART1_UART_Init(void)
  333. {
  334.     huart1.Instance = USART1;
  335.     huart1.Init.BaudRate = 115200;
  336.     huart1.Init.WordLength = UART_WORDLENGTH_8B;
  337.     huart1.Init.StopBits = UART_STOPBITS_1;
  338.     huart1.Init.Parity = UART_PARITY_NONE;
  339.     huart1.Init.Mode = UART_MODE_TX_RX;
  340.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  341.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  342.     if (HAL_UART_Init(&huart1) != HAL_OK)
  343.     {
  344.         _Error_Handler(__FILE__, __LINE__);
  345.     }
  346. }
  347. /* USART2 init function */
  348. static void MX_USART2_UART_Init(void)
  349. {
  350.     huart2.Instance = USART2;
  351.     huart2.Init.BaudRate = 9600;
  352.     huart2.Init.WordLength = UART_WORDLENGTH_8B;
  353.     huart2.Init.StopBits = UART_STOPBITS_1;
  354.     huart2.Init.Parity = UART_PARITY_NONE;
  355.     huart2.Init.Mode = UART_MODE_TX_RX;
  356.     huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  357.     huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  358.     if (HAL_UART_Init(&huart2) != HAL_OK)
  359.     {
  360.         _Error_Handler(__FILE__, __LINE__);
  361.     }
  362. }
  363. /** Configure pins as
  364.         * Analog
  365.         * Input
  366.         * Output
  367.         * EVENT_OUT
  368.         * EXTI
  369. */
  370. static void MX_GPIO_Init(void)
  371. {
  372.     GPIO_InitTypeDef GPIO_InitStruct;
  373.     /* GPIO Ports Clock Enable */
  374.     __HAL_RCC_GPIOD_CLK_ENABLE();
  375.     __HAL_RCC_GPIOA_CLK_ENABLE();
  376.     __HAL_RCC_GPIOB_CLK_ENABLE();
  377.     __HAL_RCC_GPIOC_CLK_ENABLE();
  378.     /*Configure GPIO pin : KEY1_Pin */
  379.     GPIO_InitStruct.Pin = KEY1_Pin;
  380.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  381.     GPIO_InitStruct.Pull = GPIO_PULLUP; //修改成上拉
  382.     HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
  383.     /*Configure GPIO pin : KEY2_Pin */
  384.     GPIO_InitStruct.Pin = KEY2_Pin;
  385.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  386.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  387.     HAL_GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStruct);
  388.          /*Configure GPIO pin : GPRS_PWRON_Pin */ //IIC
  389.                 GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_5;
  390.                 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  391.                 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  392.                 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  393.                        
  394. //                GPIO_InitStruct.Pin = GPRS_PWRON_Pin;
  395. //                GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  396. //                GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  397. //                HAL_GPIO_Init(GPRS_PWRON_DIN_GPIO_Port, &GPIO_InitStruct);
  398. //                HAL_GPIO_WritePin(GPRS_PWRON_DIN_GPIO_Port, GPRS_PWRON_Pin, GPIO_PIN_RESET);
  399. }
  400. /* USER CODE BEGIN 4 */
  401. /* USER CODE END 4 */
  402. /**
  403.   * @brief  This function is executed in case of error occurrence.
  404.   * @param  None
  405.   * @retval None
  406.   */
  407. void _Error_Handler(char * file, int line)
  408. {
  409.     /* USER CODE BEGIN Error_Handler_Debug */
  410.     /* User can add his own implementation to report the HAL error return state */
  411.     while(1)
  412.     {
  413.     }
  414.     /* USER CODE END Error_Handler_Debug */
  415. }
  416. #ifdef USE_FULL_ASSERT
  417. /**
  418.    * @brief Reports the name of the source file and the source line number
  419.    * where the assert_param error has occurred.
  420.    * @param file: pointer to the source file name
  421.    * @param line: assert_param error line source number
  422.    * @retval None
  423.    */
  424. void assert_failed(uint8_t* file, uint32_t line)
  425. {
  426.     /* USER CODE BEGIN 6 */
  427.     /* User can add his own implementation to report the file name and line number,
  428.       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  429.     /* USER CODE END 6 */
  430. }
  431. #include "adc.h"
  432. #include "delay.h"
  433. #include "stm32f1xx_hal.h"
  434. //
  435. *****//完整资料
  436. //All rights reserved
  437. //
  438. ADC_HandleTypeDef ADC1_Handler;                //ADC句柄
  439. //初始化ADC
  440. //ch: ADC_channels
  441. //通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
  442. void MY_ADC_Init(void)
  443. {
  444.     RCC_PeriphCLKInitTypeDef ADC_CLKInit;
  445.     ADC_CLKInit.PeriphClockSelection=RCC_PERIPHCLK_ADC;                        //ADC外设时钟
  446.     ADC_CLKInit.AdcClockSelection=RCC_ADCPCLK2_DIV6;                        //分频因子6时钟为72M/6=12MHz
  447.     HAL_RCCEx_PeriphCLKConfig(&ADC_CLKInit);                                        //设置ADC时钟
  448.     ADC1_Handler.Instance=ADC1;
  449.     ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
  450.     ADC1_Handler.Init.ScanConvMode=DISABLE;                      //非扫描模式
  451.     ADC1_Handler.Init.ContinuousConvMode=DISABLE;                //关闭连续转换
  452.     ADC1_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1
  453.     ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
  454.     ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
  455.     ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
  456.     HAL_ADC_Init(&ADC1_Handler);                                 //初始化
  457.     HAL_ADCEx_Calibration_Start(&ADC1_Handler);                                         //校准ADC
  458. }
  459. //ADC底层驱动,引脚配置,时钟使能
  460. //此函数会被HAL_ADC_Init()调用
  461. //hadc:ADC句柄
  462. void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
  463. {
  464.     GPIO_InitTypeDef GPIO_Initure;
  465.     __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
  466.     __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
  467.     GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;            //PA1
  468.     GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
  469.     GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
  470.     HAL_GPIO_Init(GPIOA,&GPIO_Initure);
  471. }
  472. //获得ADC值
  473. //ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
  474. //返回值:转换结果
  475. uint16_t Get_Adc(uint32_t ch)
  476. {
  477.     ADC_ChannelConfTypeDef ADC1_ChanConf;
  478.     ADC1_ChanConf.Channel=ch;                                   //通道
  479.     ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
  480.     ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_239CYCLES_5;      //采样时间
  481.     HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
  482.     HAL_ADC_Start(&ADC1_Handler);                               //开启ADC
  483.     HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换
  484.     return (uint16_t)HAL_ADC_GetValue(&ADC1_Handler);                        //返回最近一次ADC1规则组的转换结果
  485. }
  486. //获取指定通道的转换值,取times次,然后平均
  487. //times:获取次数
  488. //返回值:通道ch的times次转换结果平均值
  489. uint16_t Get_Adc_Average(uint32_t ch,uint8_t times)
  490. {
  491.     uint32_t temp_val=0;
  492.     uint8_t t;
  493.     for(t=0; t<times; t++)
  494.     {
  495.         temp_val+=Get_Adc(ch);
  496.         delay_ms(5);
  497.     }
  498.     return temp_val/times;
  499. }
  500. #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、元件清单、实物图、演示视频等。具体内容如下,全网最全! !


点赞分享一起学习发展。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表