重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 3711|回复: 0
打印 上一主题 下一主题

【实验室培训_201810期】+谭世耀+第四周任务(软件)

[复制链接]

3

主题

4

帖子

39

积分

新手上路

Rank: 1

积分
39
跳转到指定楼层
楼主
发表于 2018-12-10 15:01:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 谭世耀 于 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)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-4-26 08:20 , Processed in 0.164526 second(s), 33 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表