OrangePi 的 26 pin 接口图 13 pin 接口图
以下分5步介绍使用 wiringPi,实现读 DHT11 。
(wiringPi是一个很棒的 IO 控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等。)
1.查看 gpio 库的版本号 (如果没有安装 请参考文章末尾说明)
指令 : gpio -v
打印gpio 信息
指令: gpio readall
2. gpio 初始化及使用说明
3.确定下所要使用 gpio
根硬件连接图 选定 使用的 IO 本次测试初始化使用函数 wiringPiSetup () ; wiringPi 引脚编号表 使用的是 7 ,如果改用其他io 只需要改 代码中的宏定义#define DHTPIN 7
4.实例代码
源码下载地址:
/download/wzy15965343032/11459791
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define DHTPIN 7
uint8_t temperature;
uint8_t humidity;
void DHT11_Rst(void)
{
wiringPiSetup();
pinMode(DHTPIN, OUTPUT); //SET OUTPUT
digitalWrite(DHTPIN, LOW); //拉低DQ
delay(20); //拉低至少18ms
digitalWrite(DHTPIN, HIGH); //DQ=1
delayMicroseconds(35); //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void)
{
uint8_t retry = 0;
pinMode(DHTPIN, INPUT);//SET INPUT
while (digitalRead(DHTPIN) && retry < 100) //DHT11会拉低40~80us
{
retry++;
delayMicroseconds(1);
};
if (retry >= 100)
return 1;
else
retry = 0;
while (!digitalRead(DHTPIN) && retry < 100) //DHT11拉低后会再次拉高40~80us
{
retry++;
delayMicroseconds(1);
};
if (retry >= 100)
return 1;
return 0;
}
//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void)
{
uint8_t retry = 0;
pinMode(DHTPIN, INPUT);
while (digitalRead(DHTPIN) && retry < 100) //等待变为低电平
{
retry++;
delayMicroseconds(1);
}
retry = 0;
while (!digitalRead(DHTPIN) && retry < 100) //等待变高电平
{
retry++;
delayMicroseconds(1);
}
delayMicroseconds(40); //等待40us
if (digitalRead(DHTPIN))
return 1;
else
return 0;
}
//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)
{
uint8_t i, dat;
dat = 0;
for (i = 0; i < 8; i++)
{
dat <<= 1;
dat |= DHT11_Read_Bit();
}
return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
DHT11_Rst();
if (DHT11_Check() == 0)
{
for (i = 0; i < 5; i++) //读取40位数据
{
buf[i] = DHT11_Read_Byte();
}
if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}else
{
return 0;
}
}
else
return 1;
return 0;
}
int main(void)
{
int tole_time = 0;
printf("Raspberry Pi wiringPi DHT11 Temperature test program\n");
if (wiringPiSetup() == -1)
{
printf("ERROR exit0 /r/n ");
exit(0);
}
while (tole_time < 10)
{
printf("read ONE time\r\n ");
if( DHT11_Read_Data(&temperature,&humidity) == 0 ) //读取温湿度值
{
printf("\r\n temp: %d humi: %d \r\n", temperature, humidity )
delay(1000);
tole_time++;
}
}
return 0;
}
5.编译:
# 编译 dth11.cgcc -Wall -o dht11_2 dht11_2.c -lwiringPi -lpthread# 设置环境变量export WIRINGPI_DEBUG=TRUEunset WIRINGPI_DEBUG
运行结果:
GPIO 驱动库相关说明:
没有找到 H2+ 的这个 h3 的也可以用
编译GPIO的H5的驱动
git clone /kazukioishi/WiringOP.git -b h3cd WiringOPchmod +x ./buildsudo ./build
查看: gpio -v
root@orangepizero:~# gpio -vgpio version: 2.20Copyright (c) - Gordon HendersonThis is free software with ABSOLUTELY NO WARRANTY.For details type: gpio -warrantyBanana Pro Details:Type: Banana Pro, Revision: 1.2, Memory: 1024MB, Maker: LeMakerroot@orangepizero:~# gpio readall+-----+-----+----------+------+---+-Orange Pi+---+---+------+---------+-----+--+| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name| wPi | BCM |+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+|||3.3v || | 1 || 2 | || 5v |||| 12 | 8 | SDA.0 | ALT3 | 0 | 3 || 4 | || 5V |||| 11 | 9 | SCL.0 | ALT3 | 0 | 5 || 6 | || 0v |||| 6 | 7 | GPIO.7 | ALT3 | 0 | 7 || 8 | 0 | ALT3 | TxD3| 15 | 13 |||| 0v || | 9 || 10 | 0 | ALT3 | RxD3| 16 | 14 || 1 | 0 |RxD2 | ALT3 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1 | 1 | 110 || 0 | 2 |TxD2 | ALT3 | 0 | 13 || 14 | || 0v |||| 3 | 3 |CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4 | 4 | 68 ||||3.3v || | 17 || 18 | 0 | ALT3 | GPIO.5 | 5 | 71 || 64 | 12 |MOSI | ALT3 | 0 | 19 || 20 | || 0v |||| 65 | 13 |MISO | ALT3 | 0 | 21 || 22 | 0 | ALT3 | RTS2| 6 | 2 || 66 | 14 |SCLK | ALT3 | 0 | 23 || 24 | 0 | ALT3 | CE0| 10 | 67 |||| 0v || | 25 || 26 | 0 | ALT3 | GPIO.11 | 11 | 21 || 19 | 30 | SDA.1 | ALT3 | 0 | 27 || 28 | 0 | ALT3 | SCL.1 | 31 | 18 || 7 | 21 | GPIO.21 | ALT3 | 0 | 29 || 30 | || 0v |||| 8 | 22 | GPIO.22 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | RTS1| 26 | 200 || 9 | 23 | GPIO.23 | ALT3 | 0 | 33 || 34 | || 0v |||| 10 | 24 | GPIO.24 | ALT3 | 0 | 35 || 36 | 0 | ALT3 | CTS1| 27 | 201 || 20 | 25 | GPIO.25 | OUT | 1 | 37 || 38 | 0 | ALT3 | TxD1| 28 | 198 |||| 0v || | 39 || 40 | 0 | ALT3 | RxD1| 29 | 199 |+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name| wPi | BCM |+-----+-----+----------+------+---+-Orange Pi+---+------+----------+-----+-----+
uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi){uint8_t buf[5];uint8_t i;DHT11_Rst();if (DHT11_Check() == 0){for (i = 0; i < 5; i++) //读取40位数据{buf[i] = DHT11_Read_Byte();}if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]){*humi = buf[0];*temp = buf[2];}else{return 1; //校验失败不返回 0000000000000}}elsereturn 1;return 0;}
参考文章地址:
/p/0ee31099983e