Qt 일기예보 및 PM 2.5 모니터링 시스템 구현 (4) DHT 11 모듈 구동

Qt 일기예보 및 PM 2.5 모니터링 시스템 구현 (4) DHT 11 모듈 구동
하드웨어 모듈 설명
부속품 (오 송 dht 11) DC: 3.3 - 5.5v 온도: 0 - 50 ° C (± 2 ° C) 습도: 20 - 95% RH (± 5%)
DHT 11 응용 회 로 는 사용 할 때 데이터 엔 드 에 5K 의 상 당 김 저항 을 추가 해 야 한다.
작업 순서 도
초기 화 순서
데이터 읽 기 0 순서
데이터 읽 기 1 순서
DHT 11 구동 개발 문제
서로 다른 주파수 CPU 로 인 한 순차 작업 문제 1. 초기 화 시 서 는 디 버 깅, 출력 등 과 무관 한 작업 에 가입 하지 말고 순차 에 미 치 는 영향 을 줄 입 니 다.2. 순차 작업 이 연속 화 되 어 싱글 칩 마이크로컴퓨터 에 서 는 함수 로 여러 번 읽 을 수 있 지만 고주파 CPU 에 서 는 한 번 에 모든 데 이 터 를 읽 은 후에 후기 처 리 를 해 야 합 니 다.
드라이버
dht 11 드라이버 nanopi 2 개발 판 의 구동 개발 절 차 는 문 서 를 참고 할 수 있 습 니 다. NanoPi 2 기반 Linux 3.4 커 널 GPIO 구동
/********************************************   :DHT21  nanopi2 s5p4418      GPIO=GPB26 ********************************************/

#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>
#include <linux/device.h>
#include <linux/kdev_t.h>
#include <linux/interrupt.h> 
#include <linux/sched.h>
#include <linux/miscdevice.h>
#include <mach/platform.h>
#include <mach/devices.h>

#define DEVICE_NAME "dht11"
//nanopi2 4418
unsigned int GPIO = PAD_GPIO_B + 26;//  GPIO 

#define DPRINTK(x...) printk("<0>"x);

//#define DPRINTK(x...) 

typedef unsigned char  U8;
U8  U8comdata,U8temp[40],U8_data[5];
int init_dht(void)
{   
    int l_flag=0,h_flag=0,flag=0;
    int i=0,j=0;
    int bit_flag[40];
    unsigned tmp;

    DPRINTK("DHT11 init...");

    //GPIO     
        gpio_direction_output(GPIO, 0);//     
    //  0
    gpio_set_value(GPIO, 0);  //      
    //  19ms
    mdelay(20);
    //  1 
        gpio_set_value(GPIO, 1);  //      
    //  30us
    udelay(40); 
    //     
        gpio_direction_input(GPIO);//    
    // GPIO 
    tmp = gpio_get_value(GPIO) ;    
// DPRINTK("gpio=%d
",tmp);
if(!tmp) { while(!(gpio_get_value(GPIO)) ){ if((l_flag++)>85) break; udelay(1); }// 80us while(gpio_get_value(GPIO)){ if((h_flag++)>85) break; udelay(1); }// 80us //read 40bit data for(i=0;i<40;i++){ flag = 0; while(!(gpio_get_value(GPIO)) ){ if((flag++)>70) break; udelay(1); }// 50us flag =0; while(gpio_get_value(GPIO) ){ if((flag++)>90) break; udelay(1); }// // 70us "1", 26-28us "0" if(flag>30){ U8temp[i]=1; }else{ U8temp[i]=0; } bit_flag[i]=flag; } for(i=0;i<40;i++){ U8comdata<<=1; U8comdata|=U8temp[i]; if((i+1)%8 == 0){ U8_data[j]=U8comdata; j++; } DPRINTK("[%d]flag=%d,val=%d--",i,bit_flag[i],U8temp[i]); } DPRINTK("L 80us flag=%d
"
,l_flag); DPRINTK("H 80us flag=%d
"
,h_flag); }else{DPRINTK("L err..
"
);} return 0; } static int dht_read(struct file *file, char * buffer, size_t count, loff_t * ppos) { init_dht(); count = copy_to_user(buffer, U8_data, count); return count; } static struct file_operations dht_fops={ read:dht_read, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dht_fops, }; static int __init my_dht_init(void) { int ret; ret = misc_register(&misc); printk(DEVICE_NAME " initialized
"
); return 0; } static void __exit my_dht_exit(void) { misc_deregister(&misc); } module_init(my_dht_init); module_exit(my_dht_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("TONY");

드라이버 모듈 을 커 널 에 불 러 옵 니 다. 1. 호스트 의 Liux 시스템 에서 드라이버 모듈 을 컴 파일 합 니 다: 4418dht 11. ko 2. 개발 판 에 파일 전송: sudo scp 4418dht11.ko [email protected]: / home / fa 3. 개발 판 에 파일 권한 설정: sudo chmod 111 4418dht 11. ko 4. insmod 명령 을 통 해 모듈 을 커 널 로 불 러 옵 니 다. 결 과 는 다음 그림 과 같 습 니 다.
dht 11 데이터 읽 기 테스트 프로그램
#include<stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>

#define DEV_F_DHT "/dev/dht11"


int get_dht_data(const int fd,float* temp,float* humi);

int main(int argc,char* argv[])
{
        float ftemp=0.0,fhumi=0.0;

        int fd_dht = -1;
        if( (fd_dht = open(DEV_F_DHT,O_RDWR)) < 0){
                printf("dht11 init error...
"
); return -1; }else{ printf("dht11 init...
"
); } while(1){ if(get_dht_data(fd_dht,&ftemp,&fhumi)==0){ // , } sleep(3); } } int get_dht_data(const int fd,float* temp,float* humi) { char crr; int s; char data[5]; int temp_d=0,humi_d=0; bzero(data,5); read(fd,data,5); crr = 0; for(s=0;s<4;s++){ printf("data[%d]=%x
"
,s,data[s]); crr+=data[s]; } printf("data[4]=%x,crr=%x
"
,data[4],crr); if(crr==data[4]){ humi_d = data[0]; temp_d = data[2]; *humi = humi_d; *temp = temp_d; printf("
+---RH=%d %%,T=%d oC.
"
,humi_d,temp_d); }else{ printf("crr err %X
"
,crr); return -1; } return 0; }

테스트 프로그램 실행 결과

좋은 웹페이지 즐겨찾기