嵌入式自动浇水系统课程设计报告

一、设计背景和目的

随着城市化进程的加快,人们对农业的需求也不断增加。然而,由于人力资源的短缺和成本的提高,传统的农业种植方式已经无法满足市场需求。因此,自动浇水系统的设计和应用成为了一种解决方案。本课程设计的目的是设计一个基于STM32神舟Ⅳ号开发板的自动浇水系统,实现对植物的自动浇水。

二、系统框架图

本系统主要由以下几个模块组成:

  1. STM32开发板:作为系统的主控制器,负责控制各个外设和执行控制算法。
  2. 电位器:通过调节电位器来模拟土壤湿度。
  3. AD转换模块:将电位器输出的模拟信号转换为数字信号,供STM32开发板处理。
  4. LED指示灯:用于显示系统状态。
  5. 蜂鸣器:用于报警信号。
  6. 电磁阀:用于控制水流。

三、系统设计

1. 硬件设计

本系统的硬件设计主要包括STM32开发板的外设连接和电路设计。具体连接方式如下:

  • 将电位器的输出连接到STM32开发板的PC0引脚,通过AD转换模块进行模拟信号转换。
  • 将LED指示灯和蜂鸣器连接到STM32开发板的相应引脚,用于显示系统状态和报警。
  • 将电磁阀连接到STM32开发板的相应引脚,用于控制水流。

2. 软件设计

本系统的软件设计主要包括STM32开发板的程序编写和算法设计。具体步骤如下:

  • 配置系统时钟和外设初始化:在main函数中调用相关函数对系统时钟和外设进行初始化。
  • 设置串口通信:通过串口将系统的状态和测量结果输出到终端,方便用户观察。
  • 配置AD转换模块:通过AD转换模块将电位器输出的模拟信号转换为数字信号。
  • 设计自动浇水算法:根据测量结果判断土壤湿度是否达到浇水条件,如果需要浇水,则控制电磁阀开启,同时开启蜂鸣器进行报警。如果不需要浇水,则关闭电磁阀和蜂鸣器。
  • 实现定时浇水功能:使用系统节拍定时器,在规定的时间间隔内进行浇水操作。
  • 设计系统节拍定时器服务请求用户处理函数:在该函数中实现定时浇水功能,同时控制LED指示灯的闪烁。

四、实验结果和分析

通过实验,我们可以观察到以下结果:

  • 当土壤湿度低于2V时,系统会启动浇水操作,同时蜂鸣器会报警。
  • 当土壤湿度高于2V时,系统会停止浇水操作,同时蜂鸣器停止报警。
  • 通过串口输出,我们可以实时观察到土壤湿度的测量结果和系统的状态。

五、总结和展望

本课程设计实现了基于STM32神舟Ⅳ号开发板的自动浇水系统,通过AD转换模块对土壤湿度进行测量,并根据测量结果实现自动控制浇水操作。该系统能够有效地提高农业的生产效率,减少人力资源的浪费。在未来的工作中,可以进一步优化系统的稳定性和可靠性,同时增加其他功能,如温度和光照度的测量,以实现更加智能化的农业种植。

代码示例

#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('

');
    printf('

 www.armjishu.com论坛后续还会有更多精彩的示例,欢迎访问论坛交流与学习.'); 
    printf('

 本示例为AD转换示例,串口输出转换结果,模拟信号来自板上的电位器! 

');
    printf('

 开发板上的电位器VR1连接到了STM32的PC0,调节电位器观察串口输出的AD转换结果

');
    printf('

==============================================================================');
    printf('

');
  
    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('
电平小于2000,蜂鸣器报警响起,开始浇水
');
	         delay(16000000);

	         /* 警报信号开启 */
	         SZ_STM32_BEEPOn();

			 /* 浇水次数的阈值 */
	        count = 15; 
        	while (1)
	         {
                printf('
 正在浇水,电压值为:%d.%d%dV.

 ', 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,土壤湿度变高,浇水结束 
');
	  if( count== 0 )
	      printf('浇水次数达到十五次,超时,浇水结束 
');
	   }

       printf('
 当前AD转换结果为:0x%X, 百分比为:%d%%,电压值:%d.%d%dV.

', 
       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++;
    
}


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

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