AiBOM
首页 > 文章 > 微控制器 > 利用单片机快速实现家庭智能控制平台
为您找到相关搜索
STM32F401C-DISCO是一个STM32F401 Discovery套件which helps user to discover the entry level微控制器s of the STM32 F4 串行和to develop应用easily. It offers everything required 用于beginners和experienced users to get started quickly. 基于STM32F401VCT6, it包括an ST-LINK/V2内嵌型debug工具, a gyroscope, an ecompass和数字麦克风 MEMs, an 音频 DAC with an集成 class D speaker driver, an OTG micro AB 连接器, LEDs和pushbuttons. A large number of free ready to run application firmware examples are available to support quick 评估和开发.
意法半导体(ST)公司成立于1987年,是意大利SGS半导体公司和法国汤姆逊半导体合并后的新企业,1998年5月,SGS-THOMSON Microelectronics将公司名称改为意法半导体有限公司。从成立之初至今,ST的增长速度超过了半导体工业的整体增长速度。自1999年起,ST始终是世界十大半导体公司之一。整个集团共有员工近50,000名,拥有16个先进的研发机构、39个设计和应用中心、15主要制造厂,并在36个国家设有78个销售办事处。 ST公司位于瑞士日内瓦,同时也是欧洲区以及新兴市场的总部;公司的美国总部设在德克萨斯州达拉斯市的卡罗顿;亚太区总部设在新加坡;日本的业务则以东京为总部;大中国区总部设在上海,负责香港、大陆和台湾三个地区的业务。 意法半导体是业内半导体产品线最广的厂商之一,其主要产品有:分立二极管与晶体管,复杂的片上系统(SoC)器件,包括参考设计、应用软件、制造工具与规范的完整的平台解决方案等3000多种产品。意法半导体是各工业领域的主要供应商,拥有多种的先进技术、知识产权(IP)资源与世界级制造工艺。 半导体产品大体上可分为两类:专用产品和标准产品。专用产品从半导体制造商以及用户和第三方整合了数量众多的专有IP,这些使其区别于市场上的其他产品,例如: 片上系统(SoC)产品,定制与半定制电路,专用标准产品(ASSP),如:无线应用处理器、机顶盒芯片及汽车IC,微控制器,智能卡IC,专用存储器,专用分立器件等,一旦客户在应用中使用了专用产品,如果不修改硬件和软件设计,通常就不能进行产品替换。 相反,标准产品是实现某种特定的常用功能的器件,这些器件一般由几个供应商提供。通常,制造商推出的标准产品可以被其他制造商的同类产品所取代,供应商间的差别主要在于成本与客户服务上。然而,一旦应用设计被冻结,标准器件在性能优化方面也将变成唯一的器件。标准产品包括:分立器件,如晶体管、二极管与晶闸管,功率晶体管,如MOSFET、Bipolar与IGBT,模拟电路构建模块,如运算放大器、比较器、稳压器与电压参考电路,标准逻辑功能与接口,众多存储器产品,如标准或串行NOR闪存、NAND闪存、EPROM/EEPROM及非易失性RAM,射频分立器件及IC。
查看详情
开发板(Demoboard)是用来进行嵌入式系统开发的电路板,包括中央处理器、存储器、输入设备、输出设备、数据通路/总线和外部资源接口等一系列硬件组件。开发板一般由嵌入式系统开发者根据开发需求自己订制,也可由用户自行研究设计。开发板是为初学者了解和学习系统的硬件和软件,同时部分开发板也提供的基础集成开发环境和软件源代码和硬件原理图等。常见的开发板有51、ARM、FPGA、DSP开发板。
查看详情
热门推荐
STM32F401的RCC时钟配置
STM32F401的RCC时钟配置
元器件的Datasheet PDF数据手册如何阅读?如何快速掌握产品引脚图及功能等关键信息?
元器件的Datasheet PDF数据手册如何阅读?如何快速掌握产品引脚图及功能等关键信息?
TL494是什么芯片?TL494 工作原理及典型电路,十分钟带你快速搞懂TL494
TL494是什么芯片?TL494 工作原理及典型电路,十分钟带你快速搞懂TL494

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

网络整理 2020-05-18 10:59 416次阅读 微控制器 开发板

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

    本次我们使用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,这样就可以从外网进行访问,从而完成外网对家内设备的控制。


温馨提示:本文由网友投稿,经网站编辑整理发布,转载请注明出处和本文链接,如有侵犯您的权益,请及时与我们联系,我们将核实情况后进行相关处理!
相关推荐
STM32f103ZET6 学习资料 (连载3 存储器和总线构架 )
STM32f103ZET6 学习资料 (连载3 存储器和总线构架 )
STM32f103ZET6 存储器和总线构架,在互联型产品中的构成,及寄存器和启动配置浅析
STM32F103ZET6 / STM32 / 微控制器 8345
基于STC15w408AS的电子时钟的设计
基于STC15w408AS的电子时钟的设计
DIY电子时钟的详细制作:显示时间+日期+温度;能自动调节亮度;能调节时间+闹铃。
STC15W408AS / 微控制器 1453
单片机控制大功率LED灯(解读)
单片机控制大功率LED灯(解读)
N沟道增强型MOSFET,在电路中像NPN三极管工作在饱和状态一样充当开关,单片机端口输出高电平时,G S间加正向电压大于开启电压,沟道导通,D S 间电压很小(0.45v),3个串联LED上的压降不足,灯灭。反之,端口为低电平时,LED灯亮。
微控制器 / 2N7000 / LM117 883
DSP 基础学习 2:GPIO与第一个实验:流水LED灯
DSP 基础学习 2:GPIO与第一个实验:流水LED灯
GPIO全称是:General Purpose Input Output (通用输入/输出)。它是DSP芯片用来与外界电路进行信息互换的端口。只要让GPIO输出低电压,那么对应的LED灯支路就会有电流通过,该LED灯被点亮,反之不亮。所以关键在于GPIO的使用。
TMS320F28335PGFA / 微控制器 1618
关注

关注采芯网

回复型号,查元件信息

采芯网 FindIC 用户意见反馈
问题类型
网站页面问题或建议
数据问题或错误
元器件采购询价
其他
意见建议
联系方式
反馈和联系