本帖最后由 谭世耀 于 2018-12-10 15:07 编辑
一、任务要求:根据输出的温湿度改变跑马灯的样式,并根据不同按键的输入状态输出不同温度类型(摄氏度、华氏温度、开氏温度)。
二、工作环境:通过ardunio软件编程和DHT11数字温湿度传感器,根据串口监视器查看不同按键输入状态时的不同温度类型。
三、实现步骤:通过三个按键实现通过串口监视器输出三种不同的温度信息;再通过温度数据对LED灯的控制(0-10℃不亮灯,10℃-20℃亮一盏灯)
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode /* 添加DHT11代码库 */
#include "dht11.h"
int anjian=1;
/* 配置一个DHT11对象 */
dht11 DHT11;
/* 定义DHT11数据引脚 */
#define DHT11PIN 8
#define LED0 0
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5
#define LED6 6
#define LED7 7
void Deng(int i)//控制灯亮的盏数
{
int j;
for(j=2;j<i+2;j++)
digitalWrite(j,1);
for(j=i+2;j<=7;j++)
digitalWrite(j,0);
}
//输出摄氏度
void state0()
{
/* 输出湿度信息 */
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
/* 输出温度信息 */
Serial.print("Temperature (oC): ");
Serial.println((double)DHT11.temperature, 2);
digitalWrite(0,LOW);
delay(2000);
}
//输出华氏温度
void state1()
{
/* 输出湿度信息 */
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
/* 输出温度信息 */
Serial.print("Fahrenheit (°F): ");
Serial.println(Fahrenheit((float)DHT11.temperature), 2);
delay(2000);
}
//输出开氏温度//
void state2()
{
/* 输出湿度信息 */
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);
/* 输出温度信息 */
Serial.print("absolute temperature (K): ");
Serial.println(Kelvin((float)DHT11.temperature), 2);
delay(2000);
}
//摄氏温度度转化为华氏温度
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}
//摄氏温度转化为开氏温度
double Kelvin(double celsius)
{
return celsius + 273.15;
}
// 露点(点在此温度时,空气饱和并产生露珠)
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}
// 快速计算露点,速度是5倍dewPoint()
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
/*初始化配置*/
void setup()
{
/* 配置串口 */
Serial.begin(9600);
/* 输出DHT11代码库信息 */
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
pinMode(LED5,OUTPUT);
pinMode(LED6,OUTPUT);
pinMode(LED7,OUTPUT);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
}
void loop()
{
Serial.println("\n");
/* 查看DHT11是否在线或数据读取是否成功 */
int chk = DHT11.read(DHT11PIN);
/* 输出DHT11模块数据 */
Serial.print("Read sensor: ");
switch (chk)
{
/* 数据读取成功 */
case DHTLIB_OK:
Serial.println("OK");
break;
/* 数据读取成功,但检验错误 */
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Checksum error");
break;
/* 数据读取超时,即模块不在线 */
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Time out error");
break;
/* 其他错误 */
default:
Serial.println("Unknown error");
break;
}
if(digitalRead(9)==0)//等待按键弹起
{
delay(20);//延时去抖
while(digitalRead(9)==0);
anjian=1;
}
if(digitalRead(10)==0)
{
delay(20);
while(digitalRead(10)==0);
anjian=2;
}
if(digitalRead(11)==0)
{
delay(20);
while(digitalRead(11)==0);
anjian=3;
}
switch(anjian)//控制使用哪一种输出状态
{
case 1:state0();break;
case 2:state1();break;
case 3:state2();break;
default :break;
}
int k=(float)DHT11.temperature*100;
switch(k/1000)//控制亮几盏灯
{
case 0:Deng(0);break;
case 1:Deng(1);break;
case 2:Deng(2);break;
case 3:Deng(3);break;
case 4:Deng(4);break;
case 5:Deng(5);break;
default:break;
}
}
通过本次对DHT11的学习,让我的编程变得更加的熟练。
dht11.rar
(3 KB, 下载次数: 0)
|