5.2.1 实验内容
本实验为综合性实验,综合以上基础实验中的知识完成一个较为完整的场景应用设计。场景设置为室内舒适度检测,主要检测温度、湿度、气体浓度和光照强度几个方面。应用到dht11温湿度传感器、烟雾传感器和光敏传感器。设计思路为,检测温湿度来控制空调或加湿器的开关,检测气体浓度控制空气净化装置的开关,检测光照强度控制LED的亮度,设计中涉及的空调或空气净化等装置用继电器的开关状态代替显示实验现象。
温湿度传感器、光敏传感器和烟雾传感器模块为模拟输入的应用,控制的继电器的开关状态为数字输出的应用,控制LED的亮度为模拟输出的应用。
具体设计为,温湿度传感器、烟雾传感器以及光敏电阻模块检测到的数据都打印在屏幕上,定义整数型num计数温湿度传感器的校验正确的次数。判断温湿度以及气体浓度的数值是否适宜的方法:先记下校验第一次成功时温湿度以及气体浓度的数值,设置这三个数值为基数(最适宜的数值),之后每次校验和正确时检测到的数据和基数对比,温度值在19-30度范围内且变化上下浮动范围小于20%,湿度在30到80范围内且变化上下浮动小于30%,气体浓度小于5时为室内环境适宜,在屏幕上输出“Feel good!”字样;当检测到的数据不满足以上条件时,在屏幕上输出“Bad Bad!”字样,同时控制继电器打开。光敏电阻模块检测到的数据处理后控制LED的亮度,现象为,检测到的光强越大,LED亮度越小。
本实验的重要部分在于要对采集到的数据进行处理,处理后的数据要进行分析,针对不同的分析结果产生不同的实验现象。
5.2.2 需要的器材
- Dht11温湿度传感器模块,具体介绍参看模拟输入章节;
- 4线光敏电阻模块;
- 1路继电器模块x 2;
- MQ-2烟雾传感器模块;
- LED一个;
- 杜邦线若干。
5.2.3 实验步骤
- 连线方式如图所示,除模块的VCC和GND连线以外,Dht11模块数据线连接GPIO2,光敏电阻模块的模拟端口连A1口,继电器模块数据线连接GPIO5,烟雾传感器模块模拟端口连A0口,LED连接GPIO9口。
- 打开Arduino IDE,新建项目;
- 编写代码(以下为参考代码);
- 编译并上传到PcDuino开发板中,观察实验现象。
5.2.4 实验代码
#include <core.h>
#include "dht11.h"
dht11 DHT11;
int pinDHT11 = 2; //gpio2
int checkSum;
int val;
int intensity;
int led1_pin=9;
int led2_pin=5;
int num;
int humi_1;
int tem_1;
int val_1;
float a;
float b;
void setup() {
pinMode(led1_pin,OUTPUT);
pinMode(led2_pin,OUTPUT);
num=1;
}
void loop() {
//read
printf("\nWaiting...\n");
checkSum = DHT11.read(pinDHT11);
//judge
switch (checkSum)
{
case DHTLIB_OK:
printf("Correct checksum.\n");
break;
case DHTLIB_ERROR_CHECKSUM:
printf("Incorrect checksum! \n");
break;
case DHTLIB_ERROR_TIMEOUT:
printf("Timeout error! \n");
break;
default:
printf("Unknow error!\n");
break;
}
//show
if(checkSum == DHTLIB_OK){
num=num+1;
printf("num=%d, Humidity: %.lf\%, Temperature: %.lf\%, ", num, (float)DHT11.humidity, (float)DHT11.temperature);
}
val=analogRead(0);
printf("Val: %.lf\%, ", (float)val);
intensity=analogRead(1);
printf("Intensity: %.lf\%\n", (float)intensity);
analogWrite(led1_pin,intensity);
//humi_tem_val
if(num==2){
humi_1=DHT11.humidity;
tem_1=DHT11.temperature;
val_1=val;
}
else if(num > 2){
a=abs((humi_1-DHT11.humidity)/humi_1);
b=abs((tem_1-DHT11.temperature)/tem_1);
}
else printf("wrong!!");
if(DHT11.humidity <= 80 && DHT11.humidity >= 30 && DHT11.temperature <= 30 && DHT11.temperature >= 19 && val < 5){
if(a<=0.3 && b<=0.2)
{
digitalWrite(led2_pin,LOW);
printf("Feel good!\n");
}
else {
digitalWrite(led2_pin,HIGH);
printf("Bad!Bad!\n");
}
}
else {
digitalWrite(led2_pin,HIGH);
printf("Bad!Bad!\n");
}
printf("humi_1: %.lf\%, tem_1: %.lf\%, val_1: %.lf\%, \n\n", (float)humi_1, (float)tem_1,(float)val_1);
delay(2000);
// put your main code here, to run repeatedly:
}
5.2.5 实验结果
- 提高温度到30度以上,继电器开关打开;
- 增加气体浓度到5以上,继电器开关打开;
- 改变亮度,观察灯泡亮度,外界亮度大时,LED变暗,反之变亮。
- 屏幕上显示如下:左图为检测到的各项数值都符合要求时的状态;右图为不符合适宜度要求的情况。
- 每一次检测的五行数据为别为:
①Waiting…字样表示将进行下一次检测;
②温湿度传感器的校验数据是否正确;
③若校验和正确,则num+1,且打印温湿度、气体浓度,光强(数值越大表示光强越弱)的值;
④此时的各项数据是否符合适宜度要求(Feel good! /Bad Bad!);
⑤温湿度以及气体浓度的最适宜值(首次检测的基准值)。