#include <LiquidCrystal.h> //调用Arduino自带的LiquidCrystal库
#include <dht11.h> //调用Dht库
const int PM_LV_A = 35; //定义优质空气质量级别
const int PM_LV_B = 75; //定义良好空气质量级别
const int PM_LV_C = 115; //定义通常空气质量级别
const int PM_LV_D = 150; //定义轻度污染空气质量级别
const int PM_LV_E = 250;// 定义轻中重度污染空气质量级别//温湿度传感器库,定义PM2.5污染指数级别
//设定控制LED的数字IO脚
int ledPin1=7;
int ledPin2=8;
int ledPin3=9;
int ledPin4=10;
//颗粒物传感器接口定义
const int dustPin=A1; //设置arduino模拟信号接口A1为pm2.5传感器采集口
int dustvA1=0; //设置pm2.5传感器初始值
const int Sharp=6; //设置arduino数字信号接口2为pm2.5传感器LED发射口
int delayTime=280; //设置传感器延时
int delayTime2=40; //设置传感器延时
float offTime=9680; //设置pm2.5传感器采样时间
float pm25_vA1 = 0; //设置pm2.5传感器初始值,0.5v电压相当于每立方米0.1mg颗粒物含量:0.1mg/m3
//LCD1602液晶屏接口对arduino端口定义,采用4bit传送,数据分别从D4、D5、D6、D7传输
const int RS = 12; //-------------
const int EN = 11; //-------------
const int D4 = 5; //-------------数据分别从D4、D5、D6、D7传输
const int D5 = 4; //-------------
const int D6 = 3; //-------------
const int D7 = 2;
; //-------------
//设置LCD1602液晶接口
LiquidCrystal lcd(RS,EN, D4, D5, D6, D7);
//快速刷新模式定义
const int FAST_REFRESH_MODE=9; //定义打开/关闭快速读取(最快3秒)的引脚:支持2种模式,即快速开关模式或者平均值模式
boolean FAST_REFRESH = true; //快速刷新模式(Off)
const int AVG_COUNTS = 2; //定义平均值模式每次平均采样次数,例如定义为10,即为每30s获取一次平均值(每3秒读一次)
int pm_list[AVG_COUNTS]; //缓存数组(实际并未使用),可扩展为将历史数据记录在设备中供设备读取
int pm_list_sum; //平均值模式的累积合计变量
int pm_avg ; //PM25平均值
//DHT11温湿度传感器
dht11 DHT11;
#define DHT11_PIN A0 //重新定义A0为获取DHT11的数据引脚(使用模拟量输入口,可以改为其它温度传感器,例如LM35)
//Arduino初始化函数setup()
void setup(){
Serial.begin(9600); //串口通讯速率9600
pinMode(ledPin1,OUTPUT);//设定数字IO口的模式,OUTPUT 为输出
pinMode(ledPin2,OUTPUT);//设定数字IO口的模式,OUTPUT 为输出
pinMode(ledPin3,OUTPUT);//设定数字IO口的模式,OUTPUT 为输出
pinMode(Sharp,OUTPUT); //设置ledpower接都为信号输出
pinMode(10, OUTPUT); //设置arduino数字4口为输出端,此处作为10口为开时亮灯
pinMode(FAST_REFRESH_MODE,INPUT); //设置arduino数字10口为输入端
lcd.begin(16, 2); //初始化LCD
delay(1000); //延时1000ms
pm_list_sum = 0; //初始化
}
//Arduino循环执行函数loop()
void loop(){
int pm25int = 0; //设置pm2.5初始值
//--get temperature and humdity
if (digitalRead(FAST_REFRESH_MODE) == HIGH) //PM2.5传感器控制程序
{
FAST_REFRESH = true;
}
else
{
FAST_REFRESH = false;
}
int chk = DHT11.read(DHT11_PIN);
switch (chk) //检测数值串口输出信息
{
case 0:
Serial.print("OK,\t"); //如果数据为0,串口输出采集正常。
break;
case -1:
Serial.print("Checksum error,\t"); //如果数据为-1,串口输出--错误。
break;
case -2:
Serial.print("Time out error,\t"); //如果数据为0,串口输出时间溢出。
break;
default:
Serial.print("Unknown error,\t"); //串口输出未知错误。
break;
}
//-------------------------------------------------------------------------------
if (!FAST_REFRESH)
{
pm_list_sum = 0; //---------------
pm_avg = 0; //---------------
for(int i=0;i<AVG_COUNTS;i++)
{
// ledPower is any digital pin on the arduino connected to Pin 3 on the sensor
digitalWrite(Sharp,LOW); //接通颗粒物传感器led灯电源
delayMicroseconds(delayTime); //延时
dustvA1=analogRead(dustPin); //读取颗粒物传感器第五模拟口电压数值
delayMicroseconds(delayTime2); //延时
digitalWrite(Sharp,HIGH); //关闭颗粒物传感器led灯电源
delayMicroseconds(offTime); //延时
pm25_vA1 = dustvA1 * 0.83984375 - 99.9 ; //计算pm2.5采集数值
int pm25int = dustvA1 * 0.83984375 - 99.9 ; //------------------
if (pm25int < 0) //------------------
{
pm25int = 20; //给Pm2.5int变量赋初始值
}
pm_list_sum = pm_list_sum + pm25int; //------------------
delay(3000); //延时3000ms
}
pm_avg = pm_list_sum / AVG_COUNTS; //计算pm2.5数据平均值
}
else
{
// 颗粒物传感器LED电源引脚接在arduino的第D3接口
digitalWrite(Sharp,LOW); //接通颗粒物传感器led灯电源
delayMicroseconds(delayTime); //延时
dustvA1=analogRead(dustPin); //读取颗粒物传感器第五模拟口电压数值
delayMicroseconds(delayTime2); //延时
digitalWrite(Sharp,HIGH); //关闭颗粒物传感器led灯电源
delayMicroseconds(offTime); //延时
pm25_vA1 = dustvA1 * 0.83984375 - 99.9 ; //------------------
pm25int = dustvA1 * 0.83984375 - 99.9 ; //------------------
delay(3000); //延时3000ms
}
{
if (!FAST_REFRESH)
Serial.print("Tmp:"); //串口发送“Temperature:”字符
Serial.print(DHT11.temperature); //串口发送温度数值
Serial.print("[C]"); //串口发送“[C]”字符
Serial.print(","); //串口发送“,”字符
Serial.print("Hum:"); //串口发送“Humdity:”字符
Serial.print(DHT11.humidity); //串口发送湿度数值
Serial.print("%"); //串口发送“%”字符
Serial.print(","); //串口发送“,”字符
Serial.print("PM2.5:"); //串口发送“PM25:”字符
Serial.print(pm25_vA1); //串口发送PM2.5数值
Serial.println(pm_avg); //串口发送PM2.5平均
Serial.println("[ug/m3]"); //串口发送“[ug/m3]”字符
//LCD液晶显示信息
lcd.clear(); //LCD1602液晶清屏
lcd.setCursor(0,0); //设置LCD1602光标在第一行第一格
lcd.print("PM2.5:"); //LCD1602输出“D=”
lcd.print(pm_avg); //LCD1602输出PM2.5平均采样值
lcd.print(" ug/m3"); //LCD1602输出“D=”
//选择输出空气污染指数级别
if (PM_LV_A > pm_avg) //判断采集的平均值是否小于污染A级别
{
lcd.print(" Fine"); //LCD1602输出优信息
digitalWrite(ledPin1,HIGH); //设定PIN8脚为HIGH = 5V左右
digitalWrite(ledPin2,LOW); //设定PIN8脚为LOW = 0V
digitalWrite(ledPin3,LOW); //设定PIN8脚为LOW = 0V
}
else if (PM_LV_B > pm_avg) //判断采集的平均值是否小于污染D级别
{
lcd.print(" Good"); //LCD1602输出好信息
digitalWrite(ledPin2,HIGH); //设定PIN8脚为HIGH = 5V左右
digitalWrite(ledPin1,LOW); //设定PIN8脚为LOW = 0V
digitalWrite(ledPin3,LOW); //设定PIN8脚为LOW = 0V
}
else if (PM_LV_C > pm_avg) //判断采集的平均值是否小于污染C级别
{
lcd.print(" Normal"); //LCD1602输出良信息
digitalWrite(ledPin3,HIGH); //设定PIN8脚为HIGH = 5V左右
digitalWrite(ledPin2,LOW); //设定PIN8脚为LOW = 0V
digitalWrite(ledPin1,LOW); //设定PIN8脚为LOW = 0V
}
else if (PM_LV_D > pm_avg) //判断采集的平均值是否小于污染D级别
{
lcd.print(" Bad"); //LCD1602输出轻度污染信息
digitalWrite(ledPin4,HIGH); //设定PIN8脚为HIGH = 5V左右
delay(100); //设定延时时间,1000 = 1秒
digitalWrite(ledPin4,LOW); //设定PIN8脚为LOW = 0V
delay(100); //设定延时时间,1000 = 1秒
digitalWrite(ledPin1,LOW); //设定PIN8脚为LOW = 0V
digitalWrite(ledPin2,LOW); //设定PIN8脚为LOW = 0V
digitalWrite(ledPin3,LOW); //设定PIN8脚为LOW = 0V
}
else if (PM_LV_E> pm_avg) //判断采集的平均值是否小于污染E级别
{
lcd.print(" Hell"); //LCD1602输出重度污染信息
digitalWrite(ledPin4,HIGH); //设定PIN8脚为HIGH = 5V左右
delay(100); //设定延时时间,1000 = 1秒
digitalWrite(ledPin4,LOW); //设定PIN8脚为LOW = 0V
delay(100); //设定延时时间,1000 = 1秒
digitalWrite(ledPin1,LOW); //设定PIN8脚为LOW = 0V
digitalWrite(ledPin2,LOW); //设定PIN8脚为LOW = 0V
digitalWrite(ledPin3,LOW); //设定PIN8脚为LOW = 0V
}
//LCD液晶显示信息
lcd.setCursor(0,1); //设置光标在第二行第一格
lcd.print("Tmp:"); //LCD1602输出“Tmp:”字符
lcd.print(DHT11.temperature); //LCD1602输出温度值
lcd.print("C"); //LCD1602输出“C”字符
lcd.print(" "); //LCD1602输出“ ”字符
lcd.print("Hum:"); //LCD1602输出“Hum:”字符
lcd.print(DHT11.humidity); //LCD1602输出湿度值
lcd.print("%"); //LCD1602输出“%字符
}
}
该怎么加显示部分的48?? |