知识库

记录点点滴滴

树莓派第三弹——GPIO功能学习(以DHT11传感器为例)

0.准备

    树莓派现在越来越火,树莓派各种集成库也层出不穷,下面推荐几个。
    【python GPIO
    【开发语言】——python

【简单介绍】——该库更确切的名称为raspberry-gpio-python,树莓派官方资料中推荐且容易上手。python GPIO是一个小型的python库,可以帮助用户完成raspberry相关IO口操作。但是python GPIO库还没有支持SPI、I2C或者1-wire等总线接口。除了python GPIO之外,还有众多的python扩展库(例如webiopi),毫无疑问的说python非常适合树莓派,树莓派也非常适合python。

    【wiringPi
    【开发语言】——C语言

【简单介绍】——wiringPi适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括UART设备,I2C设备和SPI设备等,毫无疑问地说wiringPi功能非常强大。

    【BCM2835 C Library
    【开发语言】——C语言

【简单介绍】BCM2835 C Library可以理解为使用C语言实现的相关底层驱动,它给我的感觉更像STM32的库函数,BCM2835 C Library的驱动库包括GPIO、SPI和UART等,可以通过学习BCM2835 C Library熟悉BCM2835相关的寄存器操作。如果有机会开发树莓派上的linux驱动,或自主开发python或PHP扩展驱动,可以从BCM2835 C Library找到不少的“灵感”。

注:本文以wiringPi为例

1.硬件准备

    【树莓派】——树莓派3
    【传感器】——博主以DHT11为例
      运行效果图
《树莓派第三弹——GPIO功能学习(以DHT11传感器为例)》
《树莓派第三弹——GPIO功能学习(以DHT11传感器为例)》

2.注意事项

【编号方式】

《树莓派第三弹——GPIO功能学习(以DHT11传感器为例)》
图3 GPIO编号方式——该图片来自wiringPi说明文档
以DHT11为例,所需要5V GND 与 GPIO01(可自定义)
故选择2  12  25号管脚,注意上图的1 2 号管脚对应树莓派上左上角部分

2 wiringPi GPIO实现

    【安装过程】
    如果在你的平台上还没有安装GIT工具,可以输入以下命令:
    sudo apt-get install git-core
    如果在这个过程中出现错误,尝试更新软件,例如输入以下指令:
    sudo apt-get update
    sudo apt-get upgrade
    紧接着可以通过GIT获得wiringPi的源代码
    git clone git://git.drogon.net/wiringPi
    若需要更新wiringPi。
    cd wiringPi
    git pull origin
    进入wiringPi目录并安装wiringPi
    cd wiringPi
    ./build
    build脚本会帮助你编译和安装wiringPi
    【操作简述】
1.在windows共享文件夹下打开work文件夹,并将以下代码通过记事本保存为
   名为DHT11.c文件,该文件具体内容如下:(共享文件夹操作请见树莓派第二弹)
=======================================================
//
//mydht11.c
//
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;#define HIGH_TIME 32int pinNumber =1; //use gpio1 to read data
uint32 databuf;

uint8 readSensorData(void)
{
uint8 crc;
uint8 i;

pinMode(pinNumber,OUTPUT); // set mode to output
digitalWrite(pinNumber, 0); // output a high level
delay(25);
digitalWrite(pinNumber, 1); // output a low level
pinMode(pinNumber, INPUT); // set mode to input
pullUpDnControl(pinNumber,PUD_UP);

delayMicroseconds(27);
if(digitalRead(pinNumber)==0) //SENSOR ANS
{
while(!digitalRead(pinNumber)); //wait to high

for(i=0;i<32;i++)
{
while(digitalRead(pinNumber)); //data clock start
while(!digitalRead(pinNumber)); //data start
delayMicroseconds(HIGH_TIME);
databuf*=2;
if(digitalRead(pinNumber)==1) //1
{
databuf++;
}
}

for(i=0;i<8;i++)
{
while(digitalRead(pinNumber)); //data clock start
while(!digitalRead(pinNumber)); //data start
delayMicroseconds(HIGH_TIME);
crc*=2;
if(digitalRead(pinNumber)==1) //1
{
crc++;
}
}
return 1;
}
else
{
return 0;
}
}

int main (void)
{

printf(“Use GPIO1 to read data!\n”);

if (-1 == wiringPiSetup()) {
printf(“Setup wiringPi failed!”);
return 1;
}

pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level

printf(“Enter OS——-\n”);
while(1) {
pinMode(pinNumber,OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
delay(3000);
if(readSensorData())
{
printf(“Congratulations ! Sensor data read ok!\n”);
printf(“RH:%d.%d\n”,(databuf>>24)&0xff,(databuf>>16)&0xff);
printf(“TMP:%d.%d\n”,(databuf>>8)&0xff,databuf&0xff);
databuf=0;
}
else
{
printf(“Sorry! Sensor dosent ans!\n”);
databuf=0;
}
}
return 0;
}

==========================================================
2. 通过cd切换到work文件夹(即切换到DHT11.c所在的文件夹目录),以博主为例
     cd work
3. 然后输入gcc指令(相当于编译功能,将C语言转化为可执行的文件)
    gcc -Wall -o dht11 DHT11.c -lwiringPi
4. 接着输入以下命令执行程序
    sudo ./dht11
    程序顺利运行,最后使用ctrl+c可以结束程序。
最后我们会发现成功读取到了数据
《树莓派第三弹——GPIO功能学习(以DHT11传感器为例)》
RH表示湿度  TMP表示温度
是不是很有意思呢~
点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注