[Micropython]TPYBoard v202 利用單片機快速實現家庭智能控制平台


一提到智能家庭,大家可能首先想到的是各種大佬級公司搞的牛逼產品,或者說是創新產品。想想就覺得很復雜,有的用工控機,有的用樹莓派,還有的用arduino,不管用什么,都繞不過服務器進行控制,比如yeelink平台,騰訊的智能硬件平台等等。其實,真實實現起來,並沒有想想中這么復雜,我們甚至只用一個小的單片機就能實現。


0x01 單片機實現web服務器

探討用單片機來實現web服務器的文章通過baidu也能找到幾篇,但比較詳實的實現方法並沒有找到,這里考慮有兩種思路可以完成,一種是有線的lan模塊,如w5500,這種模塊本身就帶有web服務的部分功能,使用起來比較簡單,但是只能基於lan進行訪問。另一種是通過stm32等單片機,配合網絡模塊來完成。當前我能想到的最簡單的方法就是用stm32+esp8266來實現。基於第一種方法,我覺得受模塊性能影響比較大,受限於模塊,沒有開發感。於是考慮用第二種方法。這個方法里,有人用arduino來完成,這要基於c進行編程。另外,就是考慮用micropython,這樣直接可以用python來實現。這里依然使用tpyboard V202。


0x02 模擬實現家庭智能家居控制平台

因為沒有想好要做一個多么復雜的實驗,只是想能模擬一下效果,所有在整個的模塊過程中,我選用了tpyboard v202開發板做主控制板,用一個發光二極管來模擬一個台燈(現實中,這里其實可以用一個繼電器來控制其它設備的通斷電),用一個直流小電機加迷你風扇葉表示模擬電風扇。整個實現還用到了一個三極管(S9014,NPN)來控制直流電機。


0x03 硬件的搭建與連接
發光二極管的使用

發光二極管使用比較簡單,直接看它的兩條“腿”,長的那個是正極,反之是負極。


直流小電機的使用方法


上圖直流小電機中,紅色框內的兩個接線端A和B,無論那個接正極或負極都可以,只不過轉動的方向不一樣而已。本次我是用B端接入正極,正好是順時針轉動。


三極管S9014(NPN)的使用方法

本次我們使用S9014的放大和開關功能,集電極接入v202的3.3V引腳,發射極接入電機某一端,通過給基極高低電平來控制發射極和集電極之間是否導通,從而控制直流電機轉動或停止。下面來介紹一下接線方法我的實物連接圖


0x04 利用micropython實現web服務器

首先,編輯一個main.py文件。v202 開機自啟動main.py 文件try:   
       import usocket as socket
except:
        import socket
import network
from machine import UART
from machine import Pin

led_flag=Pin(2, Pin.OUT)#esp8266模塊上的小燈 高電平:滅 低電平:亮
led = Pin(4, Pin.OUT)#發光二極管的控制引腳
motor = Pin(5, Pin.OUT)#直流電機的控制引腳
#初始化
led.low()
motor.low()
led_flag.high()
def do_connect(ssid,pwd):
        sta_if = network.WLAN(network.STA_IF)#STA 模式
        sta_if.active(False)
        if not sta_if.isconnected():#判斷是否連接
                sta_if.active(True)
                sta_if.connect(ssid,pwd)#ssid:WIFI名稱 pwd:WIFI 密碼
                while not sta_if.isconnected():
                        pass
        if sta_if.isconnected():
                return sta_if.ifconfig()[0]
