CAFE

한국직업능력교육원

[스크랩] [Arduino 실습 69] DHT11 온습도 센서

작성자송명규|작성시간26.06.18|조회수29 목록 댓글 0

출시되는 회사별로 핀 배열이 조금식 다르므로 잘 확인하여 사용하셔야 한다.

일단 PCB에 기입되어 잇는 신호를 밑고 결선한다.

제가 실험한 센서의 핀 배치 사진이다.

 

하드웨어 결선 완료후 라이브러리를 아듀이노 스케치 라이브러 메니저에서 다운받던지

아니면 직접 DHT!! 온습도 센서 ZIP 라이브러를 다운받아 아듀이노 스케치에서 라이브러리를 등록한다.

ZIP 파일로 라이브러릴 등록한 경우에는 스케치 프로그램을 종료 후 다시 실행하면 방금 ZIP 파일로 등록한 

DHT11 온습도 센서 라이브러리가 등록되어 있는걸 확인 할 수 있다.

 

아레에 온 습도센서 라이브러리를 첨부한다.

 

소스코드

#include <DHT11.h>

 

#include <Stepper.h>

#include <LiquidCrystal_I2C.h> // i2c LCD IF일 경우

//#include <LiquidCrystal.h> // 4bit, 8 bit IF 방식일 경우에만 사용

 

#include <Servo.h>

#include "My_default_LIB.h"

 

// 스탭핑 모터

#define in1 14  // /b상

#define in2 15  // b상

#define in3 11  // /a상

#define in4 12  // a상

 

int ht_sensor = 16; //A2;




// 2048:한바퀴(360도), 1024:반바퀴(180도)...

          // 2048 = sp:14, delay: 500

          // 200  = sp: 60, delay : 1500 = 법위가 제한적임            

const int stepsPerRevolution = 64;//2048; //200

         

Stepper myStepper(stepsPerRevolution,12,15,11,14); // in4=a, in2=b, in3=\a, in=\b

 

unsigned char cnt = 0;

unsigned char buf;

int ad_buf;

float volt;

int lcd_volt; // 정규화

 

int smot_pin = 9;

int k, i;

float temp, hum;

 

// servo motor 객체선언

Servo servo;

 

// LCD 객체선언

LiquidCrystal_I2C lcd(0x27, 16, 2);  //lcd 객체 선언

 

// trmp hum 객체선언

DHT11 dht11(ht_sensor);



void setup() {

  // put your setup code here, to run once:

  servo.attach(smot_pin);

 

  // rtx en

  Serial.begin(9600);

 

  DDRB = 0xff;

  DDRD = 0xff;

  PORTD = PORTB = 0xff;

 

  pinMode(A3, INPUT);  

 

  pinMode(14, OUTPUT);  

  pinMode(15, OUTPUT);  

  pinMode(16, INPUT);

 

  lcd.begin(); //LCD 사용 시작  

 

  lcd.setCursor(1,0);

  lcd.print("Low Data: ");      

  lcd.setCursor(2,1);

  lcd.print("Volt: ");

 

//  myStepper.setSpeed(14); //60  

 

  myStepper.setSpeed(300);  

 }

 

void cw()

{

  // 시계 반대 방향으로 한바퀴 회전

  // stepsPerRevolution = 64;

 // setSpeed(300);  

  for(int i=0; i<32; i++) {  // 64 * 32 = 2048 한바퀴

    myStepper.step(stepsPerRevolution);

  }

  delay(500);

}

 

void ccw()

{

   // stepsPerRevolution = 64  

   // setSpeed(300);  

 

  // 시계 방향으로 한바퀴 회전

  for(int i=0; i<32; i++) { // 64 * 32 = 2048 한바퀴

    myStepper.step(-stepsPerRevolution);

  }

  delay(500);      

}

 

void loop() {

  //i = dht11.read(hum, temp);

  if((i = dht11.read(hum,temp)) == 0)    

   {

     Serial.print("temp: ");

     Serial.print(temp);

     Serial.print("hum: ");

     Serial.println(hum);

   }

  else

   {

     Serial.println("error");

   }

  delay(DHT11_RETRY_DELAY); //delay for reread

   

/*

  cw();

  delay(500);

  ccw();  

  delay(500);

  */

/*       // 시계 반대 방향으로 한바퀴 회전

   // stepsPerRevolution = 2048  

   // setSpeed = 14    

   // delay = 500

 

   // stepsPerRevolution = 200  = 제한적

   // setSpeed = 60    

   // delay = 1500

   

    // 시계 방향으로 한바퀴 회전

    myStepper.step(-stepsPerRevolution);

    delay(1500);

*/

 

/*

// 시계 반대 방향으로 한바퀴 회전

  for(int i=0; i<32; i++) {  // 64 * 32 = 2048 한바퀴

    myStepper.step(stepsPerRevolution);

  }

  delay(500);

 

  // 시계 방향으로 한바퀴 회전

  for(int i=0; i<32; i++) {

    myStepper.step(-stepsPerRevolution);

  }

  delay(500);    

  */

       

  // ad_buf = analogRead(A3);  // 10 bit = 1024 =>> 0 ~ 1023

   /*  

     Serial.print("ADC Low Data = ");

     Serial.print(ad_buf);

     */

     volt = ((5.0/1023.0) * (float)ad_buf);

 

/*    

     Serial.print(",  Volt = ");

     Serial.print(volt);

     Serial.println("V");

*/

     // 정규화          

     lcd_volt = (int)(volt * 1000);

   

     // PC 전송

    //Serial.print(ad_buf);

    //Serial.print(',');

    //Serial.println(lcd_volt);            

   

    //delay(100);

   

         

     // LCD 출력

     lcd.setCursor(11,0);

     lcd.write(ad_buf/1000 + 0x30);

     lcd.write(ad_buf%1000/100 + '0');

     lcd.write(ad_buf%100/10 + 0x30);                              

     lcd.write(ad_buf%10 + 0x30);    

     

     lcd.setCursor(8,1);

     lcd.write(lcd_volt/1000 + 0x30);

     lcd.print('.');

     lcd.write(lcd_volt%100/10 + 0x30);                              

     lcd.write(lcd_volt%10 + 0x30);        

     lcd.print('V');

     

    // led 출력

    buf = map(ad_buf, 0, 1023, 0, 255);

    byte_con_out(~buf);

 

   //servo motor 출력

   servo.write(buf);    

         

  // rx mode

 if (Serial.available() > 0)

  {

   // PORTD = PORTB = 0xff; // off  

   buf = Serial.read();

 

   switch(buf)

    {

      case '0': d_out(led1, 0); break;              

      case 'a': d_out(led1, 1); break;              

      case '1': d_out(led2, 0); break;              

      case 'b': d_out(led2, 1); break;              

      case '2': d_out(led3, 0); break;              

      case 'c': d_out(led3, 1); break;              

      case '3': d_out(led4, 0); break;              

      case 'd': d_out(led4, 1); break;              

 

      case '4': d_out(led5, 0); break;              

      case 'e': d_out(led5, 1); break;              

      case '5': d_out(led6, 0); break;              

      case 'f': d_out(led6, 1); break;              

      case '6': d_out(led7, 0); break;              

      case 'g': d_out(led7, 1); break;              

      case '7': d_out(led8, 0); break;              

      case 'h': d_out(led8, 1); break;                            

    }

   

   if(buf == 'z') PORTD = PORTB = 0x00;  // on

   else if(buf == 'x') PORTD = PORTB = 0xff; // off

  }

 

 

 

 //byte_con_out(~cnt);

 //Serial.print(cnt);

 //Serial.print('\n');  

 

 //Serial.write(cnt/100);

 //Serial.write(cnt%100/10);

 //Serial.write(cnt%10);

 //delay(1000);

 //cnt++;

 

 

/*

   UART 셀프 Test

  // put your main code here, to run repeatedly:

  // rtx en

  // Serial.println("RTX Test");

   

  if (Serial.available())

  {

    Serial.write(Serial.read());

  }

*/

 

/*

// 실습 1 = 셀프 Test  

  PORTB = PORTD = 0x55; // led on

  delay(1000);

  PORTB = PORTD = 0xaa; // led off

  delay(1000);  

*/  

}




다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