查看: 2680|回复: 0

[Micropython]TPYBoard v202 利用单片机快速实现家庭智能控制平台

[复制链接]
  • TA的每日心情
    慵懒
    2018-1-6 09:01
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2018-5-30 09:34:21 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 酥小小酥 于 2018-5-30 09:37 编辑

    一提到智能家庭,大家可能首先想到的是各种大佬级公司搞的牛逼产品,或者说是创新产品。想想就觉得很复杂,有的用工控机,有的用树莓派,还有的用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:   
    1.        import usocket as socket
    2. except:
    3.         import socket
    4. import network
    5. from machine import UART
    6. from machine import Pin

    7. led_flag=Pin(2, Pin.OUT)#esp8266模块上的小灯 高电平:灭 低电平:亮
    8. led = Pin(4, Pin.OUT)#发光二极管的控制引脚
    9. motor = Pin(5, Pin.OUT)#直流电机的控制引脚
    10. #初始化
    11. led.low()
    12. motor.low()
    13. led_flag.high()
    14. def do_connect(ssid,pwd):
    15.         sta_if = network.WLAN(network.STA_IF)#STA 模式
    16.         sta_if.active(False)
    17.         if not sta_if.isconnected():#判断是否连接
    18.                 sta_if.active(True)
    19.                 sta_if.connect(ssid,pwd)#ssid:WIFI名称 pwd:WIFI 密码
    20.                 while not sta_if.isconnected():
    21.                         pass
    22.         if sta_if.isconnected():
    23.                 return sta_if.ifconfig()[0]
    24. def main(ip_,dev_data,login_data,name,pwd):

    25.         s = socket.socket()
    26.         ai = socket.getaddrinfo(ip_, 80)
    27.         addr = ai[0][-1]
    28.         s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    29.         s.bind(addr)
    30.         s.listen(5)
    31.         led_flag.low()
    32.         #s_data=login_data
    33.         while True:
    34.                 res = s.accept()
    35.                 client_s = res[0]
    36.                 client_addr = res[1]
    37.                 led_flag.high()
    38.                 req =client_s.readline()
    39.                 while True:
    40.                         h = client_s.readline()
    41.                         if h == b"" or h == b"\r\n":
    42.                                 break
    43.                         #print(h)
    44.                         req+=(h.decode('utf-8').lower())
    45.                 print("Request:")
    46.                 req=req.decode('utf-8').lower().split('\r\n')
    47.                 #http header 解析
    48.                 req_data=req[0].lstrip().rstrip().replace(' ','')
    49.                 print(req_data)
    50.                 if req_data.find('favicon.ico')>-1:
    51.                         client_s.close()
    52.                         continue
    53.                 else:
    54.                         if len(req_data)<=12:
    55.                                 #说明是第一次访问,输入login.html
    56.                                 s_data=login_data
    57.                         else:
    58.                                 req_data=req_data.replace('get/?','').replace('http/1.1','')
    59.                                 _name=req_data.find('name')
    60.                                 _pwd=req_data.find('pwd')
    61.                                 if _name>-1 and _pwd>-1:
    62.                                         #判断是否是用户登录
    63.                                         if req_data.find(name)>-1 and req_data.find(pwd)>-1:
    64.                                                 s_data=dev_data
    65.                                                 print('Login Success!')
    66.                                         else:
    67.                                                 f=open('fail.html','r')
    68.                                                 s_data=f.read()
    69.                                                 f.close()
    70.                                                 print('Login Fail!')
    71.                                 else:
    72.                                         #判断是否是控制LED
    73.                                         _index=req_data.find('led=')
    74.                                         if _index>-1:
    75.                                                 s_data=dev_data
    76.                                                 led_val=req_data[_index+4:_index+6].lstrip().rstrip()
    77.                                                 print('led:',led_val)
    78.                                                 if led_val=='on':
    79.                                                         led.value(1)
    80.                                                 else:
    81.                                                         led.value(0)
    82.                                         #判断是否是控制电机
    83.                                         _index=req_data.find('motor=')
    84.                                         if _index>-1:
    85.                                                 s_data=dev_data
    86.                                                 motor_val=req_data[_index+6:_index+8].lstrip().rstrip()
    87.                                                 print('motor_val:',motor_val)
    88.                                                 if motor_val=='on':
    89.                                                         motor.value(1)
    90.                                                 else:
    91.                                                         motor.value(0)
    92.                         print('-----------')
    93.                         client_s.send(s_data)
    94.                         client_s.close()
    95.                 led_flag.low()

    96. f=open('device.html','r')
    97. dev_html=f.read()
    98. f.close()
    99. f=open('login.html','r')
    100. login_html=f.read()
    101. f.close()
    102. f=open('info.txt','r')
    103. info=f.read()
    104. f.close()
    105. name=info.split(',')[0].lstrip().rstrip()
    106. pwd=info.split(',')[1].lstrip().rstrip()
    107. print('name:',name)
    108. print('pwd:',pwd)
    109. myip_=do_connect('essid','pwd')#家中网络的WIFI名称和密码
    110. print(myip_)
    111. 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 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.                         </form>
    22.                 </center>
    23.         </body>
    24. </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,这样就可以从外网进行访问,从而完成外网对家内设备的控制。


    转载于:http://docs.tpyboard.com/zh/latest/tpyboard/tutorial/v202/V2023/







    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 21:32 , Processed in 0.111028 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.