Dht11.py:
import pyb
from pyb import UART
from pyb import Pin,delay,udelay
import time
class DHT11:
def __init__(self,pin_name):
time.sleep(1)
self.N1 = Pin(pin_name, Pin.OUT_PP)
self.PinName=pin_name
pyb.delay(10)
def read_data(self):
self.__init__(self.PinName)
data=[]
j=0
N1=self.N1
N1.low()
delay(20)
N1.high()
N1 = Pin(self.PinName, Pin.IN)
udelay(30)
if N1.value() != 0:
return [0,0]
while N1.value()==0:
continue
while N1.value()==1:
continue
while j<40:
k=0
while N1.value()==0:
continue
while N1.value()==1:
k+=1
if k>100:break
if k<3:
data.append(0)
else:
data.append(1)
j=j+1
print('Sensor is working')
j=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:
print('temperature is',temperature,'-wet is',humidity,'%')
else:
print('Error:',humidity,humidity_point,temperature,temperature_point,check)
return [str(temperature),str(humidity)]
# main.py
import pyb
from pyb import Pin
Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X1','X2','X3','X4']]
STEPER_ROUND=512 #转动一圈(360度)的周期
ANGLE_PER_ROUND=STEPER_ROUND/360 #转动1度的周期
class SteperMotor():
def __init__(self,pin = None,speed=2):
if pin != None:
self.Pins = pin
else:
self.Pins = Pin_All
self.Speed = speed
#私有方法
def __SteperWriteData(self,data):
count=0
for i in data:
self.Pins[count].value(i)
count+=1
def __SteperFrontTurn(self):
speed = self.Speed
self.__SteperWriteData([1,1,0,0])
pyb.delay(speed)
self.__SteperWriteData([0,1,1,0])
pyb.delay(speed)
self.__SteperWriteData([0,0,1,1])
pyb.delay(speed)
self.__SteperWriteData([1,0,0,1])
pyb.delay(speed)
def __SteperBackTurn(self):
speed = self.Speed
self.__SteperWriteData([1,1,0,0])
pyb.delay(speed)
self.__SteperWriteData([1,0,0,1])
pyb.delay(speed)
self.__SteperWriteData([0,0,1,1])
pyb.delay(speed)
self.__SteperWriteData([0,1,1,0])
pyb.delay(speed)
def __SteperStop(self):
self.__SteperWriteData([0,0,0,0])
def steperRun(self,angle):
val=ANGLE_PER_ROUND*abs(angle)
if(angle>0):
for i in range(0,val):
self.__SteperFrontTurn()
else:
for i in range(0,val):
self.__SteperBackTurn()
angle = 0
self.__SteperStop()
温湿度main:
from pyb import Pin
from pyb import ADC
from stepermotor import SteperMotor
from dht11 import DHT11
#0:亮 1:暗
light = Pin('X22',Pin.IN)
#0:湿 1:干
hum = Pin('Y11',Pin.IN)
dht = DHT11('Y12')
#继电器低电平触发
water = Pin('X12',Pin.OUT_PP)
fan = Pin('X11',Pin.OUT_PP)
water.value(1)
fan.value(1)
#步进电机
Pin_All=[Pin(p,Pin.OUT_PP) for p in ['X21','X20','X19','X18']]
#转速(ms) 数值越大转速越慢 最小值2ms
sm = SteperMotor(pin = Pin_All,speed=2)
hood = False #记录遮光罩的状态,默认是关闭
def readTaHData():
DATA = dht.read_data()#读取温湿度的值
print(DATA[0],'℃')
print(DATA[1],'%')
#温度大于25度,打开风扇,进行通风
if int(DATA[0]) > 21:
fan.value(0)
else:
fan.value(1)
if __name__ == '__main__':
while True:
readTaHData()
h_d = hum.value()
print('hum:',h_d)
if h_d:
#土壤较干,打开抽水泵进行浇水
water.value(0)
else:
#土壤较湿,关闭抽水泵停止浇水
water.value(1)
l_d = light.value()
print('light:',l_d)
if l_d:
#光线较暗,启动步进电机,关闭大棚的遮光罩
if hood:
sm.steperRun(-360)
sm.steperRun(-360)
hood = False
else:
#光线较亮,启动步进电机,打开大棚的遮光罩
if not hood:
sm.steperRun(360)
sm.steperRun(360)
hood = True