起初想用python调用wiringpi库实现dht11的温湿度读取
但是没调试成功
c语言没问题,所以可以使用python运行可以执行的c程序
读取jetson格式数据实现温湿度的读取和打印
同时希望各位大佬能够开发香橙派python实现dht11的代码
官方例程的dht11代码我试了一下,发现用不了
wiringpi24对应的是香橙派3b的36号引脚
编译:gcc dht11.c -o dht11 -lwiringPi
把编译好的程序复制到python文件的同一目录
python:
import json
import subprocess
import time
def updateTempHum():
while True:
try:
res = json.loads(subprocess.check_output('./dht11', timeout=5).decode('utf-8'))
print(res)
print("Humidity:", res['RH'])
print("Temperature:", res['TMP'])
except subprocess.TimeoutExpired:
print("Timeout occurred. Retrying")
except Exception as e:
print("An error occurred:", e)
time.sleep(1) # Wait for 1 second before trying again
updateTempHum()
c代码:
//
//dht11.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 32
int pinNumber = 24; //use gpio1 to read data
uint32 databuf;
uint8 readSensorData(void)
{
uint8 crc;
uint8 i;
pinMode(pinNumber,OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a low level
delayMicroseconds(4);
digitalWrite(pinNumber, 0); // output a high level
delay(25);
digitalWrite(pinNumber, 1); // output a low level
delayMicroseconds(60);
pinMode(pinNumber, INPUT); // set mode to input
pullUpDnControl(pinNumber,PUD_UP);
if(digitalRead(pinNumber)==0) //SENSOR ANS
{
while(!digitalRead(pinNumber)); //wait to high
delayMicroseconds(80);
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)
{
if (-1 == wiringPiSetup()) {
//printf("Setup wiringPi failed!");
return 1;
}
pinMode(pinNumber, OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
//while(1)
//{
pinMode(pinNumber,OUTPUT); // set mode to output
digitalWrite(pinNumber, 1); // output a high level
//delay(3000);
if(readSensorData())
{
//printf("OK!\n");
//printf("RH:%d.%d\n",(databuf>>24)&0xff,(databuf>>16)&0xff);
//printf("TMP:%d.%d\n",(databuf>>8)&0xff,databuf&0xff);
printf("{\"RH\":\"%d.%d\", \"TMP\":\"%d.%d\"}",(databuf>>24)&0xff,(databuf>>16)&0xff,(databuf>>8)&0xff,databuf&0xff);
databuf=0;
}
else
{
printf("");
databuf=0;
}
//}
return 0;
}