Pico W家用控制器

树莓派 PICO 和 RP2040 相关应用讨论
回复
wangjingen
帖子: 3
注册时间: 2022年 11月 23日 20:38

Pico W家用控制器

#1

帖子 wangjingen »

功能: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')


    
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章