基于STM32的智能盆栽培育系统设计

文章目录

  • 主要介绍
  • 一、系统主要功能
  • 二、 方案设计要求及目标
  • 总体设计方案的选择
  • 三、硬件整体结构设计
  • 程序
  • 电路原理图:
  • 四、结论
  • 目录

  • 主要介绍

      本设计主要基于STM32F103RCT6单片机处理器,由主控部分、传感器部分、无线接收部分、显示模块组成。将传感器放在盆栽合适的位置,来检测盆栽生长环境参数,检测参数有光照强度、土壤温湿度、空气温湿度,采集到的数据经过处理器再次显示,通过ZigBee模块进行传输来实现无线通讯,主从分离的控制模式便于用户查看相关信息。将环境参数在OLED上显示出来,判断是否需要浇水,环境条件是否适合生长。同时还能把数据通过蓝牙传送到手机APP上,并且判断盆栽的需水量。若盆栽处于缺水状态时,手机可以反向控制主从机,发送浇水指令。
    本设计与传统的盆栽浇水系统相比,它可以根据土壤水分的大小,自动实现浇水功能,当室内其他环境因素不符合植物生长条件时,会在与系统相连的手机上进行提醒。

    关键词:STM32,反向控制,蓝牙通讯,温度传感器

    一、系统主要功能

      基于ZigBee技术的智能盆栽助长系统以STM32F103RCT6为控制核心,主要包括光照传感器、土壤温度传感器、土壤湿度传感器、空气温度传感器、空气湿度传感器等主要五大部分,五大模块搭建起整个传感器层[4],然后对采集的数据进行分析处理,实现智能盆栽系统的自动浇水功能和报警功能。

    二、 方案设计要求及目标

      在本设计的硬件方面,将STM32F103RCT6单片机作为核心控制芯片,通过ADC模数转换器将传感器获取到的数据进行转换并显示出来;传感器部分主要由光照传感器、将这些参数进行数据采。然后依靠ZigBee模块,利用其无线通信传输的特性,将数据传输到OLED上,直接将数据呈现给用户,这种传输方式,不但可以减少多个盆栽之间的布线,还增加了美观性。考虑到OLED屏幕尺寸较小,还可以通过蓝牙将数据传输到手机上,方便用户实时监测。

    总体设计方案的选择

    在市场上,智能盆栽产品种类很多,但共性的都会对土壤的温湿度、空气的温湿度、光照强度进行检测。以这个思路为蓝图,在本设计中加入了这些元素;为了在批量使用时节约成本,采用主从机的模式进行设计,而且考虑到布线的多种不便,在主从机之间使用无线传输的方式;考虑到智能手机使用的广泛性,在设计中会加入APP这一元素,提高在管理上的便捷性。

    三、硬件整体结构设计

      
    本系统一共分为两大部分:主机部分、从机部分。
    主机部分:ZigBee通讯模块用于主机与从机之间的通讯,主机的ZigBee负责接收从机发送上来的数据,STM32F103RCT6通过USART串口功能获取到这部分数据。STM32F103RCT6将数据处理后再利用自带的IIC接口与OLED进行通讯,将盆栽的生长环境信息在屏幕上显示出来;按键模块:通过按键还可实现手动浇水功能,并且还可根据盆栽植物不同,手动设置自动浇水的阀值,提高了设计的应用范围; 为了能够方便快捷的记录数据,可以通过蓝牙模块上传到手机APP上。
    从机部分:从机上也有一个控制芯片,用于对采集到的数据进行处理,土壤湿度传感器用于检测土壤中水分含量,实时将土壤湿度数据发送给STM32F103RCT6,当检测的湿度小于花卉生长要求湿度时,闭合继电器,启动微型抽水泵抽水浇花,若达到标准则停止浇花;土壤温度传感器用于检测花卉根部土壤的温度,不符合生长要求时,发出警报;空气温湿度传感器检测大气环境温湿度,当周围环境温度或者湿度低于花卉生长要求时发出警报;光照强度传感器对人工照射的强度进行监测,保证花卉的生长需求;从机上的ZigBee负责把采集上来的光照强度、土壤温湿度、空气温湿度数据传输到主机上的接收端,完成整个系统的信息传输任务[8]。

    图3-1 整体结构框图

    程序

    单片机程序全部源码:
    #include "delay.h"
    #include "sys.h"
    #include "oled.h"
    #include "usart.h"
    #include "stdlib.h"
    u16 RXD_buf;
    u8 temperature;
    u8 humidity;
    u8 t1;
    u8 t2;
    u8 j;
    u8 result_lx;
    int main(void)
    {		    
    delay_init();	    	 //延时函数初始化	
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200);	 	//串口初始化为115200
    OLED_Init();			//初始化OLED  
    OLED_Clear();
    OLED_ShowString(0,2,"SOTEM:  .",16);
    OLED_ShowString(0,4,"SOHUM:  ",16);
    OLED_ShowString(0,6,"ARH:  %",16);
    OLED_ShowString(60,6,"ART:  ",16);
    OLED_ShowString(0,0,"LIGHT:  ",16);	
    while(1) 
    {		
    if(USART_RX_STA&0x8000)
    {
    temperature=(USART_RX_BUF[0]-0x30)*10+(USART_RX_BUF[1]-0x30);
    humidity=(USART_RX_BUF[3]-0x30)*10+(USART_RX_BUF[4]-0x30);
    t1=(USART_RX_BUF[6]-0x30)*10+(USART_RX_BUF[7]-0x30);
    t2=(USART_RX_BUF[9]-0x30);
    j=(USART_RX_BUF[11]-0x30)*10+(USART_RX_BUF[12]-0x30);
    result_lx=(USART_RX_BUF[14]-0x30)*100+(USART_RX_BUF[15]-0x30)*10+(USART_RX_BUF[16]-0x30);
    while((USART1->SR&0X40)==0);
    USART_RX_STA=0;
    }
    OLED_ShowNum(47,2,t1,2,16);
    OLED_ShowNum(69,2,t2,1,16);
    OLED_ShowNum(92,6,temperature,2,16);
    OLED_ShowNum(32,6,humidity,2,16);
    OLED_ShowNum(47,0,result_lx,3,16);
    OLED_ShowNum(47,4,j,2,16);
    //			printf("airtem = %d\r\n",temperature);//空气温度
    //			printf("airhum = %d\r\n",humidity);	//空气湿度
    //			printf("soiltem = %d\r\n",temp);    //土壤温度
    }	  
    
    }
    #include "delay.h"
    #include "sys.h"
    #include "usart.h"
    #include "dht11.h"
    #include "ds18b20.h"
    #include "stdlib.h"
    #include "BH1750.h"
    #include "ADC.h"
    extern float result_lx;
    int main(void)
    {		    
    u8 temperature;  	    
    u8 humidity; 
    u16 j; 
    short temp;
    delay_init();	    	 //延时函数初始化	
    Adc_Init();	
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200);	 	//串口初始化为115200
    Init_BH1750();
    while(DHT11_Init())	//DHT11初始化	
    {
    
    }	
    while(DS18B20_Init())	//DS18B20初始化	
    {
    
    }	
    while(1) 
    {			
    temp=DS18B20_Get_Temp();	
    Start_BH1750();
    delay_ms(180);
    Read_BH1750();
    Convert_BH1750();
    j=Get_Humidity();
    DHT11_Read_Data(&temperature,&humidity);	//读取温湿度值	
    //			OLED_ShowNum(47,2,temp/10,2,16);
    //		  OLED_ShowNum(69,2,temp%10,1,16);
    //			OLED_ShowNum(92,6,temperature,2,16);
    //		  OLED_ShowNum(32,6,humidity,2,16);
    //		  OLED_ShowNum(47,0,result_lx,2,16);
    //		  OLED_ShowNum(47,4,j,2,16);
    printf("%d %d %d %d %d %d\r\n",temperature,humidity,temp/10,temp%10,j,(int)result_lx);//空气温度
    //			printf("airhum = %d\r\n",humidity);	//空气湿度
    //			printf("soiltem = %d\r\n",temp);    //土壤温度
    //			printf("soiltum = %d\r\n",j);    //土壤湿度	
    //			printf("light = %f\r\n",result_lx);    //光照强度
    if(j<=50)
    {
    GPIO_SetBits(GPIOB,GPIO_Pin_5);    //输出1
    }
    if(j>50)
    {
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);    //输出0
    }
    }	  
    
    }
    
    
    

    电路原理图:


    四、结论

      本次毕业设计基于STM32F103RCT6单片机,主要分为主机部分和从机部分,在从机部分分别通过光照传感器,土壤温度传感器、土壤湿度传感器、空气温湿度传感器五大模块搭建起整个传感器层,对盆栽生长环境的检测[56],然后对采集的数据进行分析处理,实现智能盆栽系统的自动浇水功能和报警功能,以达到对盆栽生长的合理栽培。ZigBee模块将采集到的环境数据打包传输给主机。
    在主机上的ZigBee模块将数据接收,然后通过串口发送给STM32F103RCT6单片机,单片机在串口接收数据缓存区中将数据读取出来[57],微控制器对数据进行进一步处理,运用IIC通讯协议,把数据显示在OLED屏幕上,同时对土壤湿度数值进行判断,如需浇水,再将浇水信号通过ZigBee发送回从机,控制继电器间接控制灌溉系统。在主机中还会将数据通过配置好的蓝牙模块传输到手机APP,这样用户就可以在室内随时随地的对盆栽进行环境参数查看。
    在本次设计中运用了ADC采集技术,将土壤湿度传感器采集的电压值通过ADC采集转换,得到所需的湿度值;在通讯上使用IIC协议,通过时钟线和数据线对数据进行传输。

    目录

    目 录
    第1章 绪 论 1
    1.1 智能盆栽的研发意义 1
    1.2 国内外发展趋势 2
    1.3 可行性分析 3
    1.4 主要内容 3
    第2章 智能盆栽的方案选择与比较 5
    2.1 方案设计要求及目标 5
    2.2 方案的选择 5
    第3章 硬件电路设计 9
    3.1 硬件整体结构设计 9
    3.2 STM32最小系统的硬件设计 10
    3.3空气温湿度传感器模块的硬件设计 12
    3.4 光照传感器模块的硬件设计 13
    3.5 土壤湿度传感器模块的硬件设计 14
    3.6 土壤温度传感器模块的硬件设计 15
    3.7 OLED模块的硬件设计 17
    3.8 ZigBee通讯模块硬件设计 18
    第4章 智能盆栽的软件设计 20
    4.1 软件主程序流程图 20
    4.2 读取光线强度子程序 21
    4.3 读取土壤温度子程序 23
    4.4 读取空气温湿度子程序 27
    4.5 OLED显示子程序 30
    4.6 ZigBee通讯子程序 32
    第5章 系统测试 34
    结 论 38
    参考文献 39
    致 谢 41
    附录1:系统总体电路 42

    作者:启初科技

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于STM32的智能盆栽培育系统设计

    发表评论