土壤湿度采集的python程序

土壤检测传感器将检测的模拟量(电压值)通过PCF8591转化为数字量。PCF8591采用典型的I2C总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。规定A/D器件地址为1001,引脚地址为A2A1A0,其值由用户选择,因此I2C系统中最多可接23=8个具有I2C总线接口的A/D器件。地址的最后一位为方向位R/
,当主控器对A/D器件进行读操作时为1,进行写操作时为0。总线操作时,由器件地址、引脚地址和方向位组成的从地址为主控器发送的第一字节。

当系统为A/D转换时,模拟输出允许为0。模拟量输入选择位取值由输入方式决定:四路单端输入时取00,三路差分输入时取01,单端与差分输入时取10,二路差分输入时取11。最低两位时通道编号位,当对0通道的模拟信号进行A/D转换时取00,当对1通道的模拟信号进行A/D转换时取01,当对2通道的模拟信号进行A/D转换时取10,当对3通道的模拟信号进行A/D转换时取11。在进行数据操作时,首先是主控器发出起始信号,然后发出读寻址字节,被控器做出应答后,主控器从被控器读出第一个数据字节,主控器发出应答,主控器从被控器读出第二个数据字节,主控器发出应答…一直到主控器从被控器中读出第n个数据字节,主控器发出非应答信号,最后主控器发出停止信号。程序设计如下:在这里插入代码片

import RPi.GPIO as GPIO

import time

DHTPIN = 5#定义数据输入引脚

GPIO.setmode(GPIO.BCM)#io端口的类型选择BCM模式

MAX_UNCHANGE_COUNT = 100

STATE_INIT_PULL_DOWN = 1

STATE_INIT_PULL_UP = 2

STATE_DATA_FIRST_PULL_DOWN = 3

STATE_DATA_PULL_UP = 4

STATE_DATA_PULL_DOWN = 5

def read_dht11_dat():#读取DH11的数据

GPIO.setup(DHTPIN, GPIO.OUT)

GPIO.output(DHTPIN, GPIO.HIGH)

time.sleep(0.05)#延迟50ms

GPIO.output(DHTPIN, GPIO.LOW)#设置低电平

time.sleep(0.02)#给信号提示传感器开始工作

GPIO.setup(DHTPIN, GPIO.IN, GPIO.PUD_UP)

unchanged_count = 0

last = -1

data = []

while True:

  current = GPIO.input(DHTPIN)

  data.append(current)

  if last != current:

     unchanged_count = 0

     last = current

  else:

     unchanged_count += 1

     if unchanged_count >

MAX_UNCHANGE_COUNT:

        break

state = STATE_INIT_PULL_DOWN

lengths = []

current_length = 0

for current in data:

  current_length += 1

  if state ==

STATE_INIT_PULL_DOWN:

     if current == GPIO.LOW:

        state = STATE_INIT_PULL_UP

     else:

        continue

  if state == STATE_INIT_PULL_UP:

     if current == GPIO.HIGH:

        state =

STATE_DATA_FIRST_PULL_DOWN

     else:

        continue

  if state ==

STATE_DATA_FIRST_PULL_DOWN:

     if current == GPIO.LOW:

        state = STATE_DATA_PULL_UP

     else:

        continue

  if state == STATE_DATA_PULL_UP:

     if current == GPIO.HIGH:

        current_length = 0

        state = STATE_DATA_PULL_DOWN

     else:

        continue

  if state ==

STATE_DATA_PULL_DOWN:

     if current == GPIO.LOW:

lengths.append(current_length)

        state = STATE_DATA_PULL_UP

     else:

        continue

if len(lengths) != 40:

  print "Data not good,

skip"

  return False

shortest_pull_up = min(lengths)

longest_pull_up = max(lengths)

halfway = (longest_pull_up +
shortest_pull_up) / 2

bits = []

the_bytes = []

byte = 0

for length in lengths:

  bit = 0

  if length > halfway:

     bit = 1

  bits.append(bit)

print “bits: %s, length:
%d” % (bits, len(bits))

for i in range(0,
len(bits)):

  byte = byte << 1

  if (bits[i]):

     byte = byte | 1

  else:

     byte = byte | 0

  if ((i + 1) % 8 == 0):

     the_bytes.append(byte)

     byte = 0

print the_bytes

checksum = (the_bytes[0] +
the_bytes[1] + the_bytes[2] + the_bytes[3]) & 0xFF

if the_bytes[4] != checksum:

  print "Data not good,

skip"

  return False

return the_bytes[0], the_bytes[2]

def main():

print “Raspberry Pi wiringPi
DHT11 Temperature test program\n”

while True:

  result = read_dht11_dat()

  if result:

     humidity, temperature = result

     print "humidity: %s %%,  Temperature: %s C`" % (humidity,

temperature)#湿度和温度输出结果

  time.sleep(1)

def destroy():

GPIO.cleanup() #重置针脚

if name == ‘main’:

try:

  main()

电路原理图
except KeyboardInterrupt:

  destroy() 

a = humidity

a = int(a)

if a <= 80

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值