版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于PLC的智慧家庭蔬菜农场设计摘要随着物联网,智能家居的发展,智能化的足迹已经遍及千家万户。而农业作为一个国家的第一产业,对一个国家的发展和壮大不管是在任何时期都是十分重要的。农场作为未来农业发展的一个主要平台,对其的升级和改进自然不可忽略,既然我们的嵌入式系统能够实现如此强大的功能,如果能与我们的农场进行合理有效的结合,那么必将促进我们在农场上的科学有效的管理,为我们农场品的增长或者是农场的有效管理提供一套比较完备的解决方案。本文主要是侧重于对软件的设计和开发,根据农场的运作设计的不同算法,通过农场的智能化改进,合理的配合农场运作和规范化的管理智能农场。不管是在农产管理算法上,还是在对农场设施的控制上,或者是在用户交互上,我们都需要开发和设计相应的软件架构,并制定完善的在智能化农场管理的通信协议。通过对软件架构的规范化设计,旨在对现代化的农场管理提供一套简单可行的解决方案。关键词:嵌入式软件;智能;农场目录第一章绪论 第一章绪论1.1课题研究的意义随着物联网和智能家居的发展,智能已经发展到成千上万的家庭。农业作为国家的主要部门,一直对国家的发展和发展具有重要意义。农场作为未来农业发展的重要平台,对其的升级和改进自然不可忽略,因此,对农场的研究很重要。除了微控制器处理器的不断发展之外,还生产了一些最强大的微控制器:我们将其称为嵌入式操作系统,这与整个MCU不同。SOC被认为是一个功能强大的处理单元,它结合了大量的芯片器件,能够处理一些集成系统。由于处理器管道非常高效,因此它也称为嵌入式操作系统。并且其功能深度可以改变,通常在使用工业产品时,我们将根据功能要求,价格取向和其他因素选择硬件设备。集成系统主要包括基本COD和外围控制。日常生活中的这些程序是电信系统,消费电子产品,家庭应用,运输系统,医疗设备等。对于嵌入式操作系统,常见使用的有Android,FirefoxOS,iPhoneOS,uC/OSII,uCLinux,VxWorks,WindowsCE,WindowsXPEmbedded,Linux,Arm-Linux。对于目前的应用市场,Linux因其免费开源,一直是市场占有率第一。也因此,本课题采用的是嵌入式Linux系统。在我们较大的嵌入式系统中,为了降低SOC处理器或一系列智能和手动控制的压力,我们通常控制一些与微处理单元相关的辅助单元。MCU准备就绪,旨在降低主控制器的压力,另一方面,它也有助于节省能源。这对我们的智能农场来说可能并不重要,但可以看出这会影响机器进入系统就效果一般了。由于我们的嵌入式系统可以发挥如此强大的功能,如果我们将农场有效地整合到我们的运营中,我们就可以管理我们的科学和运营效率,从而发展我们的农场品或农场管理提供了完整的解决方案。1.2课题研究的现状1.2.1嵌入式技术的发展现状这几年嵌入式系统事业可以说是飞速发展,嵌入式软件技术也得到了快速发展,而且当下嵌入式软件的发展已经让硬件有些吃力,微处理器也从8位到16位,32位甚至64位;从支持单一品种的CPU芯片到支持很多歌品种的;从单一内核到多功能内核;qita功能模块如文件系统、TCP/IP网络系统、窗口图形系统等;而且形成了以嵌入式系统为核心,硬件为其服务,应用软件基于此来开发产品及解决方案。随着现代现代化需求的逐渐增大,以及人们对开源的追求,未来将以嵌入式系统为火车头的火车快速进发。嵌入式系统应用领域之广泛,可以说是空前绝后,一方面是人们对于至于智能化需求的日益增长,也是目前我国经济发展进入一个新阶段的重要标志。目前我国嵌入式系统设计主要在消费电子、汽车电子、医疗电子、信息家电、通信通讯、手持设备、工业控制、安防监控等领域产品开发及解决方案。消费类电子产品开发时当前最热门,从当前国内的手机等行业便可知悉,当然也是从业工程师最多的行业,占到62%,其次是在通信通讯领域(53%),最后在工业控制领域(46%)。嵌入式软件开发平台众多,Linux遥遥领先2016年,在嵌入式产品和解决方案的开发平台的选型上,嵌入式Linux以55%的市场份额遥遥领先于qita嵌入式开发软件平台,比去年增长13个百分比。由此可见,Linux凭借其开源和免费的精神,已经长期稳定使用和稳健的更新,已经越来越多的获得跟多的开发团队和个人的青睐和认可。而作为互联网客户端最大的终端设备,智能手机和平板电脑的市场已经越来越不能小觑,Android凭借多级分层的结构,和底层采用Linux内核从而便于驱动开发,大大节约了开发难度和时间,而且和其使用的Java虚拟机的高度可移植性密不可分,几乎可以兼容不同厂商,不同型号,不同硬件不同Android版本的智能手机。嵌入式开发语言多样,C/C++语言仍占主导地位,因为C语言的高度不安全性,也可以说是其高度地接近汇编语言,因此对于嵌入式系统的驱动开发往往十分有效。而对于C++,因其高度兼容C的特性,同时对C的安全性加强,加之其面向对象的代码可复用性,因此C/C++已然成为现如今软件、解决方案开发的主流语言。1.2.2物联网及智能农场的发展现状随着宽带和网络通信的发展,物联网如今更加光明。工业和信息化部,发展和改革委员会以及科技部表示,互联网发展是中国高科技发展最重要的领域之一。发展智力农场主要是监测家庭环境,就环境变化进行快速有效的讨论,并实现植物生长的各个阶段的自动化以实现目标。最大的好处。现代农业相对于传统农业最重要的方面是智力控制,它不仅减少了人力资源,而且还生产了肮脏,健康和环保的农产品。对于物联网,通常可以说所有物理设备连接到网络以实时控制用户。互联网是当前发展的核心,它越来越孤立于人们的生活。更好的平台可提供更高的网络容量和更少的网络延迟。实现完全符合环境信息环境时间控制的实时性能。用途。与此同时,物联网可以将信息,充足的供应和应用资源结合起来,收集大数据有助于农场的长期管理及其有效供应。1.3课题研究的主要内容本课题主要研究研究如何合理的规划和搭建嵌入式系统,统一管理整个农场的运作,监控整个农场的环境。又或者是对环境或者是说农场中的事件,自动采取相应的措施去处理,那我要做的关键是控制电路和处理电路之间的选型和通信问题,以TCP/IP协议去实现我们相应需要的一些具体功能,完成Server和Client或者Controller的协调与一致,同时运用视频监控完成对农场某一部分的监控功能。同时对于嵌入式系统本身的管理和可控,硬件电路的协调工作作出相应的调节和完善。具体来说,我们通过TCP或者是UDP协议和Server来传输我们需要的一些控制控制信息给相应的硬件设备,同时在反方向上,Sensor来传递给我们当前环境的信息,以便我们去操作硬件作出相应的调整。本设计分为硬件和软件两大部分,硬件以主控SOC为SAMSUAMG公司的Exynos4412作为Server的硬件平台,配有2GDDR3内存和8GEMMC高速闪存,有UART和常用的IO引脚可以满足我们的这个农场服务器的性能要求。同时用采用ST公司的STM32作为硬件控制平台,它是一个增强型Cortex-M3,32bit的MCU,时钟频率可达72MHz,拥有512KB的flash和64KB的SRAM,足以满足我们对硬件控制,和环境信息采集还有与服务器通信的需求。
第二章系统总体方案设计2.1芯片的选型本系统最重要的两个部分,一个是服务器Server,它既负责和底层控制部分的数据交互,同时又负责和用户APP的交互,那么为了保证能够实现对用户信息的管理,和对收集的数据的处理,也就是说我们的服务器能够调用常见的数据库的API函数,那么我们的服务器必然不是一个裸机程序能够做到的,它需要运行在一个操作系统之上,因此我们服务器的主控一定是SOC,也就是嵌入式操作系统。近几年,可以说SOC的发展可以说是飞速的,从单核到多核,从低频率到现在频率能够和电脑一般,我所选用的SOC一款SUMSUNG公司在2012年发布的一款主要应用于智能手机解决方案的SOC,它是基于ARMCortex-A9核32位的微控制器,四核以及最高1.6GHz的主频,能够高速的处理大量数据;且板载2G的RAM和8G的ROM,使其能有较大的运行内存和数据存储空间;它自带了常见的总线及外设接口,以及丰富的IO资源,比如USB,UART,I2C,以太网口等等。另外为了我们对于硬件的控制和底层信息的采集,我们对于控制的主控选用的是当下十分热门的STM32,64KBSRAM和512KB的flash,时钟频率可达72MHZ一款功能强大的MCU其丰富的IO口和片内外设完全能够满足我们的设计需求。2.2系统框架和工作流程分析该系统主要是一个基于嵌入式综合应用的控制系统,农民通过移动电话从当前服务器场接收不同的信息,并了解农场的工作条件。在此期间,服务器还可以通过控制传感器发送的各种控制和各种数据来自动调节和控制电池。例如,有时我们必须监控电池何时制造。电池和电池边框。如果使用相关设备,则必须手动控制它们。因此,APP基本上完成了与服务器的协作,以便在通过服务器提供控制器的同时从服务器场检索数据。那么服务器和底层的控制器相当于主人和仆人的关系,服务器可以无条件的获取控制器采集的信息,服务器也可以无条件的控制控制器去实现不同的操作。充当各个模块之间的“媒人”当然也是不同,在APP和服务器之间我们只需要通过TCP/IP或者是说UDP协议来实现通信。而我们的Sensor和控制器之间通过WiFi和蓝牙进行数据传输。为了保证我们通信的可靠性问题,我们可以采用在TCP协议中为了保证数据可靠传输的办法,即是对数据帧编号,超时传输,及时回应。系统的整体框架如图2-1所示。 图2-1系统整体架构图2.3嵌入式Linux系统当移动及用户终端设备日益成熟的今天,尤其是用户终端设备纷杂多样,为了便于我们快速开发和有效的管理。嵌入式Linux出现了,它实际上是对Linux系统的精简,因为可能我们的用户终端设备不需要那么全的整套Linux系统的所有功能。现如今,人们往往是根据自己产品的不同需求裁剪出适合自己精简的Linux版本。对与Linux来说,我们在嵌入式开发中往往关注的是三个点,其一是Bootloader,它是被用作来对核心硬件和运行环境做一个初始化,其核心实际上就是一个裸机程序。其二就是Linux内核,它也是Linux的核心,主要由5大子模块构成,进程管理、文件管理、设备管理和网络管理。其三就是根文件系统,文件系统是Linux下不可或缺的重要组成。在Linux下一切皆文件,不论是普通文件,或是设备,又或者是通信的管道等等,在Linux下均被抽象为文件。这三者之间的结构图如下3-1所示:引导加载程序:包括固化在iROM中的启动代码和Bootloader两部分。内核:经过裁剪的LinuxKernel以及Bootloader传给内核的参数。文件系统:rootfilesystem用户应用程序:实现用户特定功能的程序。图3-1Linux启动模块图对于本次设计,主要是完成服务程序的设计,因此需要的工作是交叉编译工具链的安装,能够在我们的Ubuntu中完成对Arm平台的程序的编译。同时也需要利用这个交叉编译工作链来制作我们需要的u-boot,kernel,以及根文件系统。以便在目标机上使用。2.4开发环境搭建环境搭建的主要是完成开发主机,目标机,开发介质间的连接关系。环境搭建的主要工作,安装交叉编译工具链arm-none-gnulinux-eabi-,配置tftp,nfs,samba等服务。Tftp主要是用于文件传输,用于开发中开发板通过网络从主机中下载,kenel,devicetree等文件。Nfs主要是用于网络文件系统的挂载,便于我们在主机段将嵌入式应用程序或者是驱动程序添加,便于直接进行调试。其配置过程大致如下所示:1、检查是否安装tftpserver,如果未安装,安装tftp-server。2、开启tftp后台守护进程服务。4、创建tftpboot共享文件目录,启动tftp-server。5、登陆本机测试,或者是开发板与主机文件传输测试。2.5Linux网络编程2.5.1Linux网络的介绍Linux操作系统的网络栈是其最大的特性。它源于最初BSD的网络协议栈,其接口非常易于使用和层次分明,组织逻辑性强。其调用接口是对网络协议层次的一个封装,socket套接字本身与协议无关,但是我们可以利用其提供的接口完成网络层和传输层的程序设计。本次设计以TCP/IP协议为服务器的主要通信协议,该通讯协议采用的4层的层级结构,分别为:应用层、传输层、网络层和网络接口层。2.5.2TCP/IP协议TCP/IP,为传输控制协议/因特网互联协议,它在实际上是4层协议的结合以一系列协议的集合。具体如表3-1所示。表3-1TCP/IP层级结构层级介绍应用层完成特定功能的协议层,如传输电子邮件协议(SMTP)、传输文件协议(FTP)、远程网络访问协议(Telnet)等。传输层此层主要是选择合适的网间路由和交换节点,确保数据的及时传送。分为传输控制协议(TCP)、用户数据报协议(UDP)等。它们主要是将数据链路层提供的帧组成数据包,包中的数据含有包头。网络层其功能主要是负责提供数据封包传送,确保所有封好的包都能够顺利到达对端(但不检查是否被接收正确),如网际协议(IP)。数据链路层对物理层的数据进行帧封装,添加必要的控制信息。它要保证数据帧在信道上无差错的传输。它主要功能包括物理地址寻址、数据封装成帧、流量控制、数据的检错、重发等。物理层它主要是规定数据的物理特性,它传输的最小单位是bit。2.5.3基于TCP/IP的C/S模型程序设计Linux提供了一个对网络的使用和条用接口socket,它本身与协议无关。由socket调用生成的文件描述符,可以提供给众多的API对其进行设置其属性。一般在整个网络络通信过程中,socket套接字就是我们与网络通信连接的桥梁,也是“一切皆文件”的体现。对该文件描述符,我们可以对其进行一系列的操作。来完成我们需要的网络编程。具体步骤如下所示:TCP服务器Socket(),获得一个filedescription。绑定主机IP,Port等信息到套接字文件上。用函数setsockopt()设置socket文件描述符的属性;用函数listen()创建监听队列;用函数accept()接受客户端的请求;用函数send()和recv(),或者read()和write()来进行收发数据;用close()关闭调用接口来关闭网络连接;TCP客户端Socket(),获得一个filedescription。绑定主机IP,Port等信息到套接字文件上(客户端可选)。Setsockopt()来设置socket套接字的属性(可选);设置要连接的服务器的IP和Port;连接服务器,用函数connect();用函数send()和recv(),或者read()和write()收发数据;Close()关闭网络连接。第三章系统的硬件电路设计3.1服务端硬件电路设计服务器的硬件平台主要由三星Exynos4412SOC,外围我们所用到UART1和UART2,以太网口,存储器,电源管理,运行状态指示灯,USB口7大部分组成。系统的硬件框图如图3-1所示。图3-1服务器硬件架构图SOC是嵌入式系统的核心,因为本系统需要运行一个服务器的主程序同时需要两个UART来和底层的控制电路部分进行通信,最重要的是要有足够的内存来实现我们多个进程的后台运行,因此我们最终选择了广州友善之弊公司提供的tiny4412开发板,该开发板的主控SOC采用的是三星公司的Exynos4412。3.2控制电路硬件设计3.2.1控制电路总体设计控制电路需要完成的主要任务是对各种传感器的驱动,控制不同外围硬件,同时又能够和我们的服务器进行通信,而且在考虑到功能强大的同时,我们必须对功耗做一定的限制,因此我们最终选择的主控MCU是当下最流行的意法半导体公司的一款高性能多引脚的STM32F103,它有100多个引脚,完全能够满足我们的底层控制模块,片内外设我们需要用到的I2C,UART1和UART2,定时器丰富,同时16个外部中断完全能够满足我们的设计需求。我们所需要的外设有温湿度传感器DHT22,三轴加速度和三轴陀螺仪传感器MPU6050,光照强度传感器GY302,红外传感器,以及我们系统需要的一个有源或者是无源蜂鸣器,两个LDE灯,一个步进电机,一个页面湿度传感器,一个蓝牙模块系统的硬件框图如图3-2所示。图3-2控制电路硬件框图3.2.2GPIO模块硬件电路设计GPIO是MCU和现代微控制处理器最核心的片内IO口模块,它主要完成系统的通用输入输出功能,我们的STM32F103ZET6一共有7组IO口,每组IO口有16个IO,一共是7*16=112个IO。丰富的IO口可完全满足我们的程序设计。在LED,报警器,步进电机中我们使用了IO口的输出功能完成了对外部模块的操作。在红外传感模块中,我们使用了IO口的输入功能完成了对人体红外的感应采集和处理。GPIO一共有4种输入模式和4种输出模式,其内部的输入输出配置如图3-3所示:图3-3GPIO模块图对于控制我们的LED,我们采用的是用两个上拉电阻接到我们的VCC,也就是说当我们的IO口给低电平的时候,LED灯会被驱动。LED0和LED1的电路如图3-4所示。报警器我们采用的是一个有源蜂鸣器,采用一个NPN型三极管与其串联,当给高电平时,使其驱动,给低电平时,关闭。LED模块和报警器的控制电路图如图3-4和3-5所示。 图3-4LED硬件图 图3-5报警器硬件图对于步进电机来说,其完成的功能是控制遮阳棚和顶棚,我的步进电机需要用四个通用IO口进行驱动,通过依次给每个引脚高电平来将其驱动。步进电机的原理图如图3-6所示。图3-6步进电机硬件电路图3.2.3I2C模块硬件电路设计对于I2C模块,在程序设计中我们主要是关注它的SDA,SCL这两根线,对于I2C总线而言,它是一种同步串行总线,时钟SCL由主设备控制,主要负责进行时序的控制,便于对I2C从设备的同步控制。而SDA则为数据总线。对数据进行收发。在本次设计中采用I2C通信的主要是GY-302光照强度传感器,和MPU6050三轴加速度和三轴陀螺仪传感器。通过读写这两个模块,来达到实时通信获得环境数据的目的,其硬件电路设计如下图3-7和图3-8所示。图3-7MPU6050模块I2C连接图图3-8GY302模块I2C连接图对于MPU6050模块来说,可以说是“短小精悍”,在如此小的模块之上竟有100多个寄存器,除了在本次实验中需要测量三轴加速度和三轴陀螺仪外,它还可以测量当前环境的温度,只是出于精度的考虑,在本设计中我们并没有去使用,而是采用精度更高的DHT22代替。在两个模块中ADDR是I2C从设备的地址,因I2C通信是多个I2C设备“并联”在同一根I2C总线上。因此,为了确保主设备能够正确找到I2C从设备,每个从设备都有一个地址,若需要接入2个相同模块,又或者说不同模块的I2C从设备地址相同,那么通过给ADDR不同的电平可以达到模块不同的从设备地址的目的。另外XDA,和XCL则是MPU6050用于拓展介入其他的I2C设备的。在这两个模块中,STM32控制部分,均采用的复用了IO口的片内I2C外设。3.2.4蓝牙通讯模块硬件电路设计蓝牙通信在本设计中必不可少,因为STM32采集的数据均是比特流的形式,因此采用比特流进行通信也就显得必不可少。而蓝牙通信模块作为比特流通信稳定可靠且节能的模块介质,也是我们设计所需要的。对于一个蓝牙模块来说,它分为主,从两个模块,主机是负责发射器,如同“广播”一样,从机作为一个接收器则主要是负责和主机进行配对。本次实验所采用的主从蓝牙一体机HC-05模块,因蓝牙协议的固件在蓝牙芯片厂商出厂时就已经设置完毕,本次设计不予深究。在使用时我们必须先用AT指令对蓝牙模块进行设定,主要包括如下:设定其中一个蓝牙模块为主机模式。设定蓝牙的配对码。设定任意连接模式。设定连个模块的串口收发的波特率、停止位,校验位,数据长度。设定完毕之后,蓝牙模块通电之后。其就相当于一根“串口线”,能够通过无线的方式,收发Server和STM32硬件模块之间的数据。其蓝牙模块连接图如图3-9所示。图3-9蓝牙模块连接图第四章系统软件设计4.1STM32控制电路软件设计Stm32硬件控制电路主要是完成和底层各个硬件模块的交互。主要负责和服务器进行交互,根据服务器不同的操作指令控制不同的外设,亦或是收集各个传感器的数据。同时能够给服务器进行反馈,以保障通信过程的可靠进行。具体控制的硬件模块和外设有:UART串口蓝牙模块,DHT22温湿度传感器模块,步进电机,光照传感器模块,三轴加速度和三轴陀螺仪MPU6050模块,红外感应模块,土壤湿度传感器模块。为了实现以上各个功能,我们需要完成UART串口驱动,I2C总线驱动,DHT22单总线的驱动,定时器timer驱动步进电机,GPIO电平监测驱动红外感应。4.1.1USART串口驱动USART,简称为通用串行异步输入输出总线,标准的串行RS232接口中有9针引脚,而往往在实际的数据传输中仅仅只需要两根线用于数据传输即可,即是RXD和TXD。因为其为异步通信,通信双方必须约定好一些通信协议,使得能够准确的进行收发数据,例如比特率,以及每帧有效数据的长度,校验位的类型,停止位的个数。虽然是异步通信,但是其全双工收发和无时序要求的特性,使得其在嵌入式应用和微控制领域的应用十分广泛。在嵌入式领域,它主要应用于主机和外围设备的通信,或者是高速率设备与低速设备间的通信。在本次设计中,我们的蓝牙模块就是使用UART总线与STM32和Exynos4412开发板进行通信,在STM32端我们只需要读写UART的收发缓冲区就能够实现数据的读写,在实际应用中,往往使用三根线(GND),来为双方提供统一的电平参考。其连线如下:图4-1UART连线原理图每个USART都有1个USART控制器,负责USART的各项设定,同时又能够读写缓冲区控制数据帧的输入和接收。其波特率,有效数据长度,奇偶校验位,停止位就显得特别重要,本次设计我们采用的是115200bps的波特率,8bit的有效数据长度,无校验位,1bit的停止位来实现蓝牙模块通信的相关功能。如下图4-2所示位USART的一帧数据格式。图4-2USART一帧数据格式在STM32中我们使用USART2来驱动我们的蓝牙和服务器进行通信。因为USART2复用使用的IO的PA2和PA3引脚,所以要将其复用。4.1.2I2C总线驱动I2C是微控制器和嵌入式设备中一种很常见的同步通信总线,它由两根线来完成通信,一个时钟总线由I2C主设备控制来控制时钟保持设备之间的同步,而另一根是数据总线,主从设备均可控制。对于从设备来说,其实它一直处于一个被动的状态,不会主动地往I2C总线上发送数据。因此I2C设备的连接方式就是将各个I2C设备“并联”起来。其连接模型如图4-3所示。图4-3I2C总线连接图I2C的收发数据,I2C设备之间必须遵循由主设备控制的I2C时序,一般一次的I2C通信都是由主设备发起。I2C数据线SDA上根据时序的变化,一般会有开始信号,I2C从设备地址,读/写标志位,I2C有效数据,应答信号和停止信号,具体见如下的I2C时序图。图4-4I2C传输时序图至于数据的流向,当主设备写操作的时候,主设备会主动地发送7bit从设备地址和1bit为‘0’的写操作位,然后等待从设备回应,再发送要操作的从设备寄存器地址。等待回应,最后发送要写的寄存器的值,最后发送停止位完成本次写操作。而对操作,其相当于一次“写”通信与一次“读”通信的结合,其在完成写操作后将主设备会重新进行I2C通信,发送7bit从设别地址和1bit的‘1’的度操作,然后等待从设备回应,发送要读的从设备的寄存器,等待从设备回应,并且从设备会回应相应寄存器的值,主设备再来确认,如果还有数据,从设备会继续读,直到从设备无响应,完成这一次I2C通信。STM32控制板中我们主要用I2C总线和MPU6050,光照传感器通信来获得需要的三轴加速度,三轴陀螺仪,温度,湿度的值。对于MPU6050,用PA6,PA7来分别复用I2C通信中的SCL和SDA,而对于光照传感器BH1750,用PB10和PB11来复用SCL和SDA。对与MPU6050,在与其进行的一次简单通信中,我们需要获得的数据包括6个字节的三轴加速度(每个方向上是用1个16bit数来表示),6bytes的三轴陀螺仪(每个方向上也是用1个16bit的数表示),还有并没有使用的温度也是占2个字节。所以应该根据需要来获得我们的数据。例如,对于三轴加速度来说,可能每个轴都是用两个8bit的寄存器来存储我们的数据。那所需要的就是用I2C通信来读取MPU6050内部相应的寄存器来获取相应的值。下列是利用I2C通信来完成初始化的工作。mpu6050_write_byte(MPU_PWR_MGMT1_REG,0X80);//复位MPU6050//设置陀螺仪和加速度的量程 mpu6050_set_gyro_fsr(0); //三轴陀螺仪量程0:±250dps mpu6050_set_accel_fsr(0); //三轴加速度量程0:±2g mpu6050_set_rate(50); mpu6050_write_byte(MPU_INT_EN_REG,0X00); //关闭所有的中断 mpu6050_write_byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭 mpu6050_write_byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO mpu6050_write_byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效 res=mpu6050_read_byte(MPU_DEVICE_ID_REG); if(res==MPU6050_ADDR){ mpu6050_write_byte(MPU_PWR_MGMT1_REG,0X01); mpu6050_write_byte(MPU_PWR_MGMT2_REG,0X00);//加速度和陀螺仪的三轴均工作 mpu6050_set_rate(50); //设置采样率为50KHz通过I2C通信来度寄存器获得我们三轴加速度和三轴陀螺仪。以获得三轴陀螺仪的数据位例,MPU6050读1个字节就是I2C通信的过程,如下程序所示。uint8_tbuf[2];//获取X轴的陀螺仪值 buf[0]=mpu6050_read_byte(MPU_GYRO_XOUTH_REG); buf[1]=mpu6050_read_byte(MPU_GYRO_XOUTL_REG); *gx=((uint16_t)buf[0]<<8)+buf[1];//获取Y轴的陀螺仪值 buf[0]=mpu6050_read_byte(MPU_GYRO_YOUTH_REG); buf[1]=mpu6050_read_byte(MPU_GYRO_YOUTL_REG); *gy=((uint16_t)buf[0]<<8)+buf[1]; //获取Z轴的陀螺仪值buf[0]=mpu6050_read_byte(MPU_GYRO_ZOUTH_REG); buf[1]=mpu6050_read_byte(MPU_GYRO_ZOUTL_REG); *gz=((uint16_t)buf[0]<<8)+buf[1]; 4.1.3温湿度传感器DHT22驱动DHT22是一款高精度的温湿度采集传感器模块,它为单总线结构设计,MCU和其通信便是通过这一根单总线,主要是由MCU控制其工作,DHT22被动发送温湿度数据,因其通信时间极短,数据采集稳定可靠,完全能够达到本次设计中对实时性和稳定性的需求。不仅如此,也因能够实现远距离传输,因此满足我们智能农场的需求,其连接图如图4-5所示。图4-5DTH22与MCU连接图DHT22通过1根单总线和MCU进行通信,因此时序的控制显得尤为重要。亦是说按照双方规定好的发送数据的顺序和规范进行收发。在DHT22中MCU和Sensor对总线的控制时间都在一个特定的时间段内。DHT22与MCU一次的通讯时间大概是在5ms左右,具体的数据格式将在下图图4-6中显示。图4-6DHT22一帧数据格式图当MCU发送一次信号以后,DHT22从睡眠模式进入工作模式,当主机发送start信号后,DHT22发送回应信号,然后把40bit的温湿度和校验数据发送出去,完成这一次信号采集。其时序工作如下图4-7所示。图4-7DHT22传输时序图所以对于DHT22的配置就显而易见了,首先发送1个开始或是复位信号,然后不断的去读取40bit的数据。uint8_tbuf[5]; uint8_ti; dht22_reset(); //DHT22复位(发送一个开始信号) if(dht22_check()==0){ //依次去读取40bit的数据 for(i=0;i<5;i++){ buf[i]=dht22_read_byte(); } }else{ return1; }//校验40bit数据的正确性 if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4]){ *humi10=((uint16_t)buf[0]<<8)+buf[1]; *temp10=((uint16_t)buf[2]<<8)+buf[3]; }4.1.4步进电机驱动程序设计在智能化农场的现代应用中,经常要考虑到要实现遮阳棚的打开关闭,又或者是土壤的松土等等,此时以步进电机来模拟遮阳棚和松土机。对于步进电机模块,主要分为两个部分:其一是步进电机的驱动板,另一个就是步进电机的实体。驱动板的目的是将MCU所发出的指令(正转、反转、转速),转换为步进电机工作时的模拟控制量,当然,它不是简单的数模转换。由上一章中步进电机的电路图可知,步进电机与MCU连接时使用了4个IO口。那么通过依次给这4个IO口高电平就能达到转的目的,给的方向决定了转的方向。而给高电平的时间同时又决定了转的速度,在本设计中出于只是模拟遮阳棚和松土的考虑,在转速和转向未做过多研究。本设计用1个2ms中断一次的定时器来控制其转速,转的方向采用的正向旋转,也就是依次从INT1~INT4给高电平,来达到设备驱动的目的。其STM32主要驱动程序如下所示。uint16_tphasecw[4]={GPIO_Pin_5,GPIO_Pin_4,GPIO_Pin_3,GPIO_Pin_2};//正转D-C-B-Auint16_tphaseccw[4]={GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_5};//反转A-B-C-Duint16_tori_data; //用于保存原始PF口的数据voidmotor_cw(void){ staticuint8_ti=0; GPIO_Write(GPIOF,ori_data|phasecw[i]); ++i; if(i==4)i=0;}voidmotor_ccw(void){ staticuint8_ti=0; GPIO_Write(GPIOF,ori_data|phaseccw[i]); ++i; if(i==4)i=0;}voidmotor_stop(void){GPIO_ResetBits(GPIOF,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);}4.1.5红外传感模块程序设计红外模块利用红外感应系统,当感应到人体红外时,其输出引脚会自动地由空闲时的低电平转换为高电平,并维持一定的时间后再由其低电平又重新回到高电平,完成一次红外感应过程。因此本次设计MCU只需要监测由高电平到低电平的变化,在监测高电平回到低电平的变化即可。因此采用一个外部中断IO来接收电平的变化。STM32支持19个外部中断、外部事件,因此需要将我们的IO口“挂载”特定的那根中断线上。本次设计上,将其挂载在外部中断线1上,并设置其双边沿触发。其中断处理程序如下所示: voidEXTI1_IRQHandler(void){delay_ms(10);if(SR501_INPUT==1){rs501_enter(); } elseif(SR501_INPUT==0){ rs501_exit(); }EXTI_ClearITPendingBit(EXTI_Line1);//清除终端标志位}voidrs501_enter(void){ BEEP_ON;}voidrs501_exit(void){ BEEP_OFF;}4.2Tiny4412服务端软件设计4.2.1服务程序介绍当下,服务器的时代是越来越重要。随着终端用户设备的兴起,服务器不可避免的要去扮演一个去服务当下众多用户的需求。而运行一个服务程序,需要将其部署在一个稳定的能够长期运行,而且维护性高,维护时间短,或者是维护不中断服务的系统之上。服务器的操作系统主要分为四大种类,Windows,Netware,Unix,Linux,对于现代的大多数服务程序来说,人们普遍选择的是Linux服务器。对于Linux操作系统来说,Linux是世界上的众多前辈在POSIX和Unix基础上开发而来的,它支持多用户,多任务,多线程,满足我们的开发需求,又因其开放源代码政策,使得基于该平台开发与使用无需支付任何的单位和个人的版权费用。因此它已成为当今服务类操作系统的主流。本课题的智能农场中服务程序则是基于Ubuntu16.04开发而来。Ubuntu是一个基于DebianGNU/Linux,以桌面应用为主的开源Linux操作系统,其成熟和稳定已经得到越来越多的厂商和个人的认可。服务程序一般后台运行,实时监控客户端的请求并做相应的处理。它永远处于一种被动的状态,也即是说它一直处于“被连接”,而不是“去连接”。对于我们的服务器程序,我们主要是要关注它的稳定性,实时性和有效性。还有其能够使用的系统资源。服务的主要有两个功能:与APP进行通信,处理用户的各种请求。控制stm32获取相应的信息和控制必要的功能。而且对于服务其来说,简单的过程话程序是完全不能满足我们的设计需求,因此,我们需要多进程,以及进程间的通信。4.2.2服务程序的设计需求一方面,我们需要去接收客户端的请求,完成客户端的相应功能。对于服务客户端来讲,我们主要完成的功能有:客户端客户的注册功能。客户端客户的登录功能。客户端的忘记密码功能。客户端客户的功能请求(控制设备或者是获得信息)。多客户端的处理。另一方面,服务器必须和设备控制器STM32硬件部分进行通信,通过蓝牙获得需要的各种数据,将其存起来,以便用户请求的时候能够快速响应。同时又必须根据用户的需求向STM32控制电路发送不同的请求,完成响应的操作。在服务器和客户端或者是服务器和控制电路的交互上,为了保证服务器正常地进行收发和控制,我们需要对通信协议作进一步的规范设计。参考TCP/IP协议簇中的相关协议,我们的通信协议也包含,报文类型、功能号、传输方向、控制指令,数据长度等。在与APP的通信上,因为是通过网络进行传输,速度依然不需要用很低速的数据帧进行传输了,我们可以采样更大量数据的报文段进行传输。因此在与APP的通信中,采用了Json键值对的形式。Json键值对分为键型和键值,中间采用冒号进行分隔。例如如下:第一组:“userName”:“Master”,第二组:“phoneNumber”:,第三组:“password”:“jiugeliu”.对于以上的三组键值对,其中userName,phoneNumber,passWord均为键型,而紧跟其后冒号后面的则为键值,userName的键值为Master,phoneNumber的键值password的键值则为jiugeliu。而将多个键值对叠加在一起并最后用两个大括号将其阔起来就形成了Json数据包例如{“userName”:“Master”,“phoneNumber”:,“password”:“jiugeliu”}即为一个Json数据包。而且各个键值对之间均是无序的,因此不管是对于生成和解析就方便了许多。生成时可以随时扩充,而在解析时,只需要根据键名就可以得到键值了。在本次设计中我们使用的键名及其宏如下表所示:表4-1键值宏-键名表KEY_USERNAME"userName"用户名KEY_PASSWORD"password"密码KEY_PHONENUM"phoneNumber"手机号KEY_STATECOD"stateCode"状态码KEY_USERTOKE"userToken"用户唯一识别码KEY_TEMPRATU"temperature"温度KEY_HUMIDITY"humidity"湿度KEY_LIGHTINT"light"光照强度KEY_ACCE_X"AcceX"X轴加速度KEY_ACCE_Y"AcceY"Y轴加速度KEY_ACCE_Z"AcceZ"Z轴加速度KEY_GYRO_X"GyroX"X轴陀螺仪KEY_GYRO_Y"GyroY"Y轴陀螺仪KEY_GYRO_Z"GyroZ"Z轴陀螺仪KEY_DEVNUMBE"deviceNumber"设备号KEY_DEVICODE"deviceCode"设备操作码KEY_DEVSTATE"deviceState"设备状态码在服务用户客户端的时候,当用户注册时,我们需要保存用户的的登录信息,同时,在用户进行登录时,我们呀要根据用户提供的用户名和密码来与保存的的用户信息进行比对,来判断用户验证信息是否正确。返回给用户登录码。因此我们不得不去使用数据库来存储用户信息表和登录状态表。数据库的种类十分之多,常见的有SQL,MySQL,Oracle。而在嵌入式产品中经常是一个极小型的数据库SQLite3,他的特点是免费开源,小巧精致。特别适合在嵌入式产品中使用。它实际上是一个软件库,无需服务器,无需手动配置。在本次设计中采用的便是SQLite3来完成记录用户登录信息的作用。4.2.4服务器软件架构设计服务端是本设计整个系统的核心,它不仅关系到系统的稳定性,而且好的有框架的模块化的服务端也能够进行移植和改进,用于以后其它服务程序和类似应用程序的复用。服务端在服务于用户端的同时,也要保证自己的可靠性。举一个简单的例子,它不能因为一条错误的指令或者是一帧错误的数据而是服务器出现任何的破坏甚至是崩溃。所以对于服务器的架构设计就在嵌入式产品和解决方案中显得尤为重要。在整个服务器的架构中,从整体上看。它需要服务于用户,此外它也必须作用于STM32控制电路。在整个框架上,可分为两个进程。父进程:与用户交互,处理用户的登录、注册、找回密码、控制硬件、获取环境信息等功能。在父进程中,我们可以创建一个线程池(简易理解为空线程“座位”),当来一个用户的时候,就给他分配一个“座位”,这样做的好处时,节省处理时间,使服务器反应能够更迅速。当有多个用户任务需要处理时,那么可以将其放入一个“任务队列”中,即所有创建的队列的单元都是一个客户任务。利用socket编程,一方面去检测监听套接字的请求,准备连接,另一方面,处理已经连接的套接字的任务,接收请求,通过子进程和STM32控制设备进行交互,然后再进行反馈。子进程:子进程中大致可分为三个线程。线程1不断地向STM32请求获得环境数据,也就是发送命令请求,存储起来,方便用户能够快速进行访问。另外两个线程主要负责串口的收和发,当接收到服务器的命令请求时,线程2进行串口发送命令请求,线程3用于从串口蓝牙上获取各种命令请求的反馈信息。这样的话形成了一个发送和接收的线程循环。通过消息队列来接受来自父进程的控制命令请求,通过共享内存来将从STM32上获取的各种数据传递给父进程,然后再给用户端。服务器的整个架构如下图所示。图4-8服务器程序架构图4.2.5服务器C++类抽象本设计为可移植性和代码利用性的考虑,全部代码采用Linux下C++编译完成,因此需要将整个框架中的类进行抽象,这样做的好处是便于我们后续对整体的框架的添加功能和裁剪功能。在一般的C++应用开发软件设计中,类的抽象显得尤为重要,每一个类对应一个功能模块的实现。换句话说,类组成了整个框架。所以,进行C++开发时我们往往是站在一个很高的角度在进行思考问题。在本次设计中,一方面需要与用户交互,又需要与STM32进行数据传输,同时在网络通信,队列化管理,进程和线程的并发处理,串口驱动等功能上实现模块化处理。因此抽象的类有服务器类、用户管理类、设备管理类、TCP服务器类、IPCObject类、线程池类、数据库类,链式队列类。它们的大致功能如下。用户管理类:管理用户任务,实现用户的登录、注册、控制设备、获取环境信息等,同时反馈给用户。服务器对象:对整个服务器的抽象,实现进程的创建,用户管理对象和设备管理对象的工作。设备管理对象:对设备进行管理,控制设备的收发调度,和设备统一控制。TCP服务端类:对整个服务器端的TCP收发任务进行管理,管理用户任务的接入、工作、退出。IPCObject类:对新型的进程间通信方式共享内存、消息队列、信号灯集的抽象。用于多进程的并发和数据的共享。线程池类:对线程池的对象,便于对多任务的快速处理。即申请好任务资源,留给任务线程来使用。数据库类:对用户信息的管理,具体是管理用户的用户名,密码,手机号和用户唯一识别码之间的对应关系。统一化用户管理。链式队列类:主要是对多任务进行队列化(先进先出)处理。4.3App应用软件设计4.3.1应用软件介绍应用化图形软件在当今时代的发展潮流可以说是高歌猛进,它的势头已经盖过了整个软件链上的任何一个其它部分。因此现如今,因其需求的如此之大,也诞生了一大批应用软件开发工程师。这样趋势正式由于应用软件的层次低位所决定的。应用软件,顾名思义是以应用为主要目的软件,一方面它必须要和用户进行界面的交互,这也是很重要的一环,因为好的界面交互会让人感觉到赏心悦目,流畅的界面也能弥补功能上的损失和缺陷,然而现实确是如此,用户体验已经占据了APP开发和更新维护的主旋律。另一方面,对于联网的APP,与服务器端的交互也显得尤为重要,协议的选择,数据传送的方式,数据的压缩等将会影响联网类APP的流畅性体验。最后也就是APP的维护和升级,为了便于稳步更新和易于维护,APP应用也必须采用模块化的处理。现如今,应用软件的开发平台也是多种多样。目前移动端的以Android应用开发市场最为广阔,Android应用又以Java的高度兼容性开支扇叶。然而本设计任采用嵌入式框架下的应用软件开发工具Qt5.8.0进行开发。Qt采用C++语言进行软件产品的开发,其中的类和库丰富,且已经封装的完美,它是嵌入式产品开发中常见的开发工具。同时不仅可以开发本平台,其源代码可以移植到任何平台。但是由于语言中类的兼容性考虑,可能移植后并不是十分完美。因此,本设计不采用任何移植。4.3.2应用软件功能分析本设计中,由于服务器器端的是一个多客户任务处理。因此,客户端的连接可以采用长连接,也可以是短连接。客户端如果要连接上服务器,就必须知道服务端的IP地址和端口号,因此必须有绑定IP和端口号的功能,在实际的应用开发中,因为服务段程序一段运行在有一个合法的IP服务器主机上,所以在客户端中,人们往往是将其固定,如果有域名,当然也可以采用域名来处理,但是端口是必须的。另外用户的登录和注册也是必不可少,用户登录的信息(包括用户名和密码)等都需要和用户交互去获取。当发送登录信息后,等待服务端的验证,会给用户反馈唯一的识别吧,以判断用户是否存在,或是用户名和密码是否正确。根据服务端返回的信息,如果是用户名或密码错误,会new一个新的对话框提示用户是否进行找回密码操作。如果是登录成功,则会进行进入一个智能农场管理的主界面。用户农场管理的主界面主要是将农场中的各种信息进行采集然后在汇总到一个界面,直观的显示给农场用户。在其中,农场中设备的控制也需要去添加此功能。所以数据的优化和界面的快速跳转就显得很重要。4.3.3APP架构设计APP主要是由类的拼接来实现全部的功能,有界面化的类又和界面绑定。在APP的设计中,因为每个图形界面其本质是1个类的对象,所以这也充分地体现了类在C++中的核心地位。本次在APP的开发设计中,我们创建的类如下。 TcpClient:用于TCP通信的客户端。 BindServer:用户绑定服务器的IP地址和端口号。 LoginWiget:用户用于登录的主界面。包含了获得用户信息及进入绑定IP界面,智能农场主界面,及注册主界面。 RegisterWidge:用户用于注册的主界面。包含了获得用户的用户名、密码、手机号注册信息。 DeviceManager:设备管理主界面。包含了控制农场中各种设备的按钮。各个类的通信与结合就构成了整个APP模块的框架。类之间的跳转就形成了界面之间的跳转,不过大部分界面之间都需要使用TCP协议和服务端进行通信。整个APP的架构如下图所示。图4-9APP程序架构图
第五章系统测试与性能分析5.1STM32控制模块测试STM32是整个农场系统的数据采集中心,所有的传感器模块均采用STM32进行驱动,因此STM32获得的数据将是整个系统的核心数据。因为STM32的数据最后都是通过蓝牙进行传输到服务器端,所以我们将蓝牙主设备与USB转串口CH340相连后插入电脑用串口调试助手进行测试。串口测试方法入下图所示。图5-1串口测试STM32图 测试主要包括,温度采集测试、湿度采集测试、光照强度采集测试、三轴加速度采集测试、三轴陀螺仪采集测试、控制LED测试、控制报警器测试、控制步进电机测试等。测试内容及结果如下表所示。表5-1测试命令结果表测试内容测试命令测试结果点亮LED10XBB0X990X000X01正确熄灭LED10XBB0X990X000X02正确控制LED20XBB0X990X010X01正确熄灭LED20XBB0X990X010X02正确开启舵机运转0XBB0X990X020X01正确关闭舵机运转0XBB0X990X020X02正确开启报警器0XBB0X990X030X01正确关闭报警器0XBB0X990X030X02正确获得温度数据0XCC0X990X000X01正确获得湿度数据0XCC0X990X010X01正确获得光照强度0XCC0X990X040X01正确获得三轴加速度0XCC0X990X020X01正确获得三轴陀螺仪0XCC0X990X030X01正确获得设备状态0XCC0X990X070X01正确通过蓝牙对STM32硬件上的各个模块的采集工作已经完毕,各模块均能够正常工作,指令有效且能够正确反馈信息。5.2Exynos4412服务端模块测试首先需要测试的是服务端的基本功能,包括服务器开启、父进程和子进程创建、任务队列的创建、数据库的创建、串口的打开、线程池的创建等。我们通过中断打印的方法来进行测试。Exynos4412的服务器是高速运行的,也就是说它会以很快的速度向STM32发送控制指令来要求获得环境信息。为了便于观察服务端是否能够正确发送指令,和获取环境信息,将服务器的采集信息间隔由原来的100ms增加为2s。便于我们直接进行观察。服务端的测试结果如下表5-2所示。表5-2服务运行功能模块测试表测试内容终端现象(信息)测试结果Socket接口Socketopensuccess正确创建任务队列Createtaskqueuesuccess正确创建线程池Createthreadpoolsuccess正确创建sqlite3数据库Createdatabasesuccess正确Uart控制OpenttyUSB0success正确创建消息队列Createmsgequeuesuccess正确创建共享内存Createsharememsuccess正确创建信号灯集Createsempahoresuccess正确获取设备状态STAT:0x10x100正确获取温度信息(温度x10)TEMP:0x010x04正确获取湿度信息(湿度x10)HUMI:0x020x01正确获取光照强度(关照强度x12)LIGH:0x000x53正确获取三轴加速度(实际数据x262)ACCE:0xD70x520x0D0x7C0x2C0x5A正确获取三轴陀螺仪(实际数据x3276)GYRO:0xFF0xDB0x00x1A0x00x03正确获取与用户的交互功能需要同APP一起连调。这部分的测试内容同APP一起在本章下节进行。5.3APP应用模块测试APP的测试主要包括:注册测试、登录测试、控制设备测试、获取环境信息测试、多用户任务测试。在进行登录之间,先要进行设置服务端的IP和端口号。界面如下图5-2和5-3所示。图5-2绑定服务端地址图图5-3绑定成功界面图当绑定完成之后,需要进行登录,登录界面如下所示。在登录时,服务器端会进行验证用户名和密码操作。如果用户请求的用户名和密码和服务器保存的不一致会要求注册或重新登录。登录和注册模块如下图5-4所示。图5-4APP登录界面图因为当前用户“hello”并不存在,所以服务器端无法进行识别。服务端收到的信息和反馈的“null”如下图5-5所示。图5-5服务端处理“无效”用户图客户端接收服务端的userToken后,处理如下图5-6所示。图5-6APP处理服务器反馈图因此我们需要对hello用户进行注册操作,注册模块界面及服务器的处理信息如下图5-7,5-8所示。图5-7用户注册界面图图5-8服务处理注册图因为已经注册,在服务端的数据库中已有该用户“hello”,所以,再次登录服务端的处理如下图5-9所示。图5-9服务端处理“存在”用户图当服务端匹配到“合法”的用户时,会返回给用户唯一的用户状态识别码,在用户的本次通信中,均需要用次识别码进行身份识别。这样做的一个好处,防止用户长时间不操作占用服务端资源。当登录成功后,用户端的主界面如下图5-10所示。图5-10用户信息主界面当用户点下左边那个大的按钮时,会进行环境信息采集。APP界面及服务端处理如下所示。图5-11APP采集信息动态显示图图5-12服务端处理“获取温度”图图5-13服务端处理“获取湿度”图图5-14服务端处理“获取光照强度”图图5-15服务端处理“获取三轴
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025陇塬大数据服务(定西)有限公司招聘53人(甘肃)备考考试题库及答案解析
- 2026内蒙古包头稀土高新区教育系统校园招聘20人(四)(内蒙古师范大学招聘站)模拟笔试试题及答案解析
- 2025天津久大环境检测有限责任公司招聘10人备考笔试题库及答案解析
- 中船集团第七〇八研究所2026届校园招聘模拟笔试试题及答案解析
- 2025福建三明沙县区第一中学高中编内招聘7人参考笔试题库附答案解析
- 2025广西玉林市博白县消防救援大队公开招聘政府专职消防员10人备考笔试试题及答案解析
- 2025年甘肃省新华书店有限责任公司招聘工作人员57人备考考试题库及答案解析
- 2025广西北海市残疾人康复培训中心招聘2人备考笔试题库及答案解析
- 2025海南省海宾酒店管理集团有限公司招聘2人参考考试题库及答案解析
- 2025湖南怀化市教育局直属学校招聘教职工65人模拟笔试试题及答案解析
- 财税托管托管合同范本
- 发现自己的闪光点课件
- 2025建筑节能工程监理实施细则
- 2025-2026学年苏教版(新教材)小学科学三年级上册科学期末复习卷及答案
- 发电厂汽轮机副操岗位考试试卷及答案
- 阿里合伙人合同
- 雨课堂在线学堂《临床中成药应用》作业单元考核答案
- 2025年皮肤科年度工作总结报告
- 实施指南(2025)《HGT 6114-2022 废酸中重金属快速检测方法 能量 - 色散 X 射线荧光光谱法》
- 厨师厨工考试题及答案
- 理化检测知识培训课件
评论
0/150
提交评论