CPS大作业(1):dht11传感器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cemao4548/article/details/80711126

CPS大作业

国赛半决赛在东南大学九龙湖校区打完,题很有意思。拿了个半决赛第六,名落孙山无缘决赛。话说别人的学校环境真好啊。校区好大,环境也好,人烟稀少。还抽空去了南京大学鼓楼校区,人就好多(学术气息超浓),学校面积跟我的高中差不多大。
回来之后就要做CPS和数据库的大作业。CPS这边刚好把大创项目做了。
基于物联网的大规模灌溉系统。

dht11传感器的使用

dht11可以感受空气中的温度和湿度
温度量程0~50℃
湿度量程20%~90%RH
精度分别是 ±5RH 和 ±2℃ //实际使用过程中输出为整数类型 在差错范围内无波动。

获得温湿度的代码如下 环境是raspberry上Python2.7

def getTemAndHum():
channel = 4
     data = []  
 j = 0  
 GPIO.setmode(GPIO.BCM)    
 time.sleep(1)  
 GPIO.setup(channel, GPIO.OUT)
 GPIO.setup(17,GPIO.IN)  
 GPIO.output(channel, GPIO.LOW)  
 time.sleep(0.02)  
 GPIO.output(channel, GPIO.HIGH)  
 GPIO.setup(channel, GPIO.IN)  
 while GPIO.input(channel) == GPIO.LOW:  
   continue  
 while GPIO.input(channel) == GPIO.HIGH:  
   continue  
 while j < 40:  
   k = 0  
   while GPIO.input(channel) == GPIO.LOW:  
     continue  
   while GPIO.input(channel) == GPIO.HIGH:  
     k += 1  
     if k > 100:  
       break  
   if k < 8:  
     data.append(0)  
   else:  
     data.append(1)  
   j += 1  
 print "sensor is working."  
 print data
 data.append(0)
 del data[0]
 humidity_bit = data[0:8]  
 humidity_point_bit = data[8:16]  
 temperature_bit = data[16:24]  
 temperature_point_bit = data[24:32]  
 check_bit = data[32:40]  
 humidity = 0  
 humidity_point = 0  
 temperature = 0  
 temperature_point = 0  
 check = 0  
 for i in range(8):  
   humidity += humidity_bit[i] * 2 ** (7-i)  
   humidity_point += humidity_point_bit[i] * 2 ** (7-i)  
   temperature += temperature_bit[i] * 2 ** (7-i)  
   temperature_point += temperature_point_bit[i] * 2 ** (7-i)  
   check += check_bit[i] * 2 ** (7-i)  
 tmp = humidity + humidity_point + temperature + temperature_point  
#if check == tmp:  
 if temperature < 60 and humidity <200:
   if temperature >50:
     temperature = temperature / 2
   print "temperature :", temperature, "*C, humidity :", humidity, "%"  
   submit(temperature,humidity,GPIO.input(17))
   TakeCamAndSubmit()
 else: 
   print "wrong temprt:", temperature, "*C, humidity :", humidity, "%"
   pass
 GPIO.cleanup() 

协议原理

dht11传感器获取信息之前和下位机之间有握手协议
详细描述是
下位机发送信号 low18ms high20-40us
dht11响应信号 low80us high80us low50us high26us low50us high70us

  • 其中下位机发送请求信息的信号
  • low80us 和 high80us 是响应信息表示收到请求
  • 后面的low50us可以理解为停顿
  • high26us表示0 high70us表示1

Tips

  • 每次读数间隔尽量在1秒以上,长时间不间断读数会导致数据不稳定。
  • 代码中if temperature < 60 and humidity <200:
    if temperature >50:
    temperature = temperature / 2
    是对获得数据的判断和修改
    实际应用中如果使用tmp做校验因子,有些数据因为信道噪音可能左右移动1bit。
    但数据仍然可用,我们只需将不稳定数据做x2 或者 /2的处理即可。提升数据的可用性,
    降低内存和运行时间成本。

猜你喜欢

转载自blog.csdn.net/cemao4548/article/details/80711126