久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5279|回復: 0
打印 上一主題 下一主題
收起左側

利用單片機快速實現家庭智能控制平臺

[復制鏈接]
跳轉到指定樓層
樓主
  0x00前言

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

  0x01單片機實現web服務器

  探討用單片機來實現web服務器的文章通過baidu也能找到幾篇,但比較詳實的實現方法并沒有找到,這里考慮有兩種思路可以完成,一種是有線的lan模塊,如w5500,這種模塊本身就帶有web服務的部分功能,使用起來比較簡單,但是只能基于lan進行訪問。另一種是通過stm32等單片機,配合網絡模塊來完成。當前我能想到的最簡單的方法就是用stm32+esp8266來實現。

  基于第一種方法,我覺得受模塊性能影響比較大,受限于模塊,沒有開發感。于是考慮用第二種方法。這個方法里,有人用arduino來完成,這要基于c進行編程。另外,就是考慮用micropython,這樣直接可以用python來實現。這里依然使用tpyboardV202。

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

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

  0x03硬件的搭建與連接

  1、發光二極管的使用

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



  2、直流小電機的使用方法



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

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

          

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

  下面來介紹一下接線方法

  
三極管(S9014)
  
TPYBoard  v202
直流小電機
集電極
3.3V
--
基極
G5
--
發射極
--
B
--
GND
A
  
TPYBoard  v202
  
發光二極管
G4
正極
GND
負極
  我的實物連接圖



  0x04利用micropython實現web服務器

  首先,編輯一個main.py文件。v202開機自啟動main.py文件

  1. try:
  2.     import usocket as socket
  3. except:
  4.     import socket
  5. import network
  6. from machine import UART
  7. from machine import Pin

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

  26.     s = socket.socket()
  27.     ai = socket.getaddrinfo(ip_, 80)
  28.     addr = ai[0][-1]
  29.     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  30.     s.bind(addr)
  31.     s.listen(5)
  32.     led_flag.low()
  33.     #s_data=login_data
  34.     while True:
  35.         res = s.accept()
  36.         client_s = res[0]
  37.         client_addr = res[1]
  38.         led_flag.high()
  39.         req =client_s.readline()
  40.         while True:
  41.             h = client_s.readline()
  42.             if h == b"" or h == b"\r\n":
  43.                 break
  44.             #print(h)
  45.             req+=(h.decode('utf-8').lower())
  46.         print("Request:")
  47.         req=req.decode('utf-8').lower().split('\r\n')
  48.         #http header 解析
  49.         req_data=req[0].lstrip().rstrip().replace(' ','')
  50.         print(req_data)
  51.         if req_data.find('favicon.ico')>-1:
  52.             client_s.close()
  53.             continue
  54.         else:
  55.             if len(req_data)<=12:
  56.                 #說明是第一次訪問,輸入login.html
  57.                 s_data=login_data
  58.             else:
  59.                 req_data=req_data.replace('get/?','').replace('http/1.1','')
  60.                 _name=req_data.find('name')
  61.                 _pwd=req_data.find('pwd')
  62.                 if _name>-1 and _pwd>-1:
  63.                     #判斷是否是用戶登錄
  64.                     if req_data.find(name)>-1 and req_data.find(pwd)>-1:
  65.                         s_data=dev_data
  66.                         print('Login Success!')
  67.                     else:
  68.                         f=open('fail.html','r')
  69.                         s_data=f.read()
  70.                         f.close()
  71.                         print('Login Fail!')
  72.                 else:
  73.                     #判斷是否是控制LED
  74.                     _index=req_data.find('led=')
  75.                     if _index>-1:
  76.                         s_data=dev_data
  77.                         led_val=req_data[_index+4:_index+6].lstrip().rstrip()
  78.                         print('led:',led_val)
  79.                         if led_val=='on':
  80.                             led.value(1)
  81.                         else:
  82.                             led.value(0)
  83.                     #判斷是否是控制電機
  84.                     _index=req_data.find('motor=')
  85.                     if _index>-1:
  86.                         s_data=dev_data
  87.                         motor_val=req_data[_index+6:_index+8].lstrip().rstrip()
  88.                         print('motor_val:',motor_val)
  89.                         if motor_val=='on':
  90.                             motor.value(1)
  91.                         else:
  92.                             motor.value(0)
  93.             print('-----------')
  94.             client_s.send(s_data)
  95.             client_s.close()
  96.         led_flag.low()
  97.         
  98. f=open('device.html','r')
  99. dev_html=f.read()
  100. f.close()
  101. f=open('login.html','r')
  102. login_html=f.read()
  103. f.close()
  104. f=open('info.txt','r')
  105. info=f.read()
  106. f.close()
  107. name=info.split(',')[0].lstrip().rstrip()
  108. pwd=info.split(',')[1].lstrip().rstrip()
  109. print('name:',name)
  110. print('pwd:',pwd)
  111. myip_=do_connect('essid','pwd')#家中網絡的WIFI名稱和密碼
  112. print(myip_)
  113. main(myip_,dev_html,login_html,name,pwd)
復制代碼


  login.html登錄頁面

  1. <html>
  2.     <head>
  3.         <title>智能家庭網絡</title>
  4.         <meta name="viewport" content="width=device-width, initial-scale=1" />
  5.         <style type="text/css">
  6.             h2
  7.             {
  8.                 margin-top:4%;
  9.                 margin-bottom:40px;
  10.             }
  11.         </style>
  12.     </head>
  13.     <body>
  14.         <center>
  15.         <h2>歡迎登錄智能家庭網絡平臺</h2>
  16.             <form action="/" method="get" accept-charset="utf-8">
  17.                 <p>用戶名: <input type="text" name="name"  /></p>  
  18.                 <p>密 碼:  <input type="password" name="pwd"  /></p>
  19.                 <input type="Submit" value="登錄"  />         
  20.                
  21.             </form>
  22.         </center>
  23.     </body>
  24. </html>
復制代碼


  device.html控制頁面

  1. <html>
  2.     <head>
  3.         <title>智能家庭網絡平臺</title>
  4.         <meta name="viewport" content="width=device-width, initial-scale=1" />
  5.         <style type="text/css">
  6.             h2
  7.             {
  8.                 margin-top:4%;
  9.                 margin-bottom:40px;
  10.             }
  11.         </style>
  12.     </head>
  13.     <body>
  14.         <center>
  15.         <h2>歡迎使用智能家庭網絡-控制平臺</h2>
  16.             <form action="/" method="get" accept-charset="utf-8">
  17.                 <p>燈光: <input type="Submit" value="ON" name="led" /> <input type="Submit" value="OFF" name="led" /></p>  
  18.                 <p>風扇: <input type="Submit" value="ON" name="motor" /> <input type="Submit" value="OFF" name="motor" /></p>         
  19.                
  20.             </form>
  21.         </center>
  22.     </body>
  23. </html>
復制代碼


  fail.html登錄錯誤頁面(就是把login.html稍做了一下改動)

  1. <html>
  2.     <head>
  3.         <title>智能家庭網絡</title>
  4.         <meta name="viewport" content="width=device-width, initial-scale=1" />
  5.         <style type="text/css">
  6.             h2
  7.             {
  8.                 margin-top:4%;
  9.                 margin-bottom:40px;
  10.             }
  11.         </style>
  12.     </head>
  13.     <body>
  14.         <center>
  15.         <h2>歡迎登錄智能家庭網絡平臺</h2>
  16.             <form action="/" method="get" accept-charset="utf-8">
  17.                 <p style="color:red">用戶名或密碼錯誤!</p>
  18.                 <p>用戶名: <input type="text" name="name"  /></p>  
  19.                 <p>密 碼:  <input type="password" name="pwd"  /></p>
  20.                 <input type="Submit" value="登錄"  />         
  21.                
  22.             </form>
  23.         </center>
  24.     </body>
  25. </html>
復制代碼


  info.txt這里是用文件存放的用戶名和密碼(英文逗號分隔),前面是用戶名,后面是密碼。這里的用戶名和密碼是用來登錄我們智能家居控制平臺的。

  1. admin,123456
復制代碼


  0x05程序下載測試

  使用MicroPythonFileUploader工具,將源代碼下載到v202中。

  工具下載地址:tpyboard點com/download/tool/170.html

  1、        使用usb數據線將v202接入到電腦,打開設備管理器,查看加載的端口。我的是COM44

  ※如果驅動安裝失敗,可以下載CH340的驅動,手動安裝。




  2、        打開MicroPythonFileUploader選擇端口,點擊[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、接下來,我們就可以通過網頁開控制燈光和小風扇了,看我的實驗效果圖。





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



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人网在线 | 国产亚洲第一页 | 在线观看av不卡 | 99久久精品国产一区二区三区 | 色视频网站在线观看 | 91一区二区三区 | 中文成人无字幕乱码精品 | 日韩一二区| 成年人网站在线观看视频 | 男女羞羞视频在线观看 | 久久九| 成人性生交大片免费看中文带字幕 | 涩涩视频网站在线观看 | 日韩av在线不卡 | 一级黄色短片 | 免费观看黄色片视频 | 极品久久 | 美女福利视频 | 在线一区观看 | 欧美13videosex性极品 | 欧美日韩一二三区 | 亚洲精品国产成人 | 亚洲精品在线91 | 免费v片在线观看 | 午夜99| 免费黄色的视频 | 精品一级毛片 | 99re视频这里只有精品 | 中国av在线免费观看 | 久久精品日 | 国产精品成人品 | 久久久久国产一区二区三区 | 欧美一区二区三区的 | 在线视频中文字幕 | 日韩在线小视频 | 91在线一区| www.久久精品视频 | 狠狠干美女 | 婷婷色国产偷v国产偷v小说 | 久久久国产一区二区 | 亚洲午夜在线 |