STM32神舟Ⅳ号开发板自动浇水系统课程设计报告 - 基于AD转换的土壤湿度监测
嵌入式自动浇水系统课程设计报告
一、设计背景和目的
随着城市化进程的加快,人们对农业的需求也不断增加。然而,由于人力资源的短缺和成本的提高,传统的农业种植方式已经无法满足市场需求。因此,自动浇水系统的设计和应用成为了一种解决方案。本课程设计的目的是设计一个基于STM32神舟Ⅳ号开发板的自动浇水系统,实现对植物的自动浇水。
二、系统框架图
本系统主要由以下几个模块组成:
- STM32开发板:作为系统的主控制器,负责控制各个外设和执行控制算法。
- 电位器:通过调节电位器来模拟土壤湿度。
- AD转换模块:将电位器输出的模拟信号转换为数字信号,供STM32开发板处理。
- LED指示灯:用于显示系统状态。
- 蜂鸣器:用于报警信号。
- 电磁阀:用于控制水流。
三、系统设计
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 著作权归作者所有。请勿转载和采集!