嵌入式基于 STM32 神舟 IV 号开发板的自动浇水系统课程设计报告

一、引言

本课程设计旨在设计一个基于 STM32 神舟 IV 号开发板的自动浇水系统。通过检测土壤湿度,当土壤湿度低于一定阈值时,系统自动浇水,保证植物的正常生长。

二、系统设计

  1. 系统硬件设计

    本系统使用 STM32 神舟 IV 号开发板作为硬件平台,开发板上包括 LED 指示灯、蜂鸣器和电位器。其中,LED 指示灯用于指示系统状态,蜂鸣器用于报警,电位器用于模拟土壤湿度。

  2. 系统软件设计

    本系统使用 C 语言进行编程,并使用 SZ_STM32F107VC_LIB 库进行硬件驱动。主要实现以下功能:

    • 初始化 LED 指示灯、蜂鸣器和串口 2;
    • 初始化 ADC 配置,用于读取电位器模拟信号;
    • 循环读取电位器模拟信号,计算湿度百分比和等效电压;
    • 当湿度低于一定阈值时,触发浇水操作,同时报警;
    • 浇水过程中,周期性打印电压值;
    • 系统每隔一定时间切换 LED 指示灯状态。

三、系统代码详细设计分析

  1. 主函数 main()

    主函数主要进行系统初始化,并进入主循环。在主循环中,首先切换 LED1 指示灯状态,然后读取电位器模拟信号,计算湿度百分比和等效电压。如果湿度低于阈值,触发浇水操作,并进行报警。报警结束后,根据电压值打印提示信息。最后,延迟一定时间后进入下一次循环。

    #include "SZ_STM32F107VC_LIB.h"
    
    /* Private typedef -----------------------------------------------------------*/
    /* Private define ------------------------------------------------------------*/
    /* Private macro -------------------------------------------------------------*/
    /* Private variables ---------------------------------------------------------*/
    /* Private function prototypes -----------------------------------------------*/
    void SysTick_Handler_User(void);
    
    /**-------------------------------------------------------
      * @函数名 main
      * @功能   主函数
      * @参数   无
      * @返回值 无
    ***------------------------------------------------------*/
    int main(void)
    {
        /*!< At this stage the microcontroller clock setting is already configured, 
             this is done through SystemInit() function which is called from startup
             file (startup_stm32f10x_xx.s) before to branch to application main.
             To reconfigure the default setting of SystemInit() function, refer to
             system_stm32f10x.c file
           */ 
        /*!< 在系统启动文件(startup_stm32f10x_xx.s)中已经调用SystemInit()初始化了时钟, 
             所以main函数不需要再次重复初始化时钟。默认初始化系统主时钟为72MHz。
             SystemInit()函数的实现位于system_stm32f10x.c文件中。
           */ 
    
        uint16_t ADCConvertedValueLocal, Precent = 0, Voltage = 0; 
        int count;
    
        /* 初始化板载LED指示灯 */
        SZ_STM32_LEDInit(LED1);
        SZ_STM32_LEDInit(LED2);
        SZ_STM32_LEDInit(LED3);
        SZ_STM32_LEDInit(LED4);
    
         /*初始化蜂鸣器 */
         SZ_STM32_BEEPInit();
    
        /* 注意串口2使用Printf时'SZ_STM32F107VC_LIB.c'文件中fputc定义中设备改为SZ_STM32_COM2 */
        /* 串口2初始化 */
        SZ_STM32_COMInit(COM2, 115200);
    
        printf("\n\r\n");
        printf("\n\r www.armjishu.com论坛后续还会有更多精彩的示例,欢迎访问论坛交流与学习."); 
        printf("\n\r 本示例为AD转换示例,串口输出转换结果,模拟信号来自板上的电位器! \n\r");
        printf("\n\r 开发板上的电位器VR1连接到了STM32的PC0,调节电位器观察串口输出的AD转换结果\n\r");
        printf("\n\r==============================================================================");
        printf("\n\r");
    
        SZ_STM32_ADC_Configuration();
    
        /* Infinite loop 主循环 */
        while (1)
        {
            /* LED1指示灯状态取反 */
            SZ_STM32_LEDToggle(LED1);
    
            ADCConvertedValueLocal = GetADCConvertedValue();
            Precent = (ADCConvertedValueLocal*100/0x1000);	//算出百分比
            Voltage = Precent*33;						  // 3.3V的电平,计算等效电平
    
            /* 电压低于2V,表示土壤湿度低,需要浇水 */
            if( Voltage <= 2000 )
             {
                 printf("\r\n电平小于2000,蜂鸣器报警响起,开始浇水\r\n");
        	     delay(16000000);
    
        	     /* 警报信号开启 */
        	     SZ_STM32_BEEPOn();
    
    		     /* 浇水次数的阈值 */
        	     count = 15; 
            	 while (1)
        	     {
                    printf("\r\n 正在浇水,电压值为:%d.%d%dV.\n\r ", Voltage/1000, (Voltage%1000)/100, (Voltage%100)/10);
        	     	ADCConvertedValueLocal = GetADCConvertedValue();
            		Precent = (ADCConvertedValueLocal*100/0x1000);	//算出百分比
            		Voltage = Precent*33;                           //3.3V的电平,计算等效电平,更新
    
        	        count--;                                       //浇水次数减一
    
        	        if( Voltage >2000 ) break;                    //此时电压大于2V
        	        if( count == 0 ) break;	                      //此时到达浇水次数上限
    
        	        delay(16000000);	
        	      }
    
        	   SZ_STM32_BEEPOff();
    
        	  if( Voltage >2000 )
        	      printf("电压高于2V,土壤湿度变高,浇水结束 \n");
        	  if( count== 0 )
        	      printf("浇水次数达到十五次,超时,浇水结束 \n");
        	   }
    
           printf("\r\n 当前AD转换结果为:0x%X, 百分比为:%d%%,电压值:%d.%d%dV.\n\r", 
           ADCConvertedValueLocal, Precent, Voltage/1000, (Voltage%1000)/100, (Voltage%100)/10);
    
            /* 延迟, 打印间隔 */
            delay(16000000); 
    
            /* 此处可以添加用户的程序 */
      	}
    }
    
    /**-------------------------------------------------------
      * @函数名 SysTick_Handler_User
      * @功能   系统节拍定时器服务请求用户处理函数
      * @参数   无
      * @返回值 无
    ***------------------------------------------------------*/
    void SysTick_Handler_User(void)
    {
        static uint32_t TimeIncrease = 0;
    
        if((TimeIncrease%100) == 0)
        {
            if((TimeIncrease%2000) == 0) //每2秒亮100毫秒
            {
                LED4OBB = 0;
            }
            else
            {
                LED4OBB = 1;
            }
        }
        TimeIncrease++;
    
    }
    
  2. SysTick_Handler_User() 函数

    该函数是系统节拍定时器服务请求的用户处理函数。在该函数中,通过判断时间的增加次数,控制 LED4 指示灯的亮灭,实现系统状态的显示。

四、总结

本课程设计基于 STM32 神舟 IV 号开发板,实现了一个简单的自动浇水系统。通过检测土壤湿度,并根据阈值判断是否需要浇水,实现了自动浇水的功能。通过 LED 指示灯和蜂鸣器的使用,可以实时显示系统状态和报警。本系统具有简单、可靠的特点,适用于小型植物的自动浇水。


原文地址: http://www.cveoy.top/t/topic/pFra 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录