冯洁莹 发表于 2018-12-6 21:31:48

【实验室培训_201810期】+冯洁莹+第四周任务(软件)

一、任务要求:根据输出的温湿度改变跑马灯的样式,并根据不同按键的输入状态输出不同温度类型(摄氏度、华氏温度、开氏温度)。
二、工作环境:通过ardunio软件编程和DHT11数字温湿度传感器,根据串口监视器查看不同按键输入状态时的不同温度类型。
三、实现步骤:通过设定一个按键变量值,用以改变不同的按键输入。且可改变温度变量k=温度/10,使得led灯每k个亮一次。

由温度值可得led灯每两个亮一次,改变温度到30°c,使得led灯每三个亮一次。
每两个亮一次时:
每三个亮一次时:

四、代码展示
/* 添加 DHT11 代码库 */
#include <dht11.h>
/* 配置一个 DHT11 对象 */
dht11 DHT11;
/* 定义 DHT11 数据引脚 */
#define DHT11PIN 2
int key={11,12,13};
int LED={3,4,5,6,7,8,9,10};
float temperature,Humidity;
float Fahrenheit;
float Kelvin;
int i,j,k,keynum;

void setup() {
/* 配置串口 */   
Serial.begin(9600);   
/* 输出 DHT11 代码库信息 */
Serial.println("DHT11 TEST PROGRAM ");
Serial.print("LIBRARY VERSION: ");
Serial.println(DHT11LIB_VERSION);
Serial.println();
for(i=2;i<10;i++)
{
pinMode(LED,OUTPUT);
}
for(j=11;j<14;j++)
{ pinMode(key,INPUT_PULLUP);       }
}



void loop() {
Serial.println("\n");
   int chk = DHT11.read(DHT11PIN);            //查看 DHT11 是否在线或数据读取是否成功
   Serial.print("Read sensor: ");            //输出 DHT11 模块数据
   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;
      }

/* 输出湿度信息 */
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity, 2);


   Scan_key();

    if(keynum==1)   
{   Serial.print("Temperature (oC): ");
   Serial.println((float)DHT11.temperature, 2); /*摄氏温度*/
}
   if(keynum==2)
{
    temperature= 1.8 * (float)DHT11.temperature + 32;
    Serial.print("Temperature (oF): ");
    Serial.println((float)temperature, 2);/*华氏温度*/
   }
   if(keynum==3)
   {
    temperature=(float)DHT11.temperature + 273.15;
    Serial.print("Temperature (K): ");
    Serial.println((float)temperature, 2);/*开氏温度*/
    }

k=(float)DHT11.temperature/10;
for(int i=0;i<9;i=i+k)
{digitalWrite(LED,HIGH);
      delay(500);
digitalWrite(LED,LOW);
      delay(500);}
}
void Scan_key()
{
keynum=0;   //清空变量
if(digitalRead(11)==LOW)
{
    delay(10);
    if(digitalRead(11)==LOW)
    {
   keynum=1;
   }
    }
   
    else if(digitalRead(12)==LOW)
{
    delay(10);
    if(digitalRead(12)==LOW)
    {
   keynum=2;
   }
    }
   
    else if(digitalRead(13)==LOW)
{
    delay(10);
    if(digitalRead(13)==LOW)
    {
   keynum=3;
   }
    }   
    else
    keynum=0;
}




五、心得总结:DTH11对时序的要求比较高,所以程序中不同数据间的采集必须间隔1s以上。连接DHT11时,传感器的数字端口代码默认接在2号口。

鲁亮 发表于 2018-12-7 20:58:50

你可以尝试一下不调用DHT11的库,自己去写一下那个时序
页: [1]
查看完整版本: 【实验室培训_201810期】+冯洁莹+第四周任务(软件)