AM3354之DHT11气温湿度传感器驱动和测试
来源:互联网 发布:获取data-tab数据 编辑:程序博客网 时间:2024/04/28 18:44
废话不多说,直接上驱动代码,整体就是注册一个misc device 主要是注意时序。
#include <linux/miscdevice.h>#include <linux/delay.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/slab.h>#include <asm/gpio.h>#include <linux/mm.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/string.h>#include <linux/gpio.h>#include <asm/uaccess.h>#include <asm/atomic.h>#include <asm/unistd.h>#define DEVICE_NAME "dht11"/* Convert GPIO signal to GPIO pin number */#define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))#define DHT11_GPIO GPIO_TO_PIN(1, 26)/* 读取单字节(8 bit)数据 */static char DHT11_read_byte ( void ){char DHT11_byte ;unsigned char i ;unsigned char temp ;DHT11_byte = 0 ;for ( i = 0 ; i < 8 ; i ++ ){temp = 0 ;while ( ! (gpio_get_value(DHT11_GPIO) ) ) {temp ++ ;if ( temp > 12 )return 1 ;udelay ( 5 ) ;}temp = 0 ;while ( gpio_get_value(DHT11_GPIO) ){temp ++ ;if ( temp > 20 )return 1 ;udelay ( 5 ) ;}if ( temp > 6 ){DHT11_byte <<= 1 ;DHT11_byte |= 1 ;} else{DHT11_byte <<= 1 ;DHT11_byte |= 0 ;}}return DHT11_byte ;}/* DHT11 数据读取函数 */static ssize_t DHT11_read ( struct file* filp, char __user* buf, size_t count, loff_t* f_pos ){unsigned char DataTemp;unsigned char i;unsigned char err;char tempBuf[5];//loff_t pos = *f_pos ;err = 0 ;/* 管脚设置为输出并拉低电平 */gpio_direction_output(DHT11_GPIO, 0);msleep ( 18 );//mdelay ( 18 );gpio_set_value(DHT11_GPIO, 1);udelay ( 40 );gpio_direction_input(DHT11_GPIO); if ( !err ){DataTemp = 10 ;while ( !( gpio_get_value(DHT11_GPIO) ) && DataTemp ){DataTemp --;udelay ( 10 );}if ( !DataTemp ){err = 1;count = -EFAULT;}}if ( !err ){DataTemp = 10 ;while ( gpio_get_value(DHT11_GPIO) && DataTemp ){DataTemp --;udelay ( 10 );}if ( !DataTemp ){err = 1;count = -EFAULT;}}if ( !err ){for ( i = 0; i < 5; i ++ ){tempBuf[i] = DHT11_read_byte () ;}DataTemp = 0 ;for ( i = 0; i < 4; i ++ ){DataTemp += tempBuf[i] ;}if ( DataTemp != tempBuf[4] ){count = -EFAULT;}if ( count > 5 ){count = 5 ;}//pos += count;//if( copy_to_user ( buf , tempBuf + *f_pos , count ) )if ( copy_to_user ( buf , tempBuf , count ) ){count = -EFAULT ;}//*f_pos = pos;}/* 管脚设置为输出并拉高 */gpio_direction_output(DHT11_GPIO, 1);return count;}static struct file_operations dev_fops = {.owner = THIS_MODULE,.read = DHT11_read,};static struct miscdevice misc = {.minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,};static int __init DHT11_init_module ( void ){int ret;/* 1、申请管脚 */ret = gpio_request(DHT11_GPIO, "dht11_gpio");if (ret)goto free_master;/* 2、管脚设置为输出并拉高 */gpio_direction_output(DHT11_GPIO, 1);/* 3、管脚注册成misc设备 */ret = misc_register(&misc);printk (DEVICE_NAME"\tinitialized\n");free_master:return ret;}static void __exit DHT11_exit_module ( void ){misc_deregister(&misc);}module_init ( DHT11_init_module );module_exit ( DHT11_exit_module );MODULE_LICENSE ( "GPL" ) ;MODULE_AUTHOR ( "zuoyioo7@163.com" ) ;
Makefile文件
KERN_DIR = /home/zuoyi/kernel/3.2.0all: make -C $(KERN_DIR) M=`pwd` modulesclean: make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.orderobj-m += dht11.o
但insmod dht11.ko驱动文件的时候
/ # cd dev/
/dev # ls -l dht11
crw------- 1 0 0 10, 52 Jun 27 17:25 dht11
/dev #
测试程序
#include <stdio.h>#include <stdlib.h>#include <unistd.h>//#include <sys/ioctl.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>//#include <sys/select.h>//#include <sys/time.h>#include <errno.h>int main ( void ){int fd ;int retval ;char buf[5] ;fd = open ( "/dev/dht11" , O_RDONLY) ;if ( fd == -1 ){perror ( "open dht11 error\n" ) ;exit ( -1 ) ;}printf ( "open /dev/dht11 successfully\n" ) ;sleep ( 2 ) ;while ( 1 ){sleep ( 1 ) ;retval = read ( fd , buf , 5 );if ( retval == -1 ){perror ( "read dht11 error" ) ;printf ( "read dht11 error" ) ;exit ( -1 ) ;}printf ( "Humidity:%d.%d %%RH Temperature:%d.%d C sum is:%d\n", buf[0], buf[1], buf[2], buf[3],buf[4] ) ;}close ( fd ) ;}
运行测试程序
/nfsswap # ./dht11ts
open /dev/dht11 successfully
Humidity:33.0 %RH Temperature:27.0 C sum is:60
Humidity:33.0 %RH Temperature:27.0 C sum is:60
Humidity:33.0 %RH Temperature:27.0 C sum is:60
阅读全文
0 0
- AM3354之DHT11气温湿度传感器驱动和测试
- 温度、湿度传感器dht11
- DHT11湿度传感器开发
- 树莓派通过DHT11温湿度传感器获得当前的温度和湿度
- 温湿度传感器之DHT11
- STM32驱动DHT11温湿度传感器
- WSN之DHT11温湿度传感器
- 传感器系列3--温湿度传感器之DHT11
- Linux的温湿度传感器DHT11驱动
- 嵌入式开发之 DHT11温湿度传感器
- Arduino Uno 和 DHT11/DHT22 温湿度传感器
- [嵌入式Linux驱动]S5PV210的DHT11温湿度传感器Linux驱动
- 湿度传感器原理
- 单片机控制单总线协议湿度温度传感器DHT11之模块化编程(持续更新中)
- 基于C8051F410的DHT11温湿度传感器驱动编写
- STM32外设驱动篇——DHT11温湿度传感器
- DHT11温湿度传感器的树莓派3 python3驱动代码
- DHT11实现温度湿度的数码管显示
- 卢俊卿谈城市居民的“中国梦”
- Java读取properties配置文件
- ForkJoinTask简单使用demo
- APK 瘦身
- Oracle grid infrastructure 卸载 grid卸载
- AM3354之DHT11气温湿度传感器驱动和测试
- Windows下安装Redis及可视化工具
- android工作笔记之db初见
- Hibernate基础(1)
- 关于Elasticsearch 高版本找不到bin/plugin 的问题
- Java多线程之异步任务——AsyncTask
- c++函数explicit修饰符
- MVP模式
- Python中的多线程Threading使用总结