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;
}
테스트 프로그램 실행 결과
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
H2 데이터베이스 사용자 정의 함수 방법 및 범례H2 데이터 베 이 스 는 자바 가 구현 한 메모리 데이터베이스 입 니 다.내장 형 메모리 데이터 베 이 스 를 사용 할 수 있 지만 그 특성 에 대해 서 는 실제 프로젝트 에 적용 할 만 한 의 미 를 더 많이 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.