重工电子论坛

标题: 【实验室培训_201810期】+谭世耀+第四周任务(软件) [打印本页]

作者: 谭世耀    时间: 2018-12-10 15:01
标题: 【实验室培训_201810期】+谭世耀+第四周任务(软件)
本帖最后由 谭世耀 于 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 0eng(0);break;
  case 1eng(1);break;
  case 2eng(2);break;
  case 3eng(3);break;
  case 4eng(4);break;
  case 5eng(5);break;
  default:break;
}
}

通过本次对DHT11的学习,让我的编程变得更加的熟练。
dht11.rar (3 KB, 下载次数: 0)




欢迎光临 重工电子论坛 (http://www.cqutlab.cn/) Powered by Discuz! X3.1