一提到智能家庭,大家可能首先想到的是各种大佬级公司搞的牛逼产品,或者说是创新产品。想想就觉得很复杂,有的用工控机,有的用树莓派,还有的用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,这样就可以从外网进行访问,从而完成外网对家内设备的控制。

[Micropython]TPYBoard v202 利用单片机快速实现家庭智能控制平台的更多相关文章

  1. [Micropython]TPYBoard v202 v102+v202 家庭无线温湿度检测

     一.实验器件 1.TPYBoard v102 1块 2.TPYBoard v202 1块 3.Nokia 5110LCD显示屏 1块 4.DHT11温湿度传感器 1个 5.micro USB 数据线 ...

  2. [Micropython]TPYBoard v202 智能WIFI远控小车

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言---------------------- 之 ...

  3. micropython TPYBoard v202 超声波测距

    实验目的 了解超声波模块的工作原理 学习使用超声波模块测量距离 实验器材 TPYBoard v202 1块 超声波模块(HC-SR04)1个 micro USB数据线 1条 杜邦线 若干 超声波模块的 ...

  4. [Micropython][ESP8266] TPYBoard V202 之MQTT协议接入OneNET云平台

    随着移动互联网的发展,MQTT由于开放源代码,耗电量小等特点,将会在移动消息推送领域会有更多的贡献,在物联网领域,传感器与服务器的通信,信息的收集,MQTT都可以作为考虑的方案之一.在未来MQTT会进 ...

  5. MicroPython TPYBoard v702实现HTTP应用功能

    [Micropython]TPYBoard v702 HTTP应用功能 转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:Micro ...

  6. 利用Nodejs快速构建应用原型

    利用Nodejs快速构建应用原型 开发一个应用往往需要快速的构建原型,然后在此基础上设计和改进,前端可能立马能看到效果,但是后端业务逻辑不会那么快,这个时候其实我们需要额只是一些模拟数据,所以不需要真 ...

  7. 利用 TFLearn 快速搭建经典深度学习模型

      利用 TFLearn 快速搭建经典深度学习模型 使用 TensorFlow 一个最大的好处是可以用各种运算符(Ops)灵活构建计算图,同时可以支持自定义运算符(见本公众号早期文章<Tenso ...

  8. 利用flask-sqlacodegen快速导入ORM表结构

    利用flask-sqlacodegen快速导入ORM表结构 友情提示:如果是使用pymysql请预先pip install 哦~ 这是window下使用virtualenv环境下执行的 Linux用户 ...

  9. 四、利用EnterpriseFrameWork快速开发基于WCF为中间件的三层结构系统

    回<[开源]EnterpriseFrameWork框架系列文章索引> EnterpriseFrameWork框架实例源代码下载: 实例下载 本章内容与上一张<利用Enterprise ...

随机推荐

  1. P1993 小 K 的农场

    题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...

  2. java笔记----线程状态转换函数

    注意:stop().suspend()和 resume()方法现在已经不提倡使用,这些方法在虚拟机中可能引起“死锁”现象.suspend()和 resume()方法的替代方法是 wait()和 sle ...

  3. [20180918]文件格式与sql_id.txt

    [20180918]文件格式与sql_id.txt --//记录测试中遇到的一个问题.这是我在探究SQL*Net more data from client遇到的问题.--//就是实际oracle会把 ...

  4. .net core系列之《.net core内置IOC容器ServiceCollection》

    一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...

  5. adb错误处理

    C:\Users\****\source\****>adb connect 192.168.10.* adb server version () doesn't match this clien ...

  6. Java线程相关的热门面试题

    ---恢复内容开始--- 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...

  7. Linux进程优先级的处理--Linux进程的管理与调度(二十二)

    1. linux优先级的表示 1.1 优先级的内核表示 linux优先级概述 在用户空间通过nice命令设置进程的静态优先级, 这在内部会调用nice系统调用, 进程的nice值在-20~+19之间. ...

  8. C++多线程同步技巧(三)--- 互斥体

    简介 Windows互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处. 代码 ...

  9. Session变量在PHP中的使用

    PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. PHP Session 变量 当您运行一个 ...

  10. layui中,同一个页面动态加载table数据表格

    效果图: 前端代码: <div class="layui-fluid" id="record-user" hidden="hidden" ...