文档章节

利用单片机快速实现家庭智能控制平台

bodasisiter
 bodasisiter
发布于 2017/06/28 10:36
字数 2122
阅读 41
收藏 0
点赞 0
评论 0

0x00 前言

    一提到智能家庭,大家可能首先想到的是各种大佬级公司搞的牛逼产品,或者说是创新产品。想想就觉得很复杂,有的用工控机,有的用树莓派,还有的用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 硬件的搭建与连接

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 文件

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>用户名:&nbsp;<input type="text" name="name"  /></p>  
                <p>密&nbsp;码:&nbsp;&nbsp;<input type="password" name="pwd"  /></p>
                <input type="Submit" value="登录"  />         
                
            </form>
        </center>
    </body>
</html>

device.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>灯光:&nbsp;<input type="Submit" value="ON" name="led" />&nbsp;<input type="Submit" value="OFF" name="led" /></p>  
                <p>风扇:&nbsp;<input type="Submit" value="ON" name="motor" />&nbsp;<input type="Submit" value="OFF" name="motor" /></p>         
                
            </form>
        </center>
    </body>
</html>

fail.html 登录错误页面(就是把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>用户名:&nbsp;<input type="text" name="name"  /></p>  
                <p>密&nbsp;码:&nbsp;&nbsp;<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,这样就可以从外网进行访问,从而完成外网对家内设备的控制。

© 著作权归作者所有

共有 人打赏支持
bodasisiter
粉丝 14
博文 140
码字总数 127462
作品 0
潍坊
[Micropython]TPYBoard v202 利用单片机快速实现家庭智能控制平台

一提到智能家庭,大家可能首先想到的是各种大佬级公司搞的牛逼产品,或者说是创新产品。想想就觉得很复杂,有的用工控机,有的用树莓派,还有的用arduino,不管用什么,都绕不过服务器进行控...

bodasisiter
05/30
0
0
设计师需要知道的智能照明控制器和开发平台

  随着节能成为越来越大的设计挑战,微处理器(MPU)制造商正在帮助照明设计师通过独特的产品或评估平台加速智能照明系统的发展。智能照明与无线网络结合被认为是物联网(IOT)应用的最大机会之...

kailixun
04/20
0
0
FPGA在物联网智能家居中的应用

摘要:随着物联网技术的不断发展,人们对家的期望以及对家所赋予的定义不再拘泥于传统的生活方式,智能家居也成为近些年来信息技术领域研究的热点方向。本文所体现的物联网智能家居设计是基于...

owen_plus
2017/12/13
0
0
新零售撬动智能家居 京东百企推大屏产业链

  【IT168 评论】新零售重构了商业的基本逻辑,也让更多传统企业顺势而为,进行前瞻性探索。   随着物联网、云计算、大数据、人工智能的发展,变革和创新时刻都在发生,伴随着互联网和无...

it168网站
2017/11/23
0
0
智能家居架构--My smart home

智能家居的概念(smart home , home auto)很早以前就有了,现在随着硬件成本的下降,及google收购nest等,智能家居热度升高。 My smart home 智能家居的架构,包括服务器端,web网页,android...

李永明
2014/05/03
16.5K
4
AbleCloud与鸿雁电器携手,领跑智能家居,打造智慧城市

近 日,建筑电气领域领跑者鸿雁电器正式发布智能家居思远2.0系统(以下简称“思远2.0”),标志着智能家居行业的发展跨入了新的时代。 “思远2.0”由物联网PaaS平台AbleCloud为其提供物联网云...

玄学酱
05/21
0
0
能跑 micropython 的 TPYBoard 能做什么?

MicroPython基于ANSI C,语法跟Pyton 3基本一致,拥有自家的解析器、编译器、虚拟机和类库等。目前他支持基于32-bit的ARM处理器,比如说STM32F405。也就是说ARM处理器STM32F405上直接可运行P...

bodasisiter
2016/08/01
2.6K
1
听说单片机的应用领域都到这里了!

单片机就是一种集成电路芯片,他会把一个计算机系统集成到一个芯片上,简单的说就是一块芯片就成了一台计算机,而且他还体积小,质量轻,价格便宜,所以他是学习了解计算机原理和结构的最佳选...

xueheih
05/15
0
0
阿里云IoT最佳实践,不想了解一下?

摘要:在物联网迅猛发展的今天,阿里云IoT致力于打造全行业云、管、端一体化智能平台,为物联网生态合作伙伴提供基于云计算、大数据、人工智能与完全的物联网基础服务于内容。本文主要介绍了...

李杉杉
05/21
0
0
一枚灯泡将如何释放万物互联的交互感知?

  【IT168 云计算】当下,人工智能的技术历程和价值在云计算、大数据的驱动下正爆发着它的无穷能力。2017年,全球范围内围绕着人工智能的创新技术产业制高点的竞争已经展开。   不可否认...

it168网站
2017/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、登录流程图 二、小程序客户端 doLogin:function(callback = () =>{}){let ...

公众号_好好学java
39分钟前
0
1
流利阅读笔记28-20180717待学习

“我不干了!” 英国脱欧大臣递交辞呈 雪梨 2018-07-17 1.今日导读 7 月 6 日,英国政府高官齐聚英国首相的官方乡间别墅——契克斯庄园,讨论起草了一份关于英国政府脱欧立场的白皮书。可是没...

aibinxiao
今天
7
0
OSChina 周二乱弹 —— 理解超算排名这个事,竟然超出了很多人的智商

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @-冰冰棒- :分享Ed Sheeran/Beyoncé的单曲《Perfect Duet (with Beyoncé)》 《Perfect Duet (with Beyoncé)》- Ed Sheeran/Beyoncé 手机...

小小编辑
今天
180
7
Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
今天
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
1
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部