基于STM32的智能温室大棚控制系统设计
摘要
植物生长讲究适时、适地,也就是对生长环境温度、湿度、光照强度以及土壤条件的需求比较严格,只有给予了植物合适的生长环境,才会有理想的收获,尤其是人工控制生长环境的温室大棚植物,大棚内的温湿度和土壤的温湿度监控对植物的生长至关重要。
本设计以STM32F103C8T6单片机为主控制器,通过温湿度、土壤湿度、光照强度、CO2浓度等传感器和舵机、加热片、风扇、按键等模块实现对温室大棚内环境的检测和控制,OLED(0.96寸)显示各种控制参数,并且通过WiFi模块接入阿里云平台实现温室大棚环境远程的控制与检测。
实验结果表明:该系统实现了对温室大棚内环境的智能检测和控制,传感器采集的环境数据误差较小,采集的温湿度、CO2浓度、光照强度等数据准确度高达99%,舵机、加热片、风扇等控制效果明显,具有很强的安全性和可靠性,且设备成本低同时节省人力物力,提高劳动生产率。
【关键词】:温室大棚,STM32,传感器,WiFi模块
1 绪论
1.1 论文的研究目的和意义
随着社会的不断进步以及人们生活水平的不断提升,人们的饮食结构在发生着日新月异的变化,同时人们对于食物的要求标准也在不断提高。这点也在蔬菜需求方面体现,人们不再满足于种类较少的当季蔬菜,对于蔬菜种类的丰富和质量的提升提出了更高的需求。这就要求农业生产不仅要提高蔬菜的供应力度,还要确保市场蔬菜供应的质量和种类,以满足提高人们日益增高的生活标准。而温室大棚是解决这一问题的成熟方案,它作为一种基础的农业设施,可以通过适当的调节温湿度、二氧化碳浓度以及光照强度等这些影响作物生长的关键环境因素来实现作物的优质高产。同时为农作物提供了反季节生长环境以及最适宜农作物生长的人工环境,使蔬菜的生长不受周围环境变化和整体气候变化的影响,可以提供及时的反季节蔬菜来满足市场需求[1]。并且温室里配置的诸多防虫害设使农药的使用频率大幅度降低,保证了蔬菜更加的安全环保,提升了蔬菜的整体质量。但是传统的温室大棚普遍存在自动化程度不高和设备环境调控能力差等问题,温室的监控检测和控制调节大都主要依靠人工来实现,而人力方式则使偏差和疏漏有时难以避免,从而可能导致严重的后果。因此,需要釆用电子技术、控制技术和计算机技术等现代化先进技术与农业知识相结合,提升温室大棚的自动化和智能化,通过实现温室大棚的智能控制来更加科学解决此问题[2]。
从农业生产的角度来看,农业关系着中国这个农业大国的国计民生,用不足世界7%的耕地供养着超出世界22%的人口,社会的稳定发展与农业关系密切。因此农业问题在我国的国民经济发展中一直占据相当重要的地位。但是在城市化以及工业化的不断影响下,耕地资源的污染浪费问题不断加剧。我国耕地资源逐渐缺失的状况日益明显,与此形成鲜明对比的是,我国人口数量的不断增加,人们对于农业以及农产品的需求给农业发展带来了更大的压力和负担。因此怎样通过科学技术来促进农业的快速发展一直是重要研究课题[3]。
随着科技的发展,人们发现影响蔬菜等农作物生长的主要因素包括水份、温湿度以及光照条件、施肥、通风等等,而且在不同的生长阶段对这些因素的要求也各有不同。因此,普通的露天自然种植受到四季变换的影响很大,从而造成间断性的蔬菜紧缺现象。目前为了改变这一状况,现代科学中切实可行的研究方向主要集中在以下两个:(1)利用生物技术,给传统的蔬菜植入抗寒和抗旱的基因,使其适应严寒干燥的环境;(2)利用科学技术等手段改变蔬菜生长的周围环境,模拟出适合蔬菜生长的环境,例如玻璃温室、塑料大棚等。在我国现阶段的重要手段就是通过农业温室大棚来进行种植,温室大棚可以在有限的资金投入下,方便的改善农业大棚中环境因素,从而缩短农作物的生长周期,促进农作物增产增收。
八十年代开始,我国就已经开始向以色列等先进的农业强国学习建设人工模拟的蔬菜种植环境,比如玻璃温室种植等,还引进了玻璃温室种植的蔬菜种子。其中藁城现代农业观光园蔬菜生产基地是目前国内现代温室大棚的典型代表,在总体超过 3000 公顷的规模中,不仅有约 2700 公顷的塑料大棚,而且还有 300 公顷的玻璃温室[4]。近年的实际状况表明,藁城农业园的蔬菜产品已经可以很好的摆脱自然环境的限制,能够常年为市场提供不同品种的蔬菜以满足人们的需求。
目前,虽然我国温室种植有了很大发展,但和其他农业强国相比还有许多不足之处。温室种植的投入大,因此造成其蔬菜的市场价格居高不下,我国的大部分普通群众难以接受;另外,生产出来的蔬菜质量也和其他国家有一定的差距。随着科学技术的发展和发达农业国家成功的种植经验,可以发现“农业现代化已经成为未来农业发展的必然趋势”。目前我国的温室气候人工控制的智能系统还主要依赖于从发达的农业国家引进,甚至还有很大一部分地区并没有这一系统。虽然国内也存在一些专注于温室智能种植研究的企业和机构,但因其推出的设施昂贵,很难被大规模采用。温室大棚智能控制系统的研究涉及到诸多的技术和学科,主要有智能控制、传感器技术、数据通讯、计算机应用技术、环境科学和生物科学等等。目前,对温室大棚智能控制系统还仅仅处于实验阶段,其中可以实现高度智能化控制并且功能完善的成套设备,在薄膜温室的实际生产应用的并不多见。所以,研发一套适合我国国情的、多产、经济、环保的智能温室控制系统对我国的农业发展有着非常大的意义[5]。
1.2 智能温室大棚国内外研究现状
1.2.1 智能温室大棚国外研究现状
随着科学技术的发展,计算机和自动控制技术被大量广泛应用到农业种植生产过程中。自上世纪,能源危机成为世界各国关注的热点后,欧美等发达国家便把研究方向的重点转移到了设施农业环境的优化方面,以此希望实现低投入、高产出的效果。
在温室种植控制管理体系中,美国是第一个将计算机技术应用到其中。经过几十年的科技发展和技术改善,其已经具备了十分先进的温室栽培和环境因素控制技术。早在 1949 年,美国就在位于加利福尼亚的帕萨迪纳研究中心建造了世界上第一个“人工气候室”。该系统通过对现场温度值的采集、显示、记录和控制等实现了温度监测和对温室的控制。这个温室系统在全美的推广使现代科技农业精细种植的概念开始被各国注意。目前,以色列、荷兰、美国等国家都大力的推进“温室集约化生产”,实现温度、湿度、水、光照、二氧化碳等根据实际情况进行自动控制,达到无人值守的自动化控制水平[6]。
20 世纪 60 年代开始,现代温室农业在日本进入发展的快车道,发展趋势是由单栋向连栋的大型化、结构化、金属化发展。日本研制的温室大棚无论是生产方面还是管理方面都是高程度的自动化。1978 年日本实现了以微机控制器为核心的温室大棚综合环境参数控制系统。农作物的种类和生长发育阶段的不同导致它所需要的环境条件也有差异,而日本通过计算机控制技术,实现精确分析和综合控制,主控变量设定为光照条件,在此基础上调节温度、湿度和浓度,使这四个主要环境参数相互协调最终达到适合作物生长的最佳条件。
在英国,西尔索农业工程研究院的科学家们的研究方向是生物生长与温度湿度等环境参数的关系和控制。英国对于温室的计算机遥控技术控制十分重视,其研制的温室计算机遥控技术,能够对温室大棚内的环境参数进行观测和遥控控制,特点是控制距离远,可达到五十公里以上[7]。
近年以来,温室农业在以色列的发展也如火如荼,以色列的科学家研发了一系列的计算机软硬件用于温室控制,具有高自动化特征的温室光照控制系统是以色列设备的代表。它可以全天候工作,由自然光照的不同自动调节天窗、遮阳网等设备。在温度控制方面,它们大多釆用目前领先的弥雾控制降温技术[8]。这种技术通过向温室内喷出非常细的水雾来实现降温,具有快速高效、可靠安全的特征。
70 年代是西方各国现代化温室的高速发展期。西方发达国家在温室自动化控制系统上的研发和推广上不断投入,设施农业发展迅速。以以色列、美国以及荷兰等为代表的设施农业十分发达的国家在设施设备标准化、新型覆盖材料开发与应用技术、种苗技术的规范化栽培技术、农业机械化技术水平及设施环境综合调控等都具有世界领先地位。其中荷兰自 20 世纪 80 年代就开始对温室环境自动控制系统进行研究,并研制出了一系列的模拟控制软件系统。荷兰研发的温室环境智能控制系统,信息化程度高,人机交互性强。在操作界面,用户不仅可以对系统各项参数进行设置,而且还能在系统的提示帮助下实现对各种参数曲线的显示和测量,例如生长状况曲线等;并且,系统把历史数据储存在数据库中,便于用户的查询、控制和管理等操作。同时,通过与远程上位机软件通讯,完成远程参数设置、控制和报警等功能[9]。目前,荷兰国内已有 80%以上的温室种植采用计算机远程控制技术。
此外,温室智能控制系统的研究一直是相关方面专家学者的关注热点。上世纪 80 年代以来,设施园艺农作物生长模拟模型的研究这个领域的研究热点,并有许多成果面世。在此之后的 90 年代,设施农作物生长模型开始被广泛的应用到温室环境控制和温室作物培育方面。随着网络的快速发展,互联网也被广泛的应用到农业信息系统的研发上。用户可以通过 Internet 访问这些系统,根据访问的信息来判断作物的生长状况及要采取的相关的有效措施。作物模拟模型的研究成果对设施环境调控、作物生产管理技术的发展和信息化水平的提高发挥了很大的促进作用[10]。
国外正致力于发展温室环境参数控制与高科技技术相结合,主要特点是通过计算机控制技术和网络技术实现全方位、立体化的数字化控制。例如美国、荷兰这些在先进温室控制技术研究方面领先的国家,他们能够根据温室内作物对环境指标要求的差异来智能调控温室内各环境参数。此类型系统的典型有:Joseph.Baum 研制了一个集中控制系统 PMS20001 来实现对 a 室群的控制;H.Bemier 采用 6809 微处理器作为控制核心研发了一个实时多任务环境控制系统;J.K.Titlow 开发的 LAIS 环境控制系统,在对温室数据的传输管理方面有着显著的优点。澳大利亚、日本、美国等国推出了在网络通讯技术和视频技术的基础上,通过应用人工补充光照而实现温室环境的远程诊断与控制,通过机械手或机器人进行移栽作业的“植物工厂”,这代表着目前全球最先进水平的全封闭式生产体系。它极大的提高了产品产出率和劳动生产率[11]。
1.2.2 智能温室大棚国内研究现状
在两千多年前我国就已经能利用恰当的保护措施栽培植物,这就是温室的雏形。但是一直到 20 世纪 60 年代,中国的温室农业发展始终停滞不前,一直处在较低水平的状态。在上世纪 70 年代末,我国温室主要组成依旧是塑料大棚和日光温室,总体的技术水平落后于农业发达国家。
在改革开放以后,一系列欧美、日本等发达国家的现代化温室先后被引进到国内,国内专家对其加温系统、监测与集中控制系统以及其它的一些关键系统,还包括附属的设施都进行实验研究,这拉开了我国现代化温室快速发展的序幕。20 世纪 80 年代开始,我国从以色列、荷兰等国家引进许多大中型温室,将国外的温室控制技术加以消化吸收,对我国的温室种植起到了正面的影响。但是由于地域性差异,从国外引进的设备并不能很好的应用到国内的实际情况中,而且因为造价昂贵,很多温室经营亏损[12]。另外,国外引进的设备技术性较强,很难被普通用户掌握,从而大大缩减了适用的范围。由于以上种种原因,我国开始基于引入的技术和设备,自主研发了一系列温室控制系统。
90 年代开始,各级政府相继投资建设了一大批规模不一的现代农业高新技术示范园区,这对我国温室的现代化发展起到积极作用,国内的温室控制技术取得了长足的进步,一些温室环境参数实现自动控制的系统相继开发成功。20世纪 90 年代初,孙学斌等人研发出了由计算机和 51 单片机组成的温室控制系统,实现了对温室种植环境中的各生长因素的监测、管理和控制。于海业等人基于专家系统之上,研发了一套能够实时监测温室温度和湿度并实时给出处理方案的温室控制系统,并创建了具有良好交互性能的人机界面。一种小型分布式环境参数测控系统于 1995 年在北京农业大学研制成功,它就是“WJG-1 型实验温室环境监控计算机管理系统”[13]。吉林工业大学研发了一套能够根据室内的温度、湿度、和光照情况自动调节喷水量的温室自动灌溉系统,并成功地应用到实际当中。目前国产化温室控制技术比较典型的研究成果是江苏理工大学毛罕平等研制成功的植物工厂系统。它于 1996 年研制成功,使用工控机实现对温度、光照、CO2 浓度、营养液和施肥等因素的综合控制管理。随后中国农业机械化科学研究院研制成功了由大棚本体及通风降温系统、太阳能贮存系统、燃油热风加热系统、灌溉系统、计算机环境参数测控系统等组成的新型智能温室系统。1997 年以来,在温室环境的自动控制技术方面,中国农业大学经过不懈努力也取得了一定的成果。90 年代末,河北职业技术师范学院的闰忠文研制了能够对温、湿度进行实时测量与控制的蔬菜大棚[14]。
我国农业生产正面临着从粗放型传统农业到现代化精细农业转型跨越发展,要通过科学技术在有限的资源基础上努力实现节能减排和精耕细作。在计算机技术的快速发展的今天,我国始终重视现代化的信息技术在农业产业中的深化应用和不断推广,在提高自动化程度的基础上不断引导农业设备逐步向智能化方向发展,在农业温室智能控制系统方面尤其取得了一些突出进展。其中在 2007 年 6 月,中国农业科学院农业环境与可持续发展研究所试验温室研发成功了国内第一套单井抽灌浅层地能温室环境调控系统。“单井抽灌系统”、“能量提升系统”和“温室内循环系统”三部分构成了整个系统。
目前,我国经过长时间的发展,温室大棚生产面积已经成为全球第一。但是与荷兰,美国这样的农业发展发达国家相比,我国温室大棚的管理水平整体比较落后,自动化程度普遍不高,在效率方面有着明显的发展差距。发展精准农业不仅意味着对农作物高产量的追求,同时也是对我们在更加合理的使用农业资源、进一步提高生产效率和农产品质量以及降低生产成本等方面提出了更高的目标。而实现精准农业的前提就是首先实现设施农业环境信息的监测与控制。我国目前仅有二十多家具有智能温室种植系统的公司。由于智能温室控制系统价格昂贵,而且在实际的使用过程中需要不断的投入大量财力,所以就目前的情况来看,智能温室控制系统的用户主要是一些大的企业和公司[15]。另外,相比于国外的智能温室控制系统,国内的智能温室控制系统还有许多性能和技术上的不足和缺陷。国内的同类型系统还有许多性能和技术上的不足和缺陷,而且成本较高,很难被广泛应用到实际当中。由此可见,国内还需加大在这一方面的研究力度。
2智能温室大棚系统整体设计
2.1系统设计目标及要求
在智能温室大棚系统功能设计时,主要系统能够可靠运行下考虑产品的实用性、操作便利性和低成本。设计的功能要满足目前市场需求并且有一定的前瞻性,从而保证产品的生命周期,并且设计的功能相互之间不能干扰。智能温室大棚主要实现功能如下:
(1)采用土壤湿度传感器实时采集土壤湿度值,DHT11传感器采集室内温湿度值,光照强度传感器采集室内光照强度值,CO2浓度传感器采集室内CO2浓度值。
(2)通过云平台,实现远程监控温室系统的状态。通过开关和按键控制风扇、加热片、舵机的工作状态。
(3)OLED屏实时显示系统参数。
2.2主控芯片的选型
本设计应用中,目前常用的主控芯片有STM32单片机、51单片机、MSP430单片机、Arduino等,每种芯片都有独特的特性与常用环境。
方案一:采用 MSP430 系列单片机。该单片机是 TI 公司 1996 年开始推向市场的一种 16 位 超低功耗、具有精简指令集的混合信号处理器。其内部集成了多个不同功能的模拟电路、数字电路模块和微处理器,功能强大,但编程和开发相对复杂,所以最终放弃了此方案。
方案二:使用最为经典的51单片机作为主控制器,内部资源较少程序编写和调试时比较麻烦,故放弃此方案。
方案三:STM32主控芯片能实现本论文的系统研究,例外此款芯片内部自带AD,使得系统电路设计更简单,相比51系列和MSP430系列控制器有很好的性价比,很强的抗外界干扰能力,而且STM32的库函数更加方便开发,并且在程序方面有很好的兼容性,使程序开发及升级变得更加方便,所以本研究系统选用了STM32F103C8T6作为控制系统核心芯片。从成本和开发难易的角度考虑,最终选择了方案三。
2.3 WiFi模块的选型
方案一:使用庆科EMW3080 WIFI模块,与传统的WIFI模块相比,该模块内部已经集成了MQTT通信协议,并且是通过阿里云相关认证的模块,保证了数据传输的安全性,极大的简化了单片机控制芯片的处理,避免了较为复杂的数据解析处理步骤,但其工作电压只能3.3V,所以最终放弃了此方案。
方案二:采用正点原子的ATK-ESP8266模块能很好的满足本论文的系统研究。该模块支持3.3V或5V供电兼容性强,方便与产品进行连接,资源较多且比较常见,市面上有大量的开源教程,更大的减少了开发难度,更好的提高了编程效率。最终选择了方案二。
2.4系统总结构设计
本系统主要包括外围输入模块、处理模块和输出模块三个主要环节组成,单片机在系统中相当于大脑,是连接输入与输出的桥梁,使得看似没有直接关系的输入/出模块内部形成一定的信息传输路径。系统在运行过程中,缺少任何环节系统都无法正常工作,若没有输入信号,则系统无法输出结果,若系统只有输入没有输出,则该系统无法满足产品需求,下图是智能温室大棚系统结构图。
图2.4 智能温室大棚系统设计总体结构图
由图2-4可以得出,主控制器为STM32F103C8T6最小系统。外部连接按键模块,可以在OLED屏幕上进行参数设定和显示。土壤湿度检测模块、CO2浓度检测模块、光照强度检测模块、温湿度检测模块,用于检测温室大棚内部的环境,进行实时的数据采样。通过按键控制舵机、风扇、加热片保持温室内部环境稳定。WiFi模块连接阿里云,实时远程监控温室大棚系统的状态。
3系统硬件设计
硬件设计是智能温室大棚控制系统必不可少的一个环节,对温室大棚内部环境采集监控的模块有温湿度采集模块、二氧化碳浓度采集模块、光照强度检测模块、土壤湿度检测模块以及控制模块舵机、加热片、风扇等模块的选型和电路设计。
3.1 STM32F103C8T6最小系统电路设计
STM32F103C8T6单片机芯片供电范围为3.3V±0.2V,最小系统一般有晶振电路、电源电路、复位电路以及调试电路组成,芯片一共四个定时器、二个ADC、三个串口,芯片内部嵌入256Kb的随机存储器(SRAM),因此不用外部额外扩展随机存储器。
图3.1STM32F103C8T6最小系统电路图
STM32F103C8T6单片机芯片很多GPIO具有复用功能,PA9与PA10通过软件可以配置成普通GPIO口或者串口,作为普通GPIO可以作为输入输出口。程序中大致端口设置如表3.1。
表3.1端口设置
序号 | 外围设备 | 引脚 | 功能 |
1 | 温湿度传感器 | PB12 | 检测环境温湿度值 |
2 | 土壤湿湿度模块 | PA0 | 检测土壤湿度 |
3 | WiFi模块 | PA9,PA10 | 与云平台通信 |
4 | 驱动器 | PB12,PA6 | 控制加热片和风扇 |
5 | OLED | PB8,PB9 | 字符显示 |
6 | 按键1,2,3, | PA,PA5,A11 | 参数值设置 |
7 | 光照强度传感器 | PB14,PB15 | 检测光照强度值 |
8 | CO2浓度传感器 | PB0,PB1 | 检测环境C02浓度值 |
9 | 舵机 | PA1 | 调整舵机转动角度 |
3.2温湿度采集模块
本设计系统需要检测环境温湿度值,目前常用的温湿度检测传感器有DHT11。DTH11传感器主要有温度采集晶元、处理单元与传输单元构成。本文需要检测控制的温度值,因此选择DHT11传感器作为本系统的输入模块,下图为温湿度传感器硬件模块图。
图3.2 温湿度传感器电路图
图中,温湿度传感器DHT11模块外部有三个管脚,分别是VCC、GND与信号输出管脚。DHT11系统供电电压范围为5V±0.5V,额定电压为5V与系统输入电压相同,因此不需要额外增加电源转换电路。当模块工作后,湿度晶元采集环境中模拟信号温度值,并传给处理单元进行A/D转换,然后采用串口通信方式把处理的数字量发送给单片机。
3.3土壤湿度采集模块
采用YL-69土壤传感器做土壤湿度的检测,表面采用镀镍处理,有加宽的感应面积,可以提高导电性能,防止接触土壤容易生锈的问题,延长使用寿命,可以宽范围控制土壤的湿度,通过电位器调节控制相应阀值,湿度低于设定值时, DO 输出高电平,高于设定值时, DO 输出低电平,小板模拟量输出AO可以和AD模块相连,通过AD转换,可以获得土壤湿度精确值,比较器采用LM393芯片,工作稳定。土壤湿度传感器内部电路设计原理图如下图所示。
图3.3 土壤湿度传感器内部电路图
传感器工作电压为3.3~5V,本设计系统供电电压为5V,因此不需要增加电源转换电路。通过采集的信号值与灵敏度值进行比较,若采集值大设置的灵敏度值,则传感器输出低电平,否则输出高电平,其中灵敏度通过10K电位器进行调节。若需要模拟量输出,传感器器把采集的数据输出,然后经过最小系统的ADC接口转换为数字量,在通过换算公式变为对应的湿度值0~100%含水量。它的工作原理主要是当土壤含水量不同时,会改变探头的电阻值,从而使得探头的输出电压值发生改变。
3.4 CO2浓度检测模块
采用SGP30气体传感器做CO2浓度的检测,SGP30是一款单一芯片上具有多个传感元件的金属氧化物室内气体传感器,内部集成4个气体传感元件,具有完全校准的空气质量输出信号,主要是对空气质量进行检测。可以输出:甲醛,量程为0~60000ppb;CO2浓度,量程400~60000ppm。SGP30的传感(MEMS)部分基于金属氧化物(MOx)纳米颗粒的加热膜。气敏材料——金属氧化物颗粒上吸附的氧气与目标气体发生反应,从而释放出电子。这导致由传感器测量的金属氧化物层的电阻发生改变。简而言之,还原性气体的出现造成气敏材料表面氧浓度降低,改变了半导体的电阻(或电导率)。后续通过电路(ASIC)部分对电阻进行检测、信号处理与转换等,最终获取到气体值。下图为SGP30传感器硬件模块图。
图3.4 SGP30传感器电路图
图中,SGP30气体传感器模块外部有四个管脚,分别是VCC,GND,SCL和SDA。SGP30气体传感器模块供电电压范围为5V或3.3V,额定电压为5V与系统输入电压相同,因此不需要额外增加电源转换电路。当模块工作后,STM32与SGP30气体传感器进行IIC通信发送控制命令,读取气体浓度数值发送给单片机。
3.5光照强度检测模块
BH1750FVI是一款数字型光强度传感器集成芯片。BH1750的内部由光敏二极管、运算放大器、ADC采集、晶振等组成。PD二极管通过光生伏特效应将输入光信号转换成电信号,经运算放大电路放大后,由ADC采集电压,然后通过逻辑电路转换成16位二进制数存储在内部的寄存器中(注:进入光窗的光越强,光电流越大,电压就越大,所以通过电压的大小就可以判断光照大小,但是要注意的是电压和光强虽然是一一对应的,但不是成正比的,所以这个芯片内部是做了线性处理的,这也是为什么不直接用光敏二极管而用集成IC的原因)。BH1750引出了时钟线和数据线,单片机通过IIC协议可以与BH1750模块通讯,可以选择BH1750的工作方式,也可以将BH1750寄存器的光照度数据提取出来。也就是说我们只需要配置一个IIC协议就可以直接读出光照强度了。光照强度传感器支持IICBUS接口,接近视觉灵敏度的光谱灵敏度特性,输出对应亮度的数字值对应广泛的输入光范围(相当于1-65535lx),无需其他外部件,光源依赖性弱。有两种可选的IICslave地址。最小误差变动在±20%。受红外线影响很小。下图为光照强度传感器硬件模块图。
图3.5 光照强度传感器电路图
图中,光照强度传感器模块外部有五个管脚,分别是VCC,GND,ADDR,SCL和SDA。光照强度传感器模块供电电压范围为5V或3.3V,额定电压为5V与系统输入电压相同,因此不需要额外增加电源转换电路。当模块工作后,STM32与光照强度传感器进行IIC通信发送控制命令,读取光照强度数值发送给单片机。
3.6 OLED显示模块
OLED显示屏的通信方式主要有8位并行连接,4线SPI连接以及2线I2C连接,为了满足产品要求,较少对单片机I/O的使用以及连接的简洁性,本设计系统采用了串行2线I2C连接方式,其具有结构简单,数据针对本设计微型化的特点,普通的LCD显示屏无法满足产品对尺寸的要求,为此,项目特别的采用了OLED显示屏作为显示模块。因为采用了OLED屏幕作为显示屏幕,为此选用了0.96寸OLED显示模块。下图为OLED显示模块硬件模块图。
图3.6 OLED模块电路图
通过I2C的时序图可以了解到I2C数据的传输原理,当控制线处于高电平而数据线由1变为0,发出开始信号,开始信号发出之后,接下来的7位表示的是从机所在的地址,这8位的数据构成了一个完整的字节,表明了数据传输的方向与设备地址。当控制线处于低电平数据线由0变为1时,发出停止信号,结束数据传输。
3.7 ATK-ESP8266WIFI模块
ATK-ESP8266 是 ALIENTEK 推出的一款高性能的 UART-WiFi(串口-无线)模块,ATK-ESP8266 板载 ai-thinker 公司的 ESP8266 模块,该模块通过 FCC,CE 认证,可直接用于产品出口欧美地区。ATK-ESP8266 模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置 TCP/IP协议栈,能够实现串口与 WIFI 之间的转换。通过 ATK-ESP8266 模块,传统的串口设备只是需要简单的串口配置,即可通过网络(WIFI)传输自己的数据。TK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统,可以很方便的与你的产品进行连接。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA+WIFI AP 的模式,从而快速构建串口WIFI 数据传输方案,方便你的设备使用互联网传输数据。下图为WIFI模块硬件模块图。
图3.7 WIFI模块电路图
图中,WIFI模块外部有六个管脚,分别是VCC、GND、TXD 、RXD、RST、IO,ESP8266支持3种工作模式“STA”、“AP”、“STA+AP”模式:
(1)STA模式:该模块通过路由器连接网络,手机或者电脑实现该设备的远程控制.
(2)AP模式: 该模块作为热点,手机或者电脑连接WiFi与该模块通信,实现局域网的无线控制
(3)STA+AP模式: 两种模式共存,既可以通过路由器连接到互联网,也可以作为WiFi热点,使其他设备连接到这个模块,实现广域网与局域网的无缝切换.
正点原子的ATK-ESP8266WiFi模块使用AT+MQTT协议接入阿里云
需要烧入MQTT固件烧写方法如下
接线方法如下
VCC-------VCC
GND------GND
TX--------RX
RX------TX
IO_O-----GND
烧写AT固件,烧写指导文件目录下的v1.3.0.2 AT Firmware,使用工具ESP_DOWNLOAD_TOOL_V2.4烧写,烧写设置如下:
图3.8 WIFI模块固件烧写设置图
建立阿里云模型后用串口接入阿里云
WiFi模块工作时
接线方法如下
VCC-------VCC
GND------GND
TX--------RX
RX------TX
串口发送AT指令如下成功接入阿里云
//第一步 AT+RST
//第二步 AT+CWMODE=1
//第三步 AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
//第四步 AT+CWJAP="WiFi名字","WiFi密码"
//第五步 AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,""
//第六步 AT+MQTTCLIENTID=0,"ClienId" //clientId第二个参数注意每个逗号前加分隔符\
//第七步 AT+MQTTCONN=0,"连接域名",1883,1
通信指令
//AT+MQTTSUB=0,"topic",1 //订阅指令
//AT+MQTTPUB=0,"topic","AJson格式内容",1,0 //发布指令
4系统软件设计
系统软件采用模块化结构,系统的软件与硬件设计思想相对应,按不同的功能分成各种不同的程序模块,分别进行编程、设计与测试,通过主程序、中断处理程序最终将各程序模块连接起来完成整个系统的功能。
4.1主程序模块设计
该系统软件程序主要实现的就是通过OLED显示传感器采集的数据,通过按键控制风扇、加热片的工作状态,再通过串口与WiFi模块通信实现WiFi模块的数据上传到阿里云,然后通过WiFi模块接收阿里云下发的命令控制舵机的转动角度。主程序设计流程图如下:
图4.1 主程序流程图
4.2温湿度检测程序设计
温湿度测量采用DHT11传感器,它是一款单总线的器件,传感器输出数字信号值,一个数据传输周期是4ms,所以DHT11对操作时时序的要求精度很高,对于该温湿度传感器与单片机数据访问主要通过DATA线进行。
DHT11温湿度模块利用标准的GPIO的固件库函数和滴答定时器模拟操作时序。DHT11传感器读取湿度值,若不能正确的读取相关数值,则传感器重新进行检测。通过指针变量传入温度和湿度地址值,通过函数获取温湿度值,必须强制转化为无符号整型,由于设定的最高值为99,因此湿度不可能超过99,最后通过函数显示在OLED上。
图4.2 温湿度测量程序流程图
4.3土壤湿度检测程序设计
土壤湿度测量采用YL-69传感器,它通过一根线向单片机的IO口输入模拟电压,必须要经过单片机内部的A/D转换才能读取土壤湿度值。
土壤检测传感器使用PA0引脚,土壤检测模块模拟量输出AO可以和单片机的ADC接口相连,通过AD转换,可以获得土壤湿度精确值,单片机GPIO口进行直接控制,根据测量出的湿度值,显示在OLED屏幕上。
图4.3 土壤湿度测量程序流程图
4.4 CO2浓度检测程序设计
CO2浓度测量采用SGP30气体传感器,它是一款IIC通信的器件, IIC总线总共只有两条信号线,一条是双向的串行数据线SDA,另一条是串行时钟线SCL。SDA和SCL都是双向的,IIC总线上的各器件的数据线都接到SDA线上,IIC总线上的各器件的时钟线都接到SCL线上。
SGP30气体传感器模块利用标准的GPIO的固件库函数和滴答定时器模拟IIC通信。DHT11传感器读取湿度值,若不能正确的读取相关数值,则传感器重新进行检测。通过IIC协议读取SGP30气体传感器检测到的浓度值,最后通过函数显示在OLED上。
图4.4 CO2浓度测量程序流程图
4.5光照强度检测程序设计
光照强度测量采用GY-302 BH1750传感器,它也是一款IIC通信的器件, 通过IIC协议读取传感器检测到的关照强度值,最后通过函数显示在OLED上。
图4.5光照强度测量程序流程图
4.6 WiFi模块配置程序设计
信号传输采用的是串口数据传输,通过阿里云平台传输或者接收数据,WiFi模块模块起到了中介作用,当云平台发送正确数据,经过WiFi模块传输到单片机,经过单片机内部处理后,执行相应的功能。进行如下图所示。
图4.6 WiFi模块程序流程图
5系统测试
本次测试主要是对温室大棚系统采集的温湿度值、土壤湿度值、CO2浓度值、光照强度值以及加热片、风扇、舵机是否能正常工作和云平台数据的上报与接受是否正常,并且正常控制各项功能。
5.1智能温室大棚基本功能测试
在实验室测试结果,系统开始运行,当温度超过一定值时,蜂鸣器报警,此时风扇会开始工作,当温度过低时加热片开始工作,云下发数据控制舵机转动的角度,CO2浓度检测模块等传感器开始工作,WiFi模块上报采集到的数据。环境温度27摄氏度,环境湿度57%,光照强度306lx,CO2浓度值425,土壤湿度值64%。
图5.1 实物测试图
图5.2 阿里云数据接受图
表5.1不同测试时间传感器数据
测试时间 | 测试温度(℃) | 测试湿度(%) | CO2(ppm) | 土壤湿度(湿的卫生纸包裹)(%) | 光照强度(lx) | 补光灯位置 | 实验室温度(℃) | 实验室湿度(%) |
12:00 | 27 | 57 | 406 | 69 | 306 | 正面 | 27 | 58 |
13:00 | 27 | 61 | 406 | 54 | 224 | 侧面 | 27 | 62 |
14:00 | 26 | 66 | 415 | 42 | 308 | 正面 | 26 | 65 |
15:00 | 26 | 58 | 408 | 31 | 336 | 正面 | 25 | 57 |
16:00 | 24 | 64 | 425 | 17 | 18 | 无补光 | 24 | 64 |
17:00 | 22 | 62 | 408 | 8 | 11 | 无补光 | 21 | 62 |
根据实验结果表明,不同测试时间数据变化较为明显,有无湿纸巾和补光灯的位置的改变能引起明显的变化,并且测试温湿度与实验室温湿度误差较小,该系统能够正常运转较好的测出实验数据。
6系统成本核算
表6.1成本核算
模块名称 | 型号 | 数量 | 价格 |
微控制器 | stm32f103c8t6 | 1 | 15.5 |
显示器 | OLED 屏幕 | 1 | 10.8 |
WiFi模块 | ATK-ESP8266 | 1 | 28 |
土壤湿度传感器模块 | YL-69 | 1 | 3.54 |
温湿度模块 | DHT11 | 1 | 6.38 |
二氧化碳浓度传感器 | SGP30 | 1 | 36.8 |
光照强度传感器模块 | GY-302 BH1750 | 1 | 10.87 |
蜂鸣器模块 | 有源蜂鸣器 | 1 | 2.1 |
加热模块 | ST021加驱动 | 1 | 9 |
风扇模块 | ST027 | 1 | 6 |
舵机 | SG90 | 1 | 4.9 |
贴片按键 | SW-AJ | 3 | 0.6 |
总计 | 134.49 |
根据表格得出WiFi模块的成本较高,可以选择较为普通的市面上常见的ESP8266-WiFi模块而不是正点原子的,加热片和风扇的驱动也可以用继电器来代替,降低实验成本。
7总结与展望
7.1总结
本次课程设计在自己的努力,同学的帮助,老师的指点下已全部完成,结果重要,过程也很珍贵,因为好的结果必然得经过一个艰辛的过程,而从这个坚信的过程中我获得了珍贵的经验和教训,仔细认真的总结将对自己是个质的提升。现先将此次课程设计的成果简要汇报如下:
(1)完成整个智能温室大棚的系统设计
(2)熟悉阿里云平台物联网产品的搭建
(3)掌握了WiFi模块的使用
(4)明白了各种传感器的使用方法
(5)对STM32的库函数使用更加熟练,以及掌握内部资源的调用和IO口接外设使用
该智能温室大棚系统是以单片机为主控制电路,用户可以通过云平台远程监控温室环境和按键来控制加热片、风扇、舵机等改变温室的环境。根据设计方案,详细地阐述了单片机的控制原理、各种传感器的使用方法、 WiFi模块的配置方法,设计了相应的硬件电路和系统软件。结果表明,所设计的电路和软件能完成基本的测试功能。
7.2展望
智能温室大棚的环境参数检测与控制是一项复杂的工程,是多领域交叉的技术应用,包括传感器技术、数据采集、数据传输、通信、测控等学科。本文设计的基于云平台的智能农业温室大棚远程监控系统,虽然实现了对多种传感器数据的采集、对多个执行器的控制,但是由于个人的能力水平、时间等因素的限制,在控制算法上还有待进一步的提高,系统后期可增加大数据分析模型,建设智慧农业综合平台,添加更多种类的传感器和控制装置,应用推广到更广领域的智慧农业领域。大棚的设计不够完美,转化成实际的产品需要很多的努力,在今后的设计中会对其作进一步的研究和优化。本研究利用物联网技术,提供了一种智慧农业大棚监测系统的解决方案。
致谢
在此,本人衷心地感谢在此过程中帮助过我的老师和同学。在工程实施的过程中,
我遇到了无数的困难和障碍,都是在同学和老师的帮助下度过了。
从这里,我学会了下面几点:
(1)继续学习,不断提升理论涵养。
在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
(2)努力实践,自觉进行主角转化。
只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。务必在实际的工作和生活中潜心体会,并自觉的进行这种主角的转换。
(3)提高工作用心性和主动性
实习,是开端也是结束。展此刻自己面前的是一片任自己驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
本文参考了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我也很难完成本论文的写作。 由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!
时间比较催促虽然没有做到完美,但基本功能全部实现附(main,WiFi)代码如下
#include "stm32f10x.h" // Device header
#include "sys.h"
#include "Delay.h"
#include "OLED.h"
#include "dht11.h"
#include "sgp30.h" // Device header
#include "bh1750.h" // Device header
#include "i2delay.h"
#include "AD.h" // Device header
#include "USART.h"
#include "esp.h"
#include "LED.h"
#include "PWM.h"
#include "fmq.h"
#include "exit.h"
#include <stdio.h>
#include <string.h>u32 sgp30_dat;
u32 CO2Data;//CO2Ũ¶Èint Light=401;//¹âÕÕÇ¿¶È
int CO2=401;//CO2Ũ¶È
int trshidu=20;//ÍÁÈÀʪ¶È
int Temperature=20;//ζÈ
int Shidu=20;//¿ÕÆøʪ¶Èuint8_t Switch='0';
extern char RECS[200];
u8 T,S;void Init(void)
{uint8_t Judge=0;delay_init();OLED_Init();OLED_ShowString(1,1,"Linking...");MyUSART_Init(); //³õʼ»¯´®¿Ú
// Timer_Init();
// PWM_Init();do{Judge = esp_Init();OLED_ShowString(1,1,"error code:");OLED_ShowNum(2,1,Judge,1);}while(Judge); //Á¬½Ó°¢ÀïÔÆÖ±µ½³É¹¦LED_Init();DHT11_Init();SGP30_Init();BH1750_Init();AD_Init();PWM_Init();fmq_Init();}int main(void)
{Init();Delay_ms(100);OLED_Clear();exit_init();while(1){ OLED_ShowString(1, 9, "gz");OLED_ShowString(1, 1, "CO2");OLED_ShowString(2, 1, "wendu");OLED_ShowString(2, 10, "shidu");OLED_ShowString(3, 1, "trshidu"); if (!i2c_CheckDevice(BH1750_Addr)){Light = BH1750_Read_Measure(); //»ñÈ¡¹âÕÕÇ¿¶ÈLight=Light/1.2;}
// Light++;Delay_ms(100); SGP30_Write(0x20,0x08);sgp30_dat = SGP30_Read();//¶ÁÈ¡SGP30µÄÖµCO2Data = (sgp30_dat & 0xffff0000) >> 16;//È¡³öCO2Ũ¶ÈÖµ
// CO2Data++;CO2=(int)CO2Data;Delay_ms(100); DHT11_Read_Data(&T, &S); //¶ÁÈ¡ÎÂʪ¶ÈÖµTemperature=(int)T;
// Temperature++;Shidu=(int)S;
// Shidu++;Delay_ms(1); trshidu=(int)Get_Adc_Average(1,10);//¶ÁÈ¡ÍÁÈÀʪ¶ÈÖµ
// trshidu++;Delay_ms(1); OLED_ShowNum(1,12,(int)Light,4);Delay_ms(1); OLED_ShowNum(1,5,CO2Data,3);Delay_ms(1); OLED_ShowNum(2,7,Temperature,2);Delay_ms(1); OLED_ShowNum(2,15,Shidu,2);Delay_ms(1); OLED_ShowNum(3,8, trshidu, 2);Delay_ms(1);// Esp_PUB();Delay_ms(1000);if(Esp_PUB() == 1){OLED_ShowString(4,3,"publish failed");Delay_ms(100);
// OLED_Clear();}Delay_ms(1000);
// CommandAnalyse(); OLED_ShowChar(4,1,Switch);if(Switch=='0')//ÔÆ¿ØÖÆ{GPIO_SetBits(GPIOC, GPIO_Pin_13);PWM_SetCompare2(90/180 * 2000 + 500);}else {GPIO_ResetBits(GPIOC, GPIO_Pin_13);PWM_SetCompare2(180/180 * 2000 + 500);}if(Temperature>30){fmq_start();}}}#include "stm32f10x.h" // Device header
#include <stdio.h>
#include <string.h>
#include "Delay.h"
#include "i2delay.h"extern int Light;//光照强度
extern int CO2;//CO2浓度
extern int trshidu;//土壤湿度
extern int Temperature;//温度
extern int Shidu;//空气湿度
extern uint8_t Switch;extern char RECS[250];
const char* WIFI ="hyjh";
const char* WIFIASSWORD="87654321";
const char* ClintID="a1DFiJFnwRA.han01|securemode=2\\,signmethod=hmacsha256\\,timestamp=1684306776279|";
const char* username="han01&a1DFiJFnwRA";
const char* passwd="59de3776eebec99bca018a7677106ec9bf99b0042f384da2948442697adef43c";
const char* Url="a1DFiJFnwRA.iot-as-mqtt.cn-shanghai.aliyuncs.com";
const char* pubtopic="/sys/a1DFiJFnwRA/han01/thing/event/property/post";
const char* subtopic="/sys/a1DFiJFnwRA/han01/thing/event/property/post_reply";
const char* func1="PowerSwitch_1";
const char* func2="soilHumidity";
const char* func3="co2";
const char* func4="LightLux";
const char* func5="Humidity";
const char* func6="temperature";int fputc(int ch,FILE *f ) //printf重定向
{USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus (USART1,USART_FLAG_TC) == RESET);return ch;
}
char esp_Init(void)
{memset(RECS,0,sizeof(RECS));printf("AT+RST\r\n"); //重启Delay_ms(2000);memset(RECS,0,sizeof(RECS));printf("ATE0\r\n"); //关闭回显Delay_ms(10);if(strcmp(RECS,"OK"))return 1;printf("AT+CWMODE=1\r\n"); //Station模式Delay_ms(1000);if(strcmp(RECS,"OK"))return 2;memset(RECS,0,sizeof(RECS));printf("AT+CWJAP=\"%s\",\"%s\"\r\n",WIFI,WIFIASSWORD); //连接热点Delay_ms(1000);if(strcmp(RECS,"OK"))return 3;memset(RECS,0,sizeof(RECS));printf("AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"\r\n",ClintID,username,passwd);//用户信息配置Delay_ms(10);if(strcmp(RECS,"OK"))return 4;memset(RECS,0,sizeof(RECS));printf("AT+MQTTCONN=0,\"%s\",1883,1\r\n",Url); //连接服务器Delay_ms(1000);if(strcmp(RECS,"OK"))return 5;printf("AT+MQTTSUB=0,\"%s\",1\r\n",subtopic); //订阅消息Delay_ms(1000);if(strcmp(RECS,"OK"))return 5;memset(RECS,0,sizeof(RECS));return 0;
}
//功能:esp发送消息
//参数:无
//返回值:0:发送成功;1:发送失败
char Esp_PUB(void)
{memset(RECS,0,sizeof(RECS));printf("AT+MQTTPUB=0,\"%s\",\"{\\\"method\\\":\\\"thing.event.property.post\\\"\\,\\\"params\\\":{\\\"%s\\\":%c\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d}}\",0,0\r\n",pubtopic,func1,Switch,func2,trshidu,func3,CO2,func4,Light,func5,Shidu,func6,Temperature);
// printf("AT+MQTTPUB=0,\"%s\",\"{\\\"method\\\":\\\"thing.event.property.post\\\"\\,\\\"params\\\":{\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d\\,\\\"%s\\\":%d\\}}
// while(RECS[0]);//等待ESP返回数据Delay_ms(1000);//延时等待数据接收完成if(strcmp(RECS,"ERROR")==0)return 1;return 0;
}
void CommandAnalyse(void)
{if(strncmp(RECS,"+MQTTSUBRECV:",13)==0)//at+MQTTSUBRECV:0{unsigned char i=0;while(RECS[i++] != '\0') {if(strncmp((RECS+i),func1,13)==0){while(RECS[i++] != ':'); Switch=RECS[i];}
// if(strncmp((RECS+i),func1,13)==0)
// {
// while(RECS[i++] != ':');
// Switch=RECS[i];
// }}}
}