온습도센서 DHT11
-온도,습도값을 측정할 수 있는 센서는 수없이 많으나 본  프로젝트에서는 다음과  같은 아두이노용 DHT11센서를 사용한다.


-DHT11 센서는 VCC(+) 단자와 - 단자에 3.3~5V전압을 가해주면  좌측 S 단자를 통해 온도와 습도 측정값을  Digital 값으로 전송해 준다.

 

라이브러리 설치
 IDE 스케치 메뉴 -> 라이브러리 포함하기 -> 라이브러리관리하기 화면에서   "DHT11" 를 검색하여 설치한다.

 

아두이노와 연결
 DHT11 센서로 측정된 온도,습도값을 LCD Display장치에 표시하기 위해서  다음과 같이 연결한다.  

 

테스트프로그램

  1. #include <Wire.h>   
  2. #include <LiquidCrystal_I2C.h>  
  3. LiquidCrystal_I2C lcd(0x3F,16,2);    
  4. #include "DHT.h"  
  5. #define DHTTYPE DHT11      
  6. #define DHTPIN 3   
  7. DHT dht(DHTPIN, DHTTYPE);  
  8. int temp;  
  9. int humid;  
  10. void setup()  
  11. {  
  12.   dht.begin();  
  13.   lcd.init();     // initialize the lcd   
  14.   lcd.backlight();  
  15. }  
  16. void loop()  
  17. {  
  18.   temp  = dht.readTemperature();  
  19.   humid = dht.readHumidity();  
  20.   lcd.clear();  
  21.   lcd.print("Temperature:");  
  22.   lcd.setCursor(12,0) ;  
  23.   lcd.print(temp);  
  24.   lcd.setCursor(14,0) ;  
  25.   lcd.print("C");  
  26.   lcd.setCursor(0,1) ;  
  27.   lcd.print("Humidity:");  
  28.   lcd.setCursor(12,1) ;  
  29.   lcd.print(humid);  
  30.   lcd.setCursor(14,1) ;  
  31.   lcd.print("%");  
  32.   delay(1000);  
  33. }  


4~7 line: 디지털 3번 핀을 통해 연결된 DHT11센서 장치를 dht라는 이름으로 선언
12 line : dht  장치 초기화하여 시작  
18~19 line :  온도와 습도값을 받아 temp, humid라는 변수에 보관 
21~25 line : lcd 장치에 온도값 Display  
26~31 line : lcd 장치에 습도값 Display  

 

 

1.과제목표

 

- 지금까지 실습한 LCD, 키패드, 부저 기능을 종합하여 다음과 같은 기능을 가진  "남은 여생 날짜수 계산기" 시스템을 구성하시오.

1) 아두이노를 기동시키면 나이를 물어 보고  

2) 사용자는 키패드로 나이를  2자리 숫자로 입력 ( 숫자를 누를때 숫자입력 확인용으로  짧은 비프음을 출력하고, 숫자 아닌 기호를 누를 때는 무시 )

3) 2자리 숫자가 완료되면 입력이 완료되었다는 의미로 멜로디 효과음을 출력하고  100세 까지 남은 날짜수를 계산하여 3초간 표시. 

4) 위작업을 계속 반복

 

 

2. 아두이노 연결

 

 

3.샘플프로그램

  1. #include <Wire.h>   
  2. #include <LiquidCrystal_I2C.h>  
  3. #include <Keypad.h>  
  4.   
  5. int BuzzerPin= 2; // 부저로 사용할 포트 핀번호  
  6. LiquidCrystal_I2C lcd(0x3F,16,2);  // LCD 종류에 따라 0x27 또는 0x3F  
  7.   
  8. const byte numRows= 4;  
  9. const byte numCols= 4;  
  10. char keymap[numRows][numCols]=   
  11. {{'1''2''3''A'},   
  12.  {'4''5''6''B'},   
  13.  {'7''8''9''C'},  
  14.  {'*''0''#''D'}  };  
  15. byte rowPins[numRows] = {5,6,7,8};   
  16. byte colPins[numCols]= {9,10,11,12};  
  17. Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);  
  18.   
  19. char keypressed;   
  20. String strTmp = "";  
  21. int myAge;  
  22. long remainDay;  
  23. int i;  
  24.   
  25. void setup()  
  26. {  
  27.   lcd.init();     // initialize the lcd   
  28.   // Print a message to the LCD.  
  29.   lcd.backlight();  
  30.   lcd.setCursor(0,0);  
  31.   lcd.print("Calculating");  
  32.   lcd.setCursor(0,1);  
  33.   lcd.print("your remain life.");  
  34.   delay(3000);  
  35. }  
  36. void loop()  
  37. {  
  38.   lcd.clear();  
  39.   lcd.print("How old are you?");  
  40.   lcd.setCursor(0,1) ;  
  41.   lcd.print("My age is ");  
  42.   strTmp = "";  
  43.   for ( i=0; i < 2; i++) {  
  44.      while(1) {  
  45.            keypressed = myKeypad.getKey();  
  46.            if ( keypressed >= '0' && keypressed <= '9') {  
  47.                tone(BuzzerPin, 500, 200);  
  48.                break;  
  49.            }  
  50.      }  
  51.     lcd.setCursor(10+i,1) ;  
  52.     lcd.write(keypressed);  
  53.     strTmp +=  (char) keypressed;  
  54.   }  
  55.   delay(1000);  
  56.   myAge = strTmp.toInt();   
  57.   remainDay = (long) ( 100 - myAge )  * 365;  
  58.   tone(BuzzerPin, 900, 200);  
  59.   delay(200);  
  60.   tone(BuzzerPin, 700, 200);  
  61.   delay(200);  
  62.   tone(BuzzerPin, 900, 500);  
  63.   delay(500);  
  64.   lcd.clear();  
  65.   lcd.print("Your remain life");  
  66.   lcd.setCursor(0,1) ;  
  67.   lcd.print("is ");  
  68.   lcd.setCursor(4,1) ;  
  69.   lcd.print(remainDay);  
  70.   lcd.print(" days.");  
  71.   delay(3000);  
  72. }  

 

22 line:  입력되는 나이를 저장할 변수
23 line: 계산되는 100세까지 남은 일수를 저장할 변수, int범위인 32,767을 초과할 수 있으니 long type으로 선언해 주어야 한다.
28~35 line: 프르그램 시작할 때 화면에 설명할 내용을 3초간 표시한다
45~51 line : 키패드로 부터 입력된 문자가 숫자이면 비프음을 출력하고 while반복에서 빠져   나온다. 숫자입력이 아니면 계속 입력을 받아들인다   
44~55 line: 2자리 숫자가 완성될 때까지 입력받아 화면에 표시한다. 
58 line: 100세 까지 남은 일수를 계산하여 long type 변수로 저장한다.
59~72 : 멜로디 음과 LCD화면 표시내용을 출력하고 3초간 대기한다.

 

 

LCD Display장치

 본 프로젝트에서는 16문자 x 2줄 Text를 표시할 수 있고, I2C방식 Interface모듈이 부착되어 있는 다음과 같은 LCD디스플레이 장치를 사용한다.
 

 

 

 

 

LCD 라이브러리 설치
 - 아두이노와 LCD장치간 연결( I2C방식통신)을 하기 위해서는 전용 라이브러리를 추가로 설치해 주어야 한다.
 - IDE 스케치 메뉴 -> 라이브러리 포함하기 -> 라이브러리관리하기 화면에서  "LiquidCrystal I2C" 를 검색하여 설치한다.

 

아두이노와 연결

 


- I2C방식통신을 위해서 위와 같이 전원선과 아날로그 4번핀/5번핀에  연결해야 하나

- 프로토타이핑 보드에서는 편리를 위해 우측과 같이 별도의 핀으로 구성되어 있으므로 여기에 표시된 핀번호끼리 연결해도 되며 아날로그 4번핀/5번핀에 다른 I2C방식 장치를 추가로 연결할 수 있다.    


 

테스트프로그램

  1. #include <Wire.h>   
  2. #include <LiquidCrystal_I2C.h>  
  3. LiquidCrystal_I2C lcd(0x3F,16,2);    
  4.   
  5. void setup()  
  6. {  
  7.   lcd.init();     // initialize the lcd   
  8.   lcd.backlight();  
  9.   lcd.setCursor(0,0);  
  10.   lcd.print("Hello, everyone!");  
  11.   lcd.setCursor(2,1);  
  12.   lcd.print("I am Arduino.");  
  13. }  
  14. void loop()  
  15. {  
  16. }  

3 line: LiquidCrystal_I2C lcd(0x27,16,2);   0x27 Adress에 연결되는 16문자 2줄 짜리 I2C방식 LCD장치를  lcd라는 이름으로 선언
8 line:  lcd.backlight();  : 백라이트 켜기 
9 line: lcd.setCursor(col,line) 로 커서의 위치를 지정한다 ( 숫자는 0부터 시작함에 주의 )    
         예 ) (0,0) : 첫째 줄 첫째 문자,     (2,1) : 둘째 줄 세번째 문자,
10 line: lcd.print("Hello, everyone!"); 현재 커서위치에 지정하는 문자열을 출력

  
-lcd.clear();  : lcd 문자 모두 지우기

 

LCD화면에 문자가 표시 되지 않을 경우 
 - LCD 밝기 조절 볼륨을 돌려 화면 밝기을 조절 해 본다.  

 - LCD I2C장치의 Address는 통상 0x27  또는 0x3F 이므로 Address를 0x27 대신 0x3F를  지정한 후  다시 프로그램 업로드하여 테스트해 본다   (장치 제조사별로 다른 Address를 사용하는 경우도 있는데 아래의 장치 Address  Scan 프로그램으로 현재연결된 장치의 Address를 알아 낼 수 있다. )

참조: 장치 Address scan 프로그램 
 - 다음 소스코드를 아두이노로 업로드하여 실행시키고 툴->시리얼모니터화면에  표시되는 메세지를 보면 현재 연결된 장치의 Adress를 확인할 수 있다. 

  1. #include <Wire.h>   
  2. void setup() {  
  3.     Wire.begin();  
  4.     Serial.begin(9600);  
  5.     while (!Serial);   
  6.     Serial.println("\nI2C Scanner");  
  7. }  
  8. void loop() {   
  9.     byte error, address;   
  10.     int nDevices;   
  11.     Serial.println("Scanning...");   
  12.     nDevices = 0;   
  13.     for(address = 1; address < 127; address++ ) {  
  14.          Wire.beginTransmission(address);  
  15.          error = Wire.endTransmission();  
  16.          if (error == 0) {   
  17.              Serial.print("I2C device found at address 0x");  
  18.              if (address<16) Serial.print("0");   
  19.              Serial.print(address,HEX);   
  20.              Serial.println(" !");  
  21.              nDevices++;   
  22.          }  
  23.          else if (error==4) {   
  24.             Serial.print("Unknow error at address 0x");   
  25.             if (address<16) Serial.print("0");   
  26.             Serial.println(address,HEX);   
  27.          }   
  28.     }   
  29.     if (nDevices == 0)   
  30.          Serial.println("No I2C devices found\n");   
  31.      else Serial.println("done\n");   
  32.      delay(5000);   
  33. }  

+ Recent posts