智能家庭系统micropython实现2

本文详细介绍了HomeCenter的设计,特别是其主控部分如何接收语音和蓝牙输入,通过红外接口发送命令,并通过WiFi控制智能设备。涉及配置ESP32 AP模式、WiFi设置、智能设备查找与控制,以及红外控制技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天介绍homecenter的设计,就是主控部分。主控部分实现接收语音模块输入,蓝牙模块输入,红外接口发射,WiFi访问智能设备访问。接口输入容易,都采用串口输入,然后查配置文件,向对应的智能设备ip地址发送控制命令。

1、配置部分

 wifi路由器配置,通过设置esp32模块为AP模式,通过网页浏览器,就可以访问到esp32模块,通过网页设置WiFi的名称和密码。最后记录下,WiFi的信息,以后esp32就可以连接上WiFi。
def connectAp():
            # 响应头网页正文内容
    content = b'''
                <!DOCTYPE html>
                <html lang="zh-CN">
                <head>
                    <meta charset="utf-8">
                    <title>用户登录.html</title>
                </head>
                <body>
                <p>输入wifi路由信息</p>
                <form name="wifimsg"action="#" method="get">
                路由器名称:
                <input type="text" name="wifi" value=""/>
                路由器密码:
                <input type="text" name="password" value=""/>   
                <input type="submit" name="tijiao" value="ok"/>
                </form>
                </body>
                </html>
    '''
    ap = network.WLAN(network.AP_IF)
    ap.config(essid='HUAWEI1', authmode=4, password='12345678')
    ap.active(True)  # 开启无线热点
    if not ap.isconnected():
        print('connecting to network...')
    start = time.time()
    while not ap.isconnected():
        time.sleep(1)
        if time.time()-start > 30:
            print("connect STA timeout!")
            break
                
    if ap.isconnected():
        print('network config:', ap.ifconfig())
        s = socket.socket()
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # (重要)设置端口释放后立即就可以被再次使用
        s.bind(socket.getaddrinfo("0.0.0.0", 80)[0][-1])  # 绑定地址
        s.listen(5)  # 开启监听(最大连接数5)

        print('接入热点后可从浏览器访问下面地址:')
        print(ap.ifconfig()[0])
        print('')
        fl=open("Ap.txt","w")
        while True:  # mian()函数中进行死循环,在这里保持监听浏览器请求与对应处理
            client_sock, client_addr = s.accept()  # 接收来自客户端的请求与客户端地址
            print('Client address:', client_addr)
            
            while True:
                h = client_sock.readline() # 按行读取来自客户端的请求内容
                getline=h.decode('utf8')
                
                x=getline.find('wifi=')
                y=getline.find("password")
                z=getline.find("tijiao")
                if((x>0) and (y>0) and (z>0)):
                    wifiname=getline[x:y-1]
                    password=getline[y:z-1]
     
                    print(wifiname)
                    print(password)
                    fl.write(wifiname+"|"+password)
                     
                    fl.close()
                    print("file write\r\n")
                    
                    fl=open("Ap.txt","r")
                    print(fl.read())
                    fl.close;
                    print(getline, end='')
                    return
                if h == b'' or h == b'\r\n':  # 当读取到空行的时候表示接收到一个完整的请求头
                    break

            client_sock.write(responseHeaders) # 向客户端发送响应头
            client_sock.write(content) # 向客户端发送网页内容
            client_sock.close()
  读取WiFi路由器可以通过以下程序。
def getwifiAp():
    fl=open("Ap.txt",'r')
    tempstr=fl.read()
    fl.close()
    x=tempstr.find('wifi=')
    y=tempstr.find('password=')
    essid=tempstr[5:y-1]
    password=tempstr[y+9:]
    return essid,password

2、关于查找可用智能控制器

由于智能控制器是否在线,需要通过测试,当然有更好更完善的办法,如Upnp的方法,本项目采用比较简单的办法,直接枚举出内部网络的ip地址。访问特定范围ip地址,只要响应正确,就是存在自己的控制器。里面要用到poll,把超时设置成为2秒钟时间,当访问的ip没有超时,且存在反馈,就可以记录该智能控制器存在,最后以json记录在下面文件。

print(Online_web)  #保存所有可以接受的server
with open("Online_web.json", "w", encoding='utf-8') as f:
    f.write(json.dumps(Online_web))
    f.close()

poll机制设置部分。

  print("connecting")
    poller.register(s, select.POLLIN|select.POLLOUT)
    res = poller.poll(2000)  # time in milliseconds
    poller.unregister(s)
    print("connect server at",addr)

3、向智能设备发出控制命令
这部分是整个系统的核心,前面工作都是准备,为了方便配置,为了控制工程中不出现问题。控制阶段也可能出现问题,因此我们也需要做好相应的错误控制,确保系统在任何故障情况不引起系统崩溃,也就是系统的故障处理或者叫健康管理。看下面程序,通过try和except防止系统出错,还要把连接命令加上超时2秒的设置,里面很多打印命令只是供系统调试使用。最后记得关闭一些资源,释放多余的空间等,才能确保系统稳定运行。

 try:
                    s = socket.socket() #生成socket
                    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
                    
                    print(addr[i])
                    if not connect_on2s(s,addr[i]):
                        time.sleep_ms(100);
                        continue 
                    #s.connect(socket.getaddrinfo(addr[i], 8888)[0][-1])  # 绑定地址
                    s.settimeout(4)         
                except OSError as msg:
                    print('timeout2')
                    s.close()
                    s = None
                    continue
                delta = time.ticks_diff(time.ticks_ms(), start) # compute time difference
                print("time :{:d}".format(delta))
                if s is None:
                    print('could not open socket')
                    s.close
                    time.sleep(1)

4、红外控制功能
红外控制采用现成的网上程序,该程序可以采用内部计数器生产38khz载波信号,只要把对应的红外控制码发送到程序就可以,简单好用。我目前只能通过采用示波器读出,红外接收的码,然后写入到程序里面,实现简单控制。采用esp32接收红外码,经过学习,然后放出去,还没有调试好。下载地址忘记了,你们自己网上找吧,这是他的介绍,是个开源的程序。

__init__.py Nonblocking IR blaster # Runs on Pyboard D or Pyboard 1.x (not Pyboard Lite), ESP32 and RP2 # Released under the MIT License (MIT). See LICENSE. # Copyright (c) 2020-2021 Peter Hinch

事实证明,micropython确实很稳定了,而且插入c语音的函数也非常方便,估计大有前途。
我的homecenter玩具,还欠缺的功能是语音提示和显示。
下期介绍智能控制器设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值