功能:1.利用超声波传感器检测路过家门口人员,并鸣喇叭,同时记录到文件;
2.定时加热
3.当人员路过时,给安装在卧室计数器增加1
4.将Pico w用作服务器,用上位机读全部数据
5.可通过网络读RTC,并可以设置RTC
#ROUTER长连接
import network
import socket
from machine import Pin,RTC,Timer,PWM,UART,WDT
import time,utime
#pwm=PWM(Pin('LED'))#板上LED为输出
#pwm.freq(8)#最小频率:8HZ
#pwm.duty_u16(3276) #0-65536
rtc=machine.RTC()
tim=Timer()
#--------------------------------------
#重启时,读历史存储的时间数据
#'2022 12 4 6 18 25 29 0 '
with open('RTC.txt','r') as rFile:
rData=rFile.read()
strData=rData.split(' ')#将字符串用空格分开,生成字符串数组
strData1=strData[:8]#取前面的8个数据,生成新字符串数组
intData=[int(x) for x in strData1]#将字符串数组转成整形数组
#由于不断电重启时,RTC是准的,所以取消以下功能
#new=60*intData[5]+intData[6]+6 #取出分钟与秒,再加6,因为人为启动会延时6秒
#newMinute=int(new/60) #计算新的分钟
#newSecond=int(new%60) #计算新的秒
#intData[5]=newMinute #修分钟值
#intData[6]=newSecond #修改秒值
a=tuple(intData) #将整形数组转为元组
print(a)
rtc.datetime(a) #将新的时间设置到RTC
print(rtc.datetime())
#---------------------------------------
led=Pin('LED',Pin.OUT)
led.value(1)
time.sleep(0.2)
led.value(0)
time.sleep(0.2)
led.value(1)
time.sleep(0.2)
led.value(0)
in0=Pin(18,Pin.IN,Pin.PULL_UP)
in1=Pin(19,Pin.IN,Pin.PULL_UP)
in2=Pin(20,Pin.IN,Pin.PULL_UP)
in3=Pin(21,Pin.IN,Pin.PULL_UP)
K1=Pin(10,Pin.OUT) #1=off,0=on
K2=Pin(11,Pin.OUT) #1=off,0=on
K3=Pin(12,Pin.OUT) #1=off,0=on
K4=Pin(13,Pin.OUT) #1=off,0=on
K1.value(1)
K2.value(1)
K3.value(1)
K4.value(1)
#----------------------------------
#连接到WIFI
ssid = 'PicoW'
password = '13616781309'
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
# Wait for connect or fail
max_wait = 10
while max_wait > 0:
print(max_wait)
print(wlan.status())
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('waiting for connection...')
time.sleep(1)
# Handle connection error
if wlan.status() != 3:
wdt=WDT(timeout=5000) #当没有连接到WIFI,延时5秒,重启Pico W
#raise RuntimeError('network connection failed')
else:
print('connected')
led.value(1) #当Pico W连接到WIFI后,LED点亮,显示状态
#自动获得IP
#status = wlan.ifconfig()
#手动设置IP
#wlan.ifconfig(('172.20.10.6', '255.255.255.0', '192.168.0.1', '8.8.8.8'))
status = wlan.ifconfig()
#print( 'ip = ' + status[0] )
print(status)
# Open socket
addr = socket.getaddrinfo(status[0] , 4002)[0][-1] #设置服务器IP,PORT
s = socket.socket()
s.bind(addr)
s.listen(1) #服务器进入监听状态,等待客户端的连接
print('listening on', addr)
#--------------------------------------
'''
#初始化全部的数据纪录文件
with open('A1.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('A2.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('B1.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('B2.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('C1.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('C2.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('D1.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('D2.txt','w') as wFile:
for i in range(144):wFile.write('0'+'#')
with open('count.txt','w') as wFile:
for i in range(372):wFile.write('0'+'#')
with open('count0.txt','w') as wFile:
wFile.write('0')
print('init is ok!')
'''
#------------------------------------------------------------------
def Heating():
T=60*rtc.datetime()[4]+rtc.datetime()[5] #当前时间
Tstart=18*60+1#启动时间
Tstop=20*60+1 #停止时间
if T>=Tstart and T<Tstop and K4.value()==1 : K4.value(0) #加热
if T>=Tstop and K4.value()==0: K4.value(1) #停止加热
#------------------------------------------------------------------
def Save0():
T1=rtc.datetime()[4] #时
T2=rtc.datetime()[5] #分
T3=rtc.datetime()[6] #秒
#取出当天经过的人数
with open('count0.txt','r') as rFile:
rData=rFile.read()
count=int(rData)
#在0:0:0时,若今天有人经过,则进行存储
if count !=0 and T1==0 and T2==0 and T3==0:
#------------------------------------
#将当天人员经过的次数,存储,全年共372个数据
#取出全年存储的数据
with open('count.txt','r') as rFile:
rData=rFile.read()
rStr=rData.split('#') #用'#'分开,生成字符串数组
#取出当天在全年的位置
point=31*(rtc.datetime()[1]-1)+(rtc.datetime()[2]-1)
p=int(point)
rStr[p]=count
#保存数据
with open('count.txt','w') as wFile:
for i in range(372):
wFile.write(str(rStr)+'#')
#将当天经过的人数计数器清零,并保存到文件
count=0
with open('count0.txt','w') as wFile:
wFile.write(str(count))
#------------------------------------
#将A1与A2的值相加,存放到A2,同时,清空A1
#读A1中的数据
with open('A1.txt','r') as rFileA1:
rDataA1=rFileA1.read()
rStrA1=rDataA1.split('#')
#读A2中的数据
with open('A2.txt','r') as rFileA2:
rDataA2=rFileA2.read()
rStrA2=rDataA2.split('#')
#将合成数据写到A2中
#wA2=1
with open('A2.txt','w') as wFileA2:
for j in range(144):
wA2=int(rStrA1[j])+int(rStrA2[j])
wFileA2.write(str(wA2)+'#')
#将A1全部置0
with open('A1.txt','w') as wFileA1:
for i in range(144):
wFileA1.write('0'+'#')
#------------------------------------
#将B1与B2的值相加,存放到B2,同时,清空B1
#读B1中的数据
with open('B1.txt','r') as rFileB1:
rDataB1=rFileB1.read()
rStrB1=rDataB1.split('#')
#读B2中的数据
with open('B2.txt','r') as rFileB2:
rDataB2=rFileB2.read()
rStrB2=rDataB2.split('#')
#将合成数据写到B2中
with open('B2.txt','w') as wFileB2:
for i in range(144):
wB2=int(rStrB1)+int(rStrB2)
wFileB2.write(str(wB2)+'#')
#将B1全部置0
with open('B1.txt','w') as wFileB1:
for i in range(144):
wFileB1.write('0'+'#')
#------------------------------------
#将C1与C2的值相加,存放到C2,同时,清空C1
#读C1中的数据
with open('C1.txt','r') as rFileC1:
rDataC1=rFileC1.read()
rStrC1=rDataC1.split('#')
#读C2中的数据
with open('C2.txt','r') as rFileC2:
rDataC2=rFileC2.read()
rStrC2=rDataC2.split('#')
#将合成数据写到C2中
with open('C2.txt','w') as wFileC2:
for i in range(144):
wC2=int(rStrC1)+int(rStrC2)
wFileC2.write(str(wC2)+'#')
#将C1全部置0
with open('C1.txt','w') as wFileC1:
for i in range(144):
wFileC1.write('0'+'#')
#------------------------------------
#将D1与D2的值相加,存放到D2,同时,清空D1
#读D1中的数据
with open('D1.txt','r') as rFileD1:
rDataD1=rFileD1.read()
rStrD1=rDataD1.split('#')
#读D2中的数据
with open('D2.txt','r') as rFileD2:
rDataD2=rFileD2.read()
rStrD2=rDataD2.split('#')
#将合成数据写到D2中
#wD2=0
with open('D2.txt','w') as wFileD2:
for i in range(144):
wD2=int(rStrD1)+int(rStrD2)
wFileD2.write(str(wD2)+'#')
#将D1全部置0
with open('D1.txt','w') as wFileD1:
for i in range(144):
wFileD1.write('0'+'#')
print('Now has saved Data to A2-B2-C2-D2 OK!')
#------------------------------------------------
#------------------------------------------------------------------
#1秒定时器中断
#功能:1.重启,2.纪录时间,3.加热,4.存储
def tick(timer):
if wlan.status() != 3:
#当没有WIFI连接时,重启PICO W
wdt=WDT(timeout=5000)
else:
#--------------------
#纪录时间到文件
str1=''
tup=rtc.datetime()
for i in range (8):
str1=str1+str(tup)+' '
with open('RTC.txt','w') as wFile:
wFile.write(str1)
#-------------------
led.value(1)
#用于加热
Heating()
#0点时存储
Save0()
tim.init(freq=1,mode=Timer.PERIODIC,callback=tick)
#------------------------------------------------------------------
#楼梯口超声波
#处理下降中断
def int_handler00(pin):
in0.irq(handler=None)#关闭中断
K3.value(0)#K3闭合
K1.value(0) #计数器ON
utime.sleep(1)#
K3.value(1)#K3断开
K1.value(1) #计数器OFF
#-----------------
#计数器加1
with open('count0.txt','r') as rFile:
rData=rFile.read()
countN=int(rData)
countN +=1
with open('count0.txt','w') as wFile:
wFile.write(str(countN))
#-------------------------------
#根据时间,将A1中,与当前时间相同的数据加1
with open('A1.txt','r') as rFile:
rData=rFile.read()
rStr=rData.split('#')
print("Read from A1.txt OK!")
point=(60*rtc.datetime()[4]+rtc.datetime()[5])/10 #计算当前时间:单位:10分钟
p=int(point) #取整
increaseBase=int(rStr[p]) #取出当前时间的计数器的值
rStr[p]=str(increaseBase+1) #将当前时间的计数器值加1
with open('A1.txt','w') as wFile: #以写的方式打开文件
for i in range(144): #把数据全部写到文件中
wFile.write(rStr+'#')
print("Write to A1.txt OK!")
#----------------------------
#处理完成后,再次开启中断
in0.irq(trigger=Pin.IRQ_FALLING,handler=int_handler00)
#当in0下降时,产生中断,在int_handler中处理
in0.irq(trigger=Pin.IRQ_FALLING, handler=int_handler00)
#-------------------------------------------------------------
#阁楼超声波
#处理下降中断
def int_handler10(pin):
in1.irq(handler=None) #关闭中断
print("Interrupt in1!")
K2.value(0) #警笛ON
K1.value(0) #计数器ON
utime.sleep(2)
K2.value(1) #警笛OF
K1.value(1) #计数器OFF
#-------------------------------
#计数器加1
with open('count0.txt','r') as rFile:
rData=rFile.read()
countN=int(rData)
countN +=1
with open('count0.txt','w') as wFile:
wFile.write(str(countN))
#---------------------------------
#根据时间,在当前位置增加1
with open('B1.txt','r') as rFile:
rData=rFile.read()
rStr=rData.split('#')
print("Read from B1.txt OK!")
point=(60*rtc.datetime()[4]+rtc.datetime()[5])/10
p=int(point)
increaseBase=int(rStr[p])
rStr[p]=str(increaseBase+1)
with open('B1.txt','w') as wFile:
for i in range(144):
wFile.write(rStr+'#')
print("Write to B1.txt OK!")
#------------------------------------
#当in0下降时,产生中断,在int_handler中处理
in1.irq(trigger=Pin.IRQ_FALLING,handler=int_handler10)
in1.irq(trigger=Pin.IRQ_FALLING, handler=int_handler10)
#------------------------------------------------------------------
#入室门
#处理上升中断
def int_handler20(pin):
in2.irq(handler=None) #关闭中断,以便处理中断
print("Interrupt in2!")
K3.value(0)
utime.sleep(0.5)
K3.value(1)
utime.sleep(0.5)
K3.value(0)
utime.sleep(0.5)
K3.value(1)
#--------------------------------
#根据时间,将当前位置增加1
with open('C1.txt','r') as rFile:
rData=rFile.read()
rStr=rData.split('#')
print("Read from C1.txt OK!")
point=(60*rtc.datetime()[4]+rtc.datetime()[5])/10
p=int(point)
increaseBase=int(rStr[p])
rStr[p]=str(increaseBase+1)
with open('C1.txt','w') as wFile:
for i in range(144):
wFile.write(rStr[i]+'#')
print("Write to C1.txt OK!")
#----------------------------------
#再次启动中断
in2.irq(trigger=Pin.IRQ_RISING,handler=int_handler20)
in2.irq(trigger=Pin.IRQ_RISING, handler=int_handler20)
#------------------------------------------------------------------
#红外线
#处理下降中断
def int_handler30(pin):
in3.irq(handler=None) #关闭中断,以便处理中断
print("Interrupt in3!")
K3.value(0)
utime.sleep(0.5)
K3.value(1)
#-------------------------------
#根据时间,将当前位置增加1
with open('D1.txt','r') as rFile:
rData=rFile.read()
rStr=rData.split('#')
print("Read from D1.txt OK!")
point=(60*rtc.datetime()[4]+rtc.datetime()[5])/10
p=int(point)
increaseBase=int(rStr[p])
rStr[p]=str(increaseBase+1)
with open('D1.txt','w') as wFile:
for i in range(144):
wFile.write(rStr[i]+'#')
print("Write to D1.txt OK!")
#------------------------------
#再次启动中断
in3.irq(trigger=Pin.IRQ_FALLING,handler=int_handler30)
in3.irq(trigger=Pin.IRQ_FALLING, handler=int_handler30)
#============================
#网络通信
while True:
#显示客户端
#print(wap.status())
cl, addr = s.accept()
print('client connected from', addr)
try:
#等待客户端发送数据
while True:
request = cl.recv(1024)
print(request)
request = str(request)
#----------------------------
#点亮LED
if request.find('LedOn') !=-1:
print("led on")
led.value(1)
cl.send("led on")
#关闭LED
elif request.find('LedOff') !=-1:
print("led off")
led.value(0)
cl.send("led off")
elif request.find('WDT') !=-1:
wdt=WDT(timeout=1000)
#读当前时间
elif request.find('rtc') !=-1:
#将当前PICO W的实时时间,发送到客户端,以验证是否正确
str2=''
tup2=rtc.datetime() #取出时间元组
#将元组转化成字符串
for item2 in tup2:str2=str2+str(item2)+' '
cl.send(str2+'\n\r')
#网络设置PICO W时间
elif request.find('RTC') !=-1:
print("RTC is setting from client!")
#---------------------------
#将当前PICO W时间发关到客户端
last=''
tup=rtc.datetime()
for item in tup:last=last+str(item)+' '
#print('last time is=')
last='last= '+last
cl.send(last)
#-----------------------------
#取出客户端发送过来的时间数据
# (2022 12 4 6 18 25 29 0 )
first=request.find('(') #时间数据开始位置
end=request.find(')') #时间数据结束位置
rData=request[first+1:end] #取出时间数据,如:'2022 12 4 6 18 25 29 0 '
print(rData)
strData=rData.split(' ') #根据空格,将字符串转化成字符串数组
strData1=strData[:8] #取前面8个数据
intData=[int(x) for x in strData1] #将字符串数组转化成整形数组
a=tuple(intData) #将整形数组转化成元组
print(a)
rtc.datetime(a) #将RTC的时间,设置成客户端发过来的数据
#将客户端发过来的数据,送到客户羰
send1=''
send1='new = '+rData
cl.send(send1)
#-------------------------------
#将当前PICO W的实时时间,发送到客户端,以验证是否正确
str1=''
tup=rtc.datetime() #取出时间元组
#将元组转化成字符串
for item in tup:str1=str1+str(item)+' '
cl.send('now = '+str1)
#-------------------
#在THONNY中显示远程设置时间的实际值
strData=str1.split(' ')
strData1=strData[:8]
intData=[int(x) for x in strData1]
a=tuple(intData)
print(a)
#一定要加,否则客户端无法显示
time.sleep(0.5) #延时,以便将数据发送给客户端
elif request.find('A1') !=-1:
with open('A1.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('A2') !=-1:
with open('A2.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('B1') !=-1:
with open('B1.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('B2') !=-1:
with open('B2.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('C1') !=-1:
with open('C1.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('C2') !=-1:
with open('C2.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('D1') !=-1:
with open('D1.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('D2') !=-1:
with open('D2.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('count') !=-1:
with open('count.txt','r') as rFile:
rData=rFile.read()
cl.send(rData)
time.sleep(0.5)
elif request.find('CLOSE') !=-1:
cl.send('socket is closed!')
time.sleep(1)
cl.close()
print('connection closed')
#闪烁LED
if led.value()==0:
led.value(1)
time.sleep(0.1)
led.value(0)
else:
led.value(0)
time.sleep(0.1)
led.value(1)
#cl.close()
except OSError as e:
cl.close()
print('connection closed')
Pico W家用控制器
-
- 随机主题
- 回复总数
- 阅读次数
- 最新文章