版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[1]图3-3PMS5003实物外形图3-4颗粒物传感器原理图图3-4颗粒物传感器原理图3.1.3MAX44009光照强度传感器本次设计采用了使用I2C总线的光照传感器MAX44009,其具有外围电路简单,数据采集方便,可靠性高,引脚数量少等优点,其有效量程范围为0.045lux至188,000lux,能够完整覆盖本次设计所需光照强度探测范围。图3-5图3-5光照传感器部分原理图3.1.4SHT20温湿度传感器本次设计,采用了sensirion公司生产的SHT20型温湿度传感器,其具有体积小,精度高,可靠性好,功耗低等优点。SHT20外围电路与Arduino信号线接口部分电路原理图如下图所示。SHT20在本次设计中,与MAX44009挂载与同一I2C总线上,并由Arduinomega进行数据处理与发送。图3-6温湿度测量部分原理图3.1.5热释电传感器图3-6温湿度测量部分原理图本次设计中,采用了8只热释电感应模块组成阵列,以实现对控制目标区域的有效观测,热释电传感器的工作模式设定为多次重复,即不断电复位可多次输出有效电平,延时模式设定为一分钟,足以让被探测行人在灯光亮起时长内走出探测区域。热释电传感器(PIR)与ArduinoMega信号线电路硬件连接如图所示。3.2室内传感器/解码系统硬件设计图3-7热释电部分原理图3.2.1MAX44009光照强度传感器图3-7热释电部分原理图本次设计中,室内传感器MAX44009部分与室外传感器连接方式相同,挂载于Arduinomega的硬件I2C接口(D20D21)上,MAX44009外围电路与ArduinoMega信号接口部分电路原理图如下图所示。图3-8光照传感器原理图3.2.2SHT20温湿度传感器图3-8光照传感器原理图与室外传感器硬件连接方式一致,同样与MAX44009挂载于同一I2C总线之上,SHT20外围电路与Arduino信号线接口部分电路原理图如下图所示。图3-9温湿度传感器原理图3.2.4PLC接口电路部分图3-9温湿度传感器原理图PLC电路接口部分,采用继电器输出形式,COM公共端连接外置电源GND端,各端口连接至外围模块GND端。3.3PLC外围硬件定义I0室内传感器信号输入端I0.0:光强度低信号输入端I0.1:光强度高信号输入端I0.2:温度低信号输入端I0.3:温度高信号输入端I0.4:湿度低信号输入端I0.5:湿度高信号输入端I1室外传感器信号输入端I1.0:光强度低信号输入端I1.1:光强度高信号输入端I1.2:温度低信号输入端I1.3:温度高信号输入端I1.4:湿度低信号输入端I1.5:湿度高信号输入端I1.6:空气内颗粒物报警信号输入端I2.0-I2.7:热释电信号输入端Q0伺服信号输出端Q0.0:空气过滤器控制端Q0.1:门窗开关控制端Q0.2:加温器控制端Q0.3:遮光装置控制端Q0.4:除湿装置控制端Q0.5:室内照明开关Q1.0-Q1.7:灯光控制端4系统软件设计4.1室外传感器系统设计图4-1室外传感器程序流程图图4-1室外传感器程序流程图4.1.1MAX44009部分#include"MAX44009.h"uint16_tcur_PM25,cur_PM10,cur_Temp,cur_Humi,cur_Light;boolLightL_ACT,LightR_ACT;constuint16_tLight_L=400,Light_R=1500;if(light.begin()){Serial.println("[ERROR]Lightsensorfailed");while(1);}cur_Light=light.get_lux();Serial.println("Light:\t"+(String)cur_Light);delay(100);if(cur_Light<=Light_L){Serial.println("LightL_ACT=1");LightL_ACT=true;LightR_ACT=false;digitalWrite(LightL_PIN,HIGH);digitalWrite(LightR_PIN,LOW);cur_status|=1;cur_status<<=2;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}elseif(Light_R<=cur_Light){Serial.println("LightR_ACT=1");LightL_ACT=false;LightR_ACT=true;digitalWrite(LightL_PIN,LOW);digitalWrite(LightR_PIN,HIGH);cur_status<<=1;cur_status|=1;cur_status<<=1;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}else{Serial.println("Light_ACT=0");LightL_ACT=false;LightR_ACT=false;digitalWrite(LightL_PIN,LOW);digitalWrite(LightR_PIN,LOW);cur_status<<=2;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}声明库函数,调用<MAX44009.h>头文件,并内定义光照强度高低阈值信号变量名及数据返回类型;设置光照强度检测数值阈值,单位lux;初始化函数,若无返回值则通过串口输出报错信息;在Voidloop()主循环内,调用相关库函数,读取传感器返回数值;对返回值与预设阈值进行比较判断,并根据进行数据编码送入指定字符串中等待发送。4.1.2PMS5003程序部分(1)#include"pms.h"(2)PmsAltSerialpmsSerial;pmsx::Pmspms(&pmsSerial);uint16_tcur_PM25,cur_PM10;(3)boolPM25L_ACT,PM25R_ACT;(4)constuint16_tPM25_L=0,PM25_R=200;(5)Serial.println(pmsx::pmsxApiVersion);if(!pms.begin()){Serial.println("[ERROR]PMScommunicationfailed");return;}pms.setPinReset(pinReset);pms.setPinSleepMode(pinSleepMode);if(!pms.write(pmsx::PmsCmd::CMD_RESET)){pms.write(pmsx::PmsCmd::CMD_SLEEP);pms.write(pmsx::PmsCmd::CMD_WAKEUP);}pms.write(pmsx::PmsCmd::CMD_MODE_PASSIVE);pms.write(pmsx::PmsCmd::CMD_READ_DATA);pms.waitForData(pmsx::Pms::TIMEOUT_PASSIVE,pmsx::PmsData::FRAME_SIZE);pmsx::PmsDatadata;autostatus=pms.read(data);if(status!=pmsx::PmsStatus::OK){Serial.print("PMSsensor:");Serial.println(status.getErrorMsg());}pms.write(pmsx::PmsCmd::CMD_MODE_ACTIVE);if(!pms.isWorking()){Serial.println("[ERROR]PMSsensorfailed");} switch(status){casepmsx::PmsStatus::OK:{Serial.println("_________________");constautonewRead=millis();Serial.print("Waittime");Serial.println(newRead-lastRead);lastRead=newRead;autoview=data.raw;cur_PM25=view.getValue(4);cur_PM10=view.getValue(5);Stringstr;str=String(cur_PM25)+"\t"+view.getName(4)+"["+view.getMetric(4)+"]"+"|diameter:"+view.getDiameter(4);Serial.println(str);str=String(cur_PM10)+"\t"+view.getName(5)+"["+view.getMetric(5)+"]"+"|diameter:"+view.getDiameter(5);Serial.println(str);if(cur_PM25<0||cur_PM25>1000||cur_PM10<0||cur_PM10>1000){Serial.println("[ERROR]PMSDATAERROR");gotoloopend;}(6)if(cur_PM25<=PM25_L){PM25L_ACT=true;PM25R_ACT=false;digitalWrite(PM25L_PIN,HIGH);digitalWrite(PM25R_PIN,LOW);Serial.println("PM2.5L_ACT=1");cur_status|=1;cur_status<<=1;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}elseif(PM25_R<=cur_PM25){PM25L_ACT=false;PM25R_ACT=true;digitalWrite(PM25L_PIN,LOW);digitalWrite(PM25R_PIN,HIGH);Serial.println("PM2.5H_ACT=1");cur_status|=1;cur_status<<=1;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}else{PM25L_ACT=false;PM25R_ACT=false;digitalWrite(PM25L_PIN,LOW);digitalWrite(PM25R_PIN,LOW);Serial.println("PM2.5_ACT=0");cur_status<<=1;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}delay(100);break;}casepmsx::PmsStatus::NO_DATA:{Serial.println("[INFO]PMSNODATA");gotoloopend;break;}default:{Serial.print("[ERROR]PMSerror:");Serial.println(status.getErrorMsg());gotoloopend;}}声明库函数,调用相关头文件;调用软串口函数,并设置变量类型;定义空气内颗粒物密度判定阈值变量;预设相关数据判定阈值;初始化PMS5003,若通讯错误则串口输出报错信息;Voidloop()循环内PMS相关函数,读取程序返回值并判断,将结果输入字符串中等待发送,若数据错误则不执行后续程序,并发送报错信息。4.1.3SHT20程序部分#include"uFire_SHT20.h"声明SHT20对应库函数。boolTempL_ACT,TempR_ACT;boolHumiL_ACT,HumiR_ACT;定义温度、湿度变量。constuint16_tTemp_L=15,Temp_R=30;constuint16_tHumi_L=20,Humi_R=60;设定变量阈值。SHT20.measure_all();cur_Temp=SHT20.tempC;cur_Humi=SHT20.RH;voidloop()循环内定义变量与返回值if(cur_Temp<=Temp_L){Serial.println("TempL_ACT=1");TempL_ACT=true;TempR_ACT=false;digitalWrite(TempL_PIN,HIGH);digitalWrite(TempR_PIN,LOW);cur_status|=1;cur_status<<=2;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}elseif(Temp_R<=cur_Temp){Serial.println("TempR_ACT=1");TempL_ACT=false;TempR_ACT=true;digitalWrite(TempL_PIN,LOW);digitalWrite(TempR_PIN,HIGH);cur_status<<=1;cur_status|=1;cur_status<<=1;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}else{Serial.println("Temp_ACT=0");TempL_ACT=false;TempR_ACT=false;digitalWrite(TempL_PIN,LOW);digitalWrite(TempR_PIN,LOW);cur_status<<=2;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}if(cur_Humi<=Humi_L){Serial.println("HumiL_ACT=1");HumiL_ACT=true;HumiR_ACT=false;digitalWrite(HumiL_PIN,HIGH);digitalWrite(HumiR_PIN,LOW);cur_status|=1;cur_status<<=2;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);}elseif(Humi_R<=cur_Humi){Serial.println("HumiR_ACT=1");HumiL_ACT=false;HumiR_ACT=true;digitalWrite(HumiL_PIN,LOW);digitalWrite(HumiR_PIN,HIGH);cur_status<<=1;cur_status|=1;cur_status<<=1;Serial.print("\t\t[DEBUG]");Serial.println(cur_status,BIN);读取库函数返回值,并与预设阈值进行比较。将比较结果送入变量字符串中。4.1.4热释电传感器部分constuint16_tPIR_PIN[9]={0,54,55,56,57,58,59,60,61};定义热释电传感器引脚对应数组for(uint16_ti=1;i<=8;i++){pinMode(PIR_PIN[i],INPUT);}读取引脚数组,并初始化设定引脚为输入状态。for(uint16_ti=1;i<=8;i++){if(digitalRead(PIR_PIN[i])==HIGH){cur_status|=1;}cur_status<<=1;}读取引脚状态,并将输入结果送入结果判定数组内。4.1.5串口发送程序Serial.begin(9600);Serial1.begin(9600);设定串口0串口1工作模式与波特率。八位数据帧,无校验位,停止位1,波特率9600。Serial1.print('S');Serial1.println(cur_status,BIN);串口1,将特定格式判断结果数组发送。4.2室内传感器部分图4-2室内传感器部分程序流程图4.2.1SHT20温湿度传感器与MAX44009传感器部分图4-2室内传感器部分程序流程图本部分移植自室外传感器部分,因此除去逻辑判断并输出引脚电平部分不同外,其余代码基本一致。#include"uFire_SHT20.h"声明SHT20对应库函数。boolTempL_ACT,TempR_ACT;boolHumiL_ACT,HumiR_ACT;定义温度、湿度变量。constuint16_tTemp_L=15,Temp_R=30;constuint16_tHumi_L=20,Humi_R=60;设定变量阈值。SHT20.measure_all();cur_Temp=SHT20.tempC;cur_Humi=SHT20.RH;voidloop()循环内定义变量与返回值cur_Light=light.get_lux();Serial.println("Light:\t"+(String)cur_Light);delay(100);SHT20.measure_all();cur_Temp=SHT20.tempC;cur_Humi=SHT20.RH;Serial.println("Temperature:\t"+(String)cur_Temp+"°C");Serial.println("RH:\t"+(String)cur_Humi+"%");//Serial.println((String)SHT20.vpd()+"kPaVPD");//光传感器和SHT20采样if(cur_Light<=Light_L){Serial.println("LightL_ACT=1");LightL_ACT=true;LightR_ACT=false;digitalWrite(LightL_PIN,HIGH);digitalWrite(LightR_PIN,LOW);}elseif(Light_R<=cur_Light){Serial.println("LightR_ACT=1");LightL_ACT=false;LightR_ACT=true;digitalWrite(LightL_PIN,LOW);digitalWrite(LightR_PIN,HIGH);}else{Serial.println("Light_ACT=0");LightL_ACT=false;LightR_ACT=false;digitalWrite(LightL_PIN,LOW);digitalWrite(LightR_PIN,LOW);}if(cur_Temp<=Temp_L){Serial.println("TempL_ACT=1");TempL_ACT=true;TempR_ACT=false;digitalWrite(TempL_PIN,HIGH);digitalWrite(TempR_PIN,LOW);}elseif(Temp_R<=cur_Temp){Serial.println("TempR_ACT=1");TempL_ACT=false;TempR_ACT=true;digitalWrite(TempL_PIN,LOW);digitalWrite(TempR_PIN,HIGH);}else{Serial.println("Temp_ACT=0");TempL_ACT=false;TempR_ACT=false;digitalWrite(TempL_PIN,LOW);digitalWrite(TempR_PIN,LOW);}if(cur_Humi<=Humi_L){Serial.println("HumiL_ACT=1");HumiL_ACT=true;HumiR_ACT=false;digitalWrite(HumiL_PIN,HIGH);digitalWrite(HumiR_PIN,LOW);}elseif(Humi_R<=cur_Humi){Serial.println("HumiR_ACT=1");HumiL_ACT=false;HumiR_ACT=true;digitalWrite(HumiL_PIN,LOW);digitalWrite(HumiR_PIN,HIGH);}读取库函数返回值,并与预设阈值进行比较。并将对应引脚电平输出。4.2.2串口数据读取解码输出部分uint16_tPINS[]={0,10,11,12,13,14,15,16,21,22,23,24,25,26,27,28};bools[20];定义接收变量数组。if(Serial1.available()>0){t1=Serial1.read();if(t1=='S'){for(uint16_ti=0;i<=16;i++){while(Serial1.available()==0){}t2=Serial1.read();if(i==0||i==16){continue;}if(t2=='0'){s[PINS[i]]=0;Serial.println("i="+(String)i+",LOW");}elseif(t2=='1'){s[PINS[i]]=1;Serial.println("i="+(String)i+",HIGH");}else{Serial.println("[ERROR]dataerror,i="+(String)i);}}}delay(2);}接收串口数据,并获取有效数据,将判断结果赋值给指定数组。if(digitalRead(P)==HIGH){for(uint16_ti=1;i<=15;i++){digitalWrite(PINS[i],s[i]);}}根据数组内部数值,对各输出引脚状态寄存机赋值。if(digitalRead(P)==HIGH){for(inti=1;i<=15;i++){digitalWrite(PINS[i],s[i]);}}若检测到PLC给出信号,则刷新各引脚状态。4.3PLC主控程序部分采光控制部分PLC程序段,当处于上课/晚自习时间时,自动监测室内外灯光强度,根据程序段进行遮光及开灯补光等动作。图4-3光照控制部分程序空气质量及温湿度控制部分,根据各传感器发送至I输入口信号,根据预设逻辑判断并控制相关设备,对室内湿度,温度,空气质量等进行控制与调整。例如空气颗粒物指数过高时自动关闭门窗,并将空气过滤装置开启,以维持室内空气洁(PM2.5<75μg/m³)。图4-3光照控制部分程序图4-4温湿度控制部分程序室外走廊灯部分控制程序,根据RTC时钟,自动判断处于何种时段,并选取对应控制逻辑对走廊内灯光进行控制。白天上课时段,将根据室外光照强度,判断是否需要对走廊进行补光照明,并在行人经过时自动开启热释电传感器对应的图4-5走廊灯控制程序图4-4温湿度控制部分程序图4-5走廊灯控制程序为预设变量设定初始值,PLC上电后SM0.0上电一个扫描周期,执行MOV_B语句,并将其预定数值装定进入系统RTC时钟。图4-7图4-7RTC时钟设置部分(2)图4-8读取RTC图4-8读取RTC时钟程序段图4-10时间判断程序(2)图4-9时间判断程序(1)将VW23内当前时间数据与预设时间阈值比较,并将对应辅助继电器线圈通激活对应不同时间段控制系统工作状态。图4-10时间判断程序(2)图4-9时间判断程序(1)5传感器平台搭建测试及PLC仿真调试5.1传感器平台通过USB连接室外传感器平台与电脑,打开串口监视器,读取debug信息与编码后逻辑判断信息。检测无误后开始检查室内传感器。用USB线缆连接室内传感器主控板与电脑,打开串口监视器,查看DEBUG信息,解码与逻辑判断输出正常。图5-1485图5-1485总线信号波形图(时基5ms)5.2PLC主控测试图5-3图5-3装载PLC程序图5-2设定PLC对应CPU型号装载完成程序后,将仿真软件调整为RUN状态,开始测试。5.2.1热释电控制走廊灯部分测试首先在设置内,更改时间为上课时间(6:30——18:30),并将室外光L端(I1.0)置于有信号输入状态,随后将热释电信号输入端(I2.0)随机选择送入信号,观察输出状态。图5-5热释电控制端信号输入——输出状态测试结果表明,在测试条件室外光照强度不足/夜间等状态时,热释电控制端可通过接受对应信号控制走廊灯开启及关闭。5.2.2室内补光/遮光部分测试如图所示,当室内光线过暗时,程序根据设定,自动打开室内照明灯(Q0.5),进行补光照明。如图所示,当室外光线过强时,自动开启遮光装置(Q0.3),并自动开启室内照明灯(Q0.5)。图5-6室内光照过暗时PLC输出图5-6室内光照过暗时PLC输出图5-7室外光线过强时输出5.2.3空气质量及温湿度控制部分将空气污染警告(I1.6)信号置位,可观测到PLC控制门窗关闭(Q0.1)并控制空
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工商局安全员招聘合同范本
- 土建承包合同样本
- 医药研发项目投标文件
- 旅游设施维修工程管理办法
- 化工项目招投标保函样本
- 体育场馆施工合同
- 体育馆音响系统安装合同
- 婚庆行业代收代付业务流程
- 施工项目合作合同条件
- 企业无担保借款合同
- 写作进阶之道智慧树知到期末考试答案章节答案2024年内蒙古大学
- 6.2 东北地区的人口与城市分布(课件) 八年级地理 (湘教版)
- 新中国史智慧树知到期末考试答案章节答案2024年大连海事大学
- 压花艺术-发现植物之美智慧树知到期末考试答案章节答案2024年华南农业大学
- 电大财务大数据分析编程作业3
- Q∕GDW 1480-2015 分布式电源接入电网技术规定
- 中华传统文化与人生修养智慧树知到期末考试答案2024年
- (正式版)JBT 3135-2024 镀银圆铜线
- ASME-第九卷焊接和钎焊评定标准-资料
- 2024年度人力资源管理的核心招聘与配置
- 《银行柜面业务处理》课件
评论
0/150
提交评论