def main(ip_,dev_data,login_data,name,pwd):

        s = socket.socket()
        ai = socket.getaddrinfo(ip_, 80)
        addr = ai[0][-1]
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind(addr)
        s.listen(5)
        led_flag.low()
        #s_data=login_data
        while True:
                res = s.accept()
                client_s = res[0]
                client_addr = res[1]
                led_flag.high()
                req =client_s.readline()
                while True:
                        h = client_s.readline()
                        if h == b"" or h == b"\r\n":
                                break
                        #print(h)
                        req+=(h.decode('utf-8').lower())
                print("Request:")
                req=req.decode('utf-8').lower().split('\r\n')
                #http header 解析
                req_data=req[0].lstrip().rstrip().replace(' ','')
                print(req_data)
                if req_data.find('favicon.ico')>-1:
                        client_s.close()
                        continue
                else:
                        if len(req_data)<=12:
                                #說明是第一次訪問,輸入login.html
                                s_data=login_data
                        else:
                                req_data=req_data.replace('get/?','').replace('http/1.1','')
                                _name=req_data.find('name')
                                _pwd=req_data.find('pwd')
                                if _name>-1 and _pwd>-1:
                                        #判斷是否是用戶登錄
                                        if req_data.find(name)>-1 and req_data.find(pwd)>-1:
                                                s_data=dev_data
                                                print('Login Success!')
                                        else:
                                                f=open('fail.html','r')
                                                s_data=f.read()
                                                f.close()
                                                print('Login Fail!')
                                else:
                                        #判斷是否是控制LED
                                        _index=req_data.find('led=')
                                        if _index>-1:
                                                s_data=dev_data
                                                led_val=req_data[_index+4:_index+6].lstrip().rstrip()
                                                print('led:',led_val)
                                                if led_val=='on':
                                                        led.value(1)
                                                else:
                                                        led.value(0)
                                        #判斷是否是控制電機
                                        _index=req_data.find('motor=')
                                        if _index>-1:
                                                s_data=dev_data
                                                motor_val=req_data[_index+6:_index+8].lstrip().rstrip()
                                                print('motor_val:',motor_val)
                                                if motor_val=='on':
                                                        motor.value(1)
                                                else:
                                                        motor.value(0)
                        print('-----------')
                        client_s.send(s_data)
                        client_s.close()
                led_flag.low()

f=open('device.html','r')
dev_html=f.read()
f.close()
f=open('login.html','r')
login_html=f.read()
f.close()
f=open('info.txt','r')
info=f.read()
f.close()
name=info.split(',')[0].lstrip().rstrip()
pwd=info.split(',')[1].lstrip().rstrip()
print('name:',name)
print('pwd:',pwd)
myip_=do_connect('essid','pwd')#家中網絡的WIFI名稱和密碼
print(myip_)
main(myip_,dev_html,login_html,name,pwd)

login.html 登錄頁面:
<html>
        <head>
                <title>智能家庭網絡</title>
                <meta name="viewport" content="width=device-width, initial-scale=1" />
                <style type="text/css">
                        h2
                        {
                                margin-top:4%;
                                margin-bottom:40px;
                        }
                </style>
        </head>
        <body>
                <center>
                <h2>歡迎登錄智能家庭網絡平台</h2>
                        <form action="/" method="get" accept-charset="utf-8">
                                <p style="color:red">用戶名或密碼錯誤!</p>
                                <p>用戶名: <input type="text" name="name"  /></p>
                                <p>密 碼:  <input type="password" name="pwd"  /></p>
                                <input type="Submit" value="登錄"  />

                        </form>
                </center>
        </body>
</html>
info.txt 這里是用文件存放的用戶名和密碼(英文逗號分隔),前面是用戶名,后面是密碼。這里的用戶名和密碼是用來登錄我們 智能家居控制平台的。admin,123456


0x05 程序下載測試

使用MicroPython File Uploader 工具,將源代碼下載到v202中。工具下載地址: http://tpyboard.com/download/tool/170.html
  • 1、使用usb數據線將v202接入到電腦,打開設備管理器,查看加載的端口。我的是COM44
※如果驅動安裝失敗,可以下載CH340的驅動,手動安裝。CH340驅動下載地址:http://tpyboard.com/download/drive/163.html
2、打開MicroPython File Uploader 選擇端口,點擊[Open]。

3、取消[Autorun]的打鈎,點擊紅框的文件夾圖標,選擇源碼,點擊[Send]等待發送成功。

4、將上面的源碼文件都下載到v202中,下載完畢后,點擊[Run/Reset]就會開始執行代碼。

5、開始運行后,紅色框內打印的是我們存放在info.txt里的用戶名和密碼,這個可以自定義。
6、下面桃紅色框內打印的是我們v202從路由器那里獲取到的IP地址,只要打印了IP地址,說明就成功接入網絡了。我的v202獲取的IP地址是192.168.1.192。
7、到此,我們的web服務器就搭建完成了。


0x06 智能家庭網絡平台的使用
1、在家庭局域網內,我們可以選用pc或者手機,通過瀏覽器,打開192.168.1.192 就可以看到登錄界面。


2、默認用戶名 admin 密碼123456 ,大家可以通過修改info.txt 文件來進行修改。
(1)輸入錯誤的用戶名和密碼會進入錯誤界面。(2) 輸入正確的,進入控制平台。

3、接下來,我們就可以通過網頁開控制燈光和小風扇了,看我的實驗效果圖。
 

這里,我只是做了一個實例,受時間限制,沒有再做更深入的開發。大家可以自己結合自己的創意再深入去做。如果能夠通過路由器給tpyboard v202設一個外網Ip,這樣就可以從外網進行訪問,從而完成外網對家內設備的控制。









免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM