DHT11的驱动使用C语言编写   然后用python调用C的程序 显示温湿度

pycall.py文件如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*- import RPi.GPIO as GPIO
import time
import DHT11 pin=14 while True:
hum,tem=DHT11.read_data(pin)
print('hum:%f, tem:%f' %(hum,tem))
time.sleep(2)

c语言代码如下:

#include <stdio.h>
#include <wiringPi.h>
#include <time.h>

//2019.1.18 时序还没调试完成
//编译使用
//运行需要使用 g++ -Wall -o LEDtest LEDtest.cpp -lwiringPi

//数据定义 sudo ./a.out
unsigned int U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned int U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

typedef unsigned char BOOL;
#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif

#define DHT11_PIN 14
typedef unsigned short int u8;
typedef unsigned char uint8_t;
typedef unsigned int u16;

void mdelay(u16 ms);

void udelay(u16 us);

static void DHT11_DataPin_Configure_Output(int pin)
{
pinMode(pin,OUTPUT);
}

static void DHT11_DataPin_Configure_Input(int pin)
{
pinMode(pin,INPUT);
}

BOOL DHT11_get_databit(int pin)
{
int val;
val=digitalRead (pin);
if(val == LOW){
return FALSE;
}else{
return TRUE;
}
}

void DHT11_set_databit(BOOL level,int pin)
{
if(level == TRUE){
digitalWrite (pin, HIGH);
}else{
digitalWrite (pin, LOW);
}
}

static uint8_t DHT11_read_byte(int pin)
{
uint8_t i;
uint8_t data = 0;
long k=0;
for(i = 0; i < 8; i++)
{
data <<= 1;
while((!DHT11_get_databit(pin)));
delayMicroseconds(35);
if(DHT11_get_databit(pin)){
data |= 0x1;
while(DHT11_get_databit(pin))
{
k++;
if(k>200000)
{
//printf("a \r\n");
return 0;
}
}
}else{

}
}
return data;
}

static uint8_t DHT11_start_sampling(int pin)
{
DHT11_DataPin_Configure_Output(pin);
//主机拉低18ms? ?
DHT11_set_databit(FALSE,pin);
delay(20);
DHT11_set_databit(TRUE,pin);
//总线由上拉电阻拉高 主机延时20us
//udelay(10);
//udelay(10);
DHT11_DataPin_Configure_Input(pin);
delayMicroseconds(50);
//主机设为输入 判断从机响应信号
DHT11_set_databit(TRUE,pin);

DHT11_DataPin_Configure_Input(pin);

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行?? ? ?
if(!DHT11_get_databit(pin))//T !?? ? ?
{
long k=0;
//判断从机是否发出 80us 的低电平响应信号是否结束?? ?
while((!DHT11_get_databit(pin)))
{
k++;
if(k>100000) {printf("b \r\n");return 0;}
}
// printf("DHT11 answers.\r\n");
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
k=0;
while((DHT11_get_databit(pin)))
{
k++;
if(k>100000){printf("c \r\n");;return 0;}
}
return 1;
}

return 0;
}

typedef struct
{
unsigned int hh;
unsigned int hl;
unsigned int th;
unsigned int tl;
}d_t;

d_t DHT11_get_data(int pin)
{
u8 temp;
d_t res;
if(DHT11_start_sampling(pin))
{
//printf("DHT11 is ready to transmit data\r\n");
//数据接收状态
U8RH_data_H_temp = DHT11_read_byte(pin);

U8RH_data_L_temp = DHT11_read_byte(pin);
res.hh=
U8T_data_H_temp = DHT11_read_byte(pin);
res.th=
U8T_data_L_temp = DHT11_read_byte(pin);
U8checkdata_temp = DHT11_read_byte(pin);

/* Data transmission finishes, pull the bus high */
DHT11_DataPin_Configure_Output(pin);
DHT11_set_databit(TRUE,pin);
//数据校验

temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
res.hh=U8RH_data_H;
U8RH_data_L=U8RH_data_L_temp;
res.hl=U8RH_data_L;
U8T_data_H=U8T_data_H_temp;
res.th=U8T_data_H;
U8T_data_L=U8T_data_L_temp;
res.tl=U8T_data_L;
U8checkdata=U8checkdata_temp;

//printf("DHT11 tempature %d.%d humidity %d.%d \r\n",U8T_data_H,U8T_data_L,U8RH_data_H,U8T_data_L);
}
else
{
//printf("checksum failure \r\n");
res.hh=0;res.hl=0;res.th=0;res.tl=0;
}
}
else
{
printf("DHT11 didn't answer. Sampling failed. \r\n");
}
return res;
}

void mdelay(u16 ms)
{
if(ms != 0){
delay(ms);
}
}

void udelay(u16 us)
{
while(us--);
}
/*
int main(void)
{
int pin=14
int res=wiringPiSetupGpio();
while(1)
{
DHT11_get_data(pin);
mdelay(1200);
}
}
*/
//
//使用python来调用c写的函数
//
//

#include "Python.h"
static DHT_read_data(PyObject* self,PyObject* args)
{
int pin=0;
if(PyArg_ParseTuple(args,"i",&pin)==0)
return NULL; //失败
d_t res=DHT11_get_data(pin);

float hum=res.hh+res.hl*1.0/100;
float tem=res.th+res.tl*1.0/100;

return Py_BuildValue("dd",hum,tem);
}

static PyMethodDef DHT11_methods[]=
{
//注册
{"read_data",DHT_read_data,METH_VARARGS}
};

void initDHT11()
{
//模块初始化函数
printf("dht11\n");
wiringPiSetupGpio();
Py_InitModule("DHT11",DHT11_methods);
}

//python setup.py build
//sudo python setup.py install

setup.py文件内容如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*- from distutils.core import setup,Extension DHT11_Extension=Extension('DHT11',sources=['main.c'],libraries=['wiringPi']) setup(name='DHT11',ext_modules=[DHT11_Extension])

单单编译一个C文件的话可以使用gcc main.c -lwiringPi

然后编译C文件 需要先编写setup.py 内容如上

 python  setup.py build 用于编译文件  会出现一些警告信息  可以忽略不理会
 
 再使用这个 sudo python setup.py install 把这个模块安装到python
 
然后再使用sudo python pycall.py  如下图显示:
 
 
 
 
 
 

python调用C程序代码的更多相关文章

  1. python调用其他程序或脚本方法(转)

    python运行(调用)其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地 ...

  2. 存储过程系列之存储过程sql数据库调用和程序代码调用

    1.存储过程,无参数的存储过程 创建无参数存储存储过程 Create Procedure DCEMREMR_TEMPLATEAs SELECT TOP 10 [FILENAME],[FILETITLE ...

  3. python调用exe程序

    最近在做测试,公司的产品做成了exe,让我去测试,C++写的程序啊,我直接用python调用那个exe,也有个坑,必须要到exe在的那个目录下,然后才能调用: import os def main() ...

  4. Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序

    Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ...

  5. Windows中使用 Python 调用 Matlab 程序

    https://ww2.mathworks.cn/help/matlab/matlab_external/system-and-configuration-requirements.html http ...

  6. PHP中实现异步调用多线程程序代码

    本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...

  7. python调用java程序--jpype

    官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html ...

  8. [python][matlab]使用python调用matlab程序

    问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ...

  9. python 调用exe程序

    #!/usr/bin/python #-*- coding:utf-8 -*- import os, subprocess import tkMessageBox import msg_box def ...

随机推荐

  1. kubernetes系列之ConfigMap使用方式

    作用理解 核心用途就是容器和配置的分离解耦. 如启用一个mysql容器,mysql容器重要的文件有两部分,一部分为存储数据文件,一部分为配置文件my.cnf,存储数据可以用持久存储实现和容器的分离解耦 ...

  2. 【视频】使用ASP.NET Core开发GraphQL服务

    GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL来自Facebook,它于2012年开始开发,2015年开源. GraphQL与编程语言无关,可以使用很 ...

  3. C++版 - 剑指offer面试题28: 字符串的排列

    题目: 字符串的排列 热度指数:5777 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出 ...

  4. 版本管理工具Git(一)简要介绍

    版本管理工具不但可以备份而且还能记录版本,也就是同一个东西不同时期的状态同时可以跟踪追溯.版本管理工具由CVS.SVN.Git.GitHub. 最早的版本管理工具CVS,因为多人开发项目导致工作很难协 ...

  5. windows下使用jenkins持续集成.net项目

    前言 随着微服务的兴起,原先一个庞大的项目,被切分一个个功能独立的微服务,虽然使得业务系统的扩展性和维护性得到提升,但是也加大了维护人员的工作量.有的系统由成百上千个微服务组成,如果每次有修改,都要手 ...

  6. 补习系列(9)-springboot 定时器,你用对了吗

    目录 简介 一.应用启动任务 二.JDK 自带调度线程池 三.@Scheduled 定制 @Scheduled 线程池 四.@Async 定制 @Async 线程池 小结 简介 大多数的应用程序都离不 ...

  7. 导航页-LeetCode专题-Python实现

    LeetCode专题-Python实现之第1题:Two Sum LeetCode专题-Python实现之第7题:Reverse Integer LeetCode专题-Python实现之第9题:Pali ...

  8. MariaDB Galera Cluster 部署 + keepalived实现高可用

    MariaDB Galera Cluster 部署 MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,同时提高系统的负载能力 ...

  9. [十六]基础类型BigInteger简介

        BigInteger和BigDecimal都是Java针对大数提供的类 超出了java的表示范围   属性简介 借助于signum和mag 来实现数据的符号位和实际数据的保存 final in ...

  10. [T-SQL] NCL INDEX 欄位選擇效能影響-解析

    因為這篇文章寫的比較長一些,我就將總結先列出來 總結 1. 除了WHERE條件外,JOINColumn除了記得建立索引,也要注意到選擇性的高低,如果真的找不到可用的Column,可以考慮在兩邊關聯的表 ...