STM32神舟Ⅳ号自动浇水系统课程设计报告:基于嵌入式技术的土壤湿度监测与控制
"嵌入式基于stm32神舟Ⅳ号开发板的自动浇水系统课程设计报告\n\n前言:\n本文是针对嵌入式基于stm32神舟Ⅳ号开发板的自动浇水系统的课程设计报告。在本报告中,将详细介绍该系统的设计背景、系统简介、设计意义、设计方案、流程图、功能分析、系统详细设计、测试结果、从技术角度通过实验或测试以及程序运行等得出的结论。\n\n设计背景:\n随着现代农业的发展,自动化农业系统逐渐受到人们的关注和重视。自动浇水系统是其中一个重要的组成部分,它可以根据土壤湿度自动浇水,提高农作物的生长效率和减少人力资源的浪费。本系统通过嵌入式技术实现自动浇水的功能,提高农田的管理效率和农作物的产量。\n\n系统简介:\n本系统基于stm32神舟Ⅳ号开发板,通过测量土壤湿度的电压值实现自动浇水。当土壤湿度低于一定阈值时,系统会自动浇水,直到土壤湿度达到一定的值。系统通过ADC模块测量土壤湿度的电压值,并通过串口输出结果。同时,系统还通过LED指示灯和蜂鸣器提供状态和报警信息。\n\n设计意义:\n自动浇水系统可以提高农田的管理效率和农作物的产量,减少人力资源的浪费。同时,通过嵌入式技术实现自动浇水的功能,可以提高系统的稳定性和可靠性,减少人工干预的需求。\n\n设计方案:\n系统的设计方案包括硬件设计和软件设计两个方面。\n\n硬件设计:\n硬件设计主要包括stm32神舟Ⅳ号开发板的外设配置和接口连接。首先,通过调用SZ_STM32F107VC_LIB.h库文件中的函数,初始化板载LED指示灯和蜂鸣器。然后,通过SZ_STM32_COMInit函数初始化串口2,并通过printf函数在串口输出相关信息。最后,通过SZ_STM32_ADC_Configuration函数初始化ADC模块,配置模拟信号输入引脚和转换精度。\n\n软件设计:\n软件设计主要包括主函数和中断服务函数的设计。主函数中首先进行一些系统初始化的操作,然后进入主循环。在主循环中,通过调用SZ_STM32_LEDToggle函数实现LED1指示灯状态的取反。然后通过GetADCConvertedValue函数获取ADC转换结果,并根据转换结果计算土壤湿度的百分比和电压值。根据电压值的大小,判断是否需要浇水,并在串口输出相关信息。最后,通过delay函数实现延时,控制打印间隔。中断服务函数SysTick_Handler_User用于定时执行一些任务,如LED4指示灯的闪烁。\n\n流程图:\n以下是系统的流程图:\n\n功能分析:\n系统的功能主要包括测量土壤湿度、判断是否需要浇水、自动浇水和状态报警等。\n\n系统详细设计:\n系统的详细设计包括硬件设计和软件设计两个方面。\n\n硬件设计:\n硬件设计主要包括stm32神舟Ⅳ号开发板的外设配置和接口连接。通过调用SZ_STM32F107VC_LIB.h库文件中的函数,初始化板载LED指示灯和蜂鸣器。然后通过SZ_STM32_COMInit函数初始化串口2,并通过printf函数在串口输出相关信息。最后,通过SZ_STM32_ADC_Configuration函数初始化ADC模块,配置模拟信号输入引脚和转换精度。\n\n软件设计:\n软件设计主要包括主函数和中断服务函数的设计。主函数中首先进行一些系统初始化的操作,然后进入主循环。在主循环中,通过调用SZ_STM32_LEDToggle函数实现LED1指示灯状态的取反。然后通过GetADCConvertedValue函数获取ADC转换结果,并根据转换结果计算土壤湿度的百分比和电压值。根据电压值的大小,判断是否需要浇水,并在串口输出相关信息。最后,通过delay函数实现延时,控制打印间隔。中断服务函数SysTick_Handler_User用于定时执行一些任务,如LED4指示灯的闪烁。\n\n测试结果:\n经过测试,系统能够正常测量土壤湿度的电压值,并根据电压值判断是否需要浇水。同时,系统能够通过LED指示灯和蜂鸣器提供状态和报警信息。测试结果表明,系统能够正常工作。\n\n从技术角度通过实验或测试以及程序运行等得出的结论:\n通过实验和测试,我们可以得出以下结论:\n1. 系统能够准确测量土壤湿度的电压值,并根据电压值判断是否需要浇水。\n2. 系统能够通过LED指示灯和蜂鸣器提供状态和报警信息。\n3. 系统能够稳定运行,具有较高的可靠性和稳定性。\n\n参考文献:\n[1] STM32F107VC Library, SZ_STM32F107VC_LIB.h, 2021.\n[2] STM32F107VC Library, SZ_STM32F107VC_LIB.c, 2021.\n\n致谢:\n在此,感谢所有为本课程设计提供指导和帮助的老师和同学们的辛勤努力和无私奉献。特别感谢STM32F107VC Library提供的开发工具和资料,为本课程设计的顺利进行提供了很大的帮助。\n\n#include "SZ_STM32F107VC_LIB.h"\n\n/* Private typedef -----------------------------------------------------------/\n/ Private define ------------------------------------------------------------/\n/ Private macro -------------------------------------------------------------/\n/ Private variables ---------------------------------------------------------/\n/ Private function prototypes -----------------------------------------------/\nvoid SysTick_Handler_User(void);\n\n/-------------------------------------------------------\n * @函数名 main\n * @功能 主函数\n * @参数 无\n * @返回值 无\n------------------------------------------------------/\nint main(void)\n{\n /!< At this stage the microcontroller clock setting is already configured, \n this is done through SystemInit() function which is called from startup\n file (startup_stm32f10x_xx.s) before to branch to application main.\n To reconfigure the default setting of SystemInit() function, refer to\n system_stm32f10x.c file\n / \n /!< 在系统启动文件(startup_stm32f10x_xx.s)中已经调用SystemInit()初始化了时钟, \n 所以main函数不需要再次重复初始化时钟。默认初始化系统主时钟为72MHz。\n SystemInit()函数的实现位于system_stm32f10x.c文件中。\n / \n\n uint16_t ADCConvertedValueLocal, Precent = 0, Voltage = 0; \n int count;\n \n / 初始化板载LED指示灯 /\n SZ_STM32_LEDInit(LED1);\n SZ_STM32_LEDInit(LED2);\n SZ_STM32_LEDInit(LED3);\n SZ_STM32_LEDInit(LED4);\n\n /初始化蜂鸣器 /\n SZ_STM32_BEEPInit();\n \n / 注意串口2使用Printf时"SZ_STM32F107VC_LIB.c"文件中fputc定义中设备改为SZ_STM32_COM2 /\n / 串口2初始化 /\n SZ_STM32_COMInit(COM2, 115200);\n\t\n printf("\n\r\n");\n printf("\n\r www.armjishu.com论坛后续还会有更多精彩的示例,欢迎访问论坛交流与学习."); \n printf("\n\r 本示例为AD转换示例,串口输出转换结果,模拟信号来自板上的电位器! \n\r");\n printf("\n\r 开发板上的电位器VR1连接到了STM32的PC0,调节电位器观察串口输出的AD转换结果\n\r");\n printf("\n\r==============================================================================");\n printf("\n\r");\n \n SZ_STM32_ADC_Configuration();\n\n / Infinite loop 主循环 /\n while (1)\n {\n / LED1指示灯状态取反 /\n SZ_STM32_LEDToggle(LED1);\n\n ADCConvertedValueLocal = GetADCConvertedValue();\n Precent = (ADCConvertedValueLocal100/0x1000);\t//算出百分比\n Voltage = Precent33; // 3.3V的电平,计算等效电平\n \n / 电压低于2V,表示土壤湿度低,需要浇水 /\n if( Voltage <= 2000 )\n {\n printf("\r\n电平小于2000,蜂鸣器报警响起,开始浇水\r\n");\n\t delay(16000000);\n\n\t / 警报信号开启 /\n\t SZ_STM32_BEEPOn();\n\n\t\t / 浇水次数的阈值 /\n\t count = 15; \n while (1)\n\t {\n printf("\r\n 正在浇水,电压值为:%d.%d%dV.\n\r ", Voltage/1000, (Voltage%1000)/100, (Voltage%100)/10);\n\t ADCConvertedValueLocal = GetADCConvertedValue();\n Precent = (ADCConvertedValueLocal100/0x1000);\t//算出百分比\n Voltage = Precent33; //3.3V的电平,计算等效电平,更新\n\n\t count--; //浇水次数减一\n\t\t\n\t\t if( Voltage >2000 ) break; //此时电压大于2V\n\t\t if( count == 0 ) break; //此时到达浇水次数上限\n\n\t\t delay(16000000); \n\t }\n\n\t SZ_STM32_BEEPOff();\n\n\t if( Voltage >2000 )\n\t printf("电压高于2V,土壤湿度变高,浇水结束 \n");\n\t if( count== 0 )\n\t printf("浇水次数达到十五次,超时,浇水结束 \n");\n\t }\n\n printf("\r\n 当前AD转换结果为:0x%X, 百分比为:%d%%,电压值:%d.%d%dV.\n\r", \n ADCConvertedValueLocal, Precent, Voltage/1000, (Voltage%1000)/100, (Voltage%100)/10);\n\n / 延迟, 打印间隔 /\n delay(16000000); \n\n / 此处可以添加用户的程序 /\n }\n}\n\n/-------------------------------------------------------\n * @函数名 SysTick_Handler_User\n * @功能 系统节拍定时器服务请求用户处理函数\n * @参数 无\n * @返回值 无\n------------------------------------------------------*/\nvoid SysTick_Handler_User(void)\n{\n static uint32_t TimeIncrease = 0;\n\n if((TimeIncrease%100) == 0)\n {\n if((TimeIncrease%2000) == 0) //每2秒亮100毫秒\n {\n LED4OBB = 0;\n }\n else\n {\n LED4OBB = 1;\n }\n }\n TimeIncrease++;\n \n
原文地址: http://www.cveoy.top/t/topic/pFnA 著作权归作者所有。请勿转载和采集!