树莓派自动浇水代码
这是在树莓派上运行的最终代码,实现的功能是自动浇水并把相关数据写入文件
文章来源于sogeisetsu的GitHub。 如果喜欢欢迎fork和star树莓派云灌溉系统设计
用python2运行
# coding=UTF-8
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
for i in range (10): #这里设置的是循环十次,在实际应用中可以改为 while True:
channel = 16 # 引脚号16,这是设置dht11用的
data = [] # 温湿度值
j = 0
# 计数器
a=20
GPIO.setmode(GPIO.BCM) # 以BCM编码格式
time.sleep(1) # 时延一秒
GPIO.setup(channel, GPIO.OUT)
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 "开始工作."
# print data # 输出初始数据高低电平
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: # 数据校验,相等则输出
print "temperature : ", temperature, ", humidity : ", humidity
c="温度"+str(temperature)+"."+"/"+"湿度"+str(humidity)
GPIO.setup(21, GPIO.IN)
if GPIO.input(21) == GPIO.LOW:#设置土壤湿度传感器
print "土壤检测结果:潮湿"
c=c+"
"+"土壤潮湿"+"
"+"推荐不要浇水,具体以机器操作为准"
else:
print "土壤检测结果:干燥"
c=c+"
"+"土壤干燥"+"
"+"推荐浇水,具体以机器操作为准"
f=open("123.txt","w+") #将数据写入文件
f.write(c)
f.close
if temperature >= 20:
print"jiaoshui"
GPIO.setup(25, GPIO.OUT)#控制继电器
GPIO.output(25, GPIO.LOW)#这句意义不大,也可以是high,因为电阻不合适无论高低电平都是通路,所以只能采用setup后再cleanup。
print("3")#我这里设置的是浇水时间3秒
time.sleep(1.0)
print("2")
time.sleep(1.0)
print("1")
time.sleep(1.0)
GPIO.cleanup()
GPIO.setmode(GPIO.BCM) # 以BCM编码格式
time.sleep(1) # 时延一秒
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW)
else: # 错误输出错误信息,和校验数据
print "出现错误,输出校验结果"
print "temperature : ", temperature, ", humidity : ", humidity, " check : ", check, " tmp : ", tmp
time.sleep(2) #每隔2秒检测一次
GPIO.cleanup() # 重置针脚