远程控制空调物联网项目

远程控制空调物联网项目

其实这个项目起源于同学不经意间的一句话:“要是能远程开空调就好了,这样回宿舍的时候总是凉快的!”

我回——“预算多少”(不是

因为手上的芯片不多了,STM丢光了,MSP430又不大会用,正好手上一块电赛剩来的K210,而且库封装也很友善,就打算用这个做主芯片来着手写一下这个项目。

红外发射模块

既然要实现空调的开关、定时等相关功能,红外发射模块是必不可少的,网上也有很多这样的模块,包括上位机店家也写好了,真是好不方便。我用的就是上图这一种,非常简洁、四针串口,也会给相关使用说明、硬件的规格手册等:

使用手册中会有这种协议介绍,我们只需要按照固定的协议以及使用手册中特定的功能码串口传输数据即可。

语音识别模块

语音识别模块我选择的是智家物联的SU-03T核心板,SU-03T 是一款低成本、低功耗、小体积的离线语音识别模组,能快速应用于智能家 居,各类智能小家电,86 盒,玩具,灯具等需要语音操控的产品。店家已经焊好PCB封装,接线方便

  • 32bit RISC 内核,运行频率 240M
  • 支持 DSP 指令集以及 FPU 浮点运算单元
  • FFT 加速器:最大支持 1024 点复数 FFT/IFFT 运算,或者是 2048 点的实数 FFT/IFFT 运算
  • 内置高速 SRAM,内置 2MB FLASH
  • 内置 3W、单声道 AB 类功放
  • 支持 1 路驻极体麦
  • 支 持 I2S input/output
  • 支持 5V 电源输入
  • 内置 5V 转 3.3V,3.3V 外部负载不超过 150mA
  • RC 12MHz 时钟源和 PLL 锁相环时钟源
  • 内 置 POR(Power on Reset),低电压检测和看门狗
  • 所 有 GPIO 均可配置为外部中断输入和唤醒源
  • 1 个标准 SPI Master 接口,最高速率 30MHz
  • 1 个 SPI Slave 接口最高速率 30MHz
  • 1 个全双工 UART 最高速率 3Mbps。
  • 1 个 I2C 主/从控制器最高速率 400kHz
  • 2 个 PWM 输出
  • 1 个 12-bit SAR-ADC 最大 450Khz 采样率

最最最最最重要的是!这个支持UI编程:

智能公元/AIOT快速产品化平台

本来想只用这个实现远程控制+语音控制,但可惜只有一个UART,只好采用其他芯片。

主芯片

其实打算用K210的时候很纠结的,因为这个板子功耗还是不低的,但我看中了他的库开发以及简介性,毕竟与其调硬件底层、我更喜欢写业务逻辑。(报错也是真的不好改😢

语音识别

语音识别其实就是三个脉冲,UI编程的话很好设置,K210接受到后向红外串口发送信号,即可实现语音控制空调。

MQTT通讯

为了让K210与路由器进行连接,还需串口连接ESP8826,通讯方式选择MQTT。

当服务器和客户端建立起连接时,就可以相互通信了。在互联网应用大多使用 WebSocket 接口来传输数据。而在物联网应用中,常常出现这样的情况:海量的传感器,需要时刻保持在线,传输数据量非常低,有着大量用户使用。如果仍然使用 socket 作为通信,那么服务器的压力和通讯框架的设计随着数量的上升将变得异常复杂! 那么有无一个框架协议来解决这个问题呢,答案是有的。那就是 MQTT(消息队列遥测传输)。

MQTT 是 IBM 于 1999 年提出的,和 HTTP 一样属于应用层,它工作在 TCP/IP 239 协议族上,通常还会调用 socket 接口。是一个基于客户端-服务器的消息发布/订 阅传输协议。其特点是协议是轻量、简单、开放和易于实现的,这些特点使它适 用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M) 通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、 智能家居、及一些小型化设备中已广泛使用。 总结下来 MQTT 有如下特性/优势: ➢ 异步消息协议 ➢ 面向长连接 ➢ 双向数据传输 ➢ 协议轻量级 ➢ 被动数据获取

MQTT流程图

源代码

import network,time
from machine import UART,Timer
from Maix import GPIO
from fpioa_manager import fm
from simple import MQTTClient

# User and Password
SSID='xxxxxxxx' # WiFi 账号
KEY='xxxxxxxx'  # WiFi 密码

# Mic Control Init
fm.register(10, fm.fpioa.GPIOHS4, force=True)
fm.register(31, fm.fpioa.GPIOHS5, force=True)
fm.register(30, fm.fpioa.GPIOHS6, force=True)
open_air = GPIO(GPIO.GPIOHS4, GPIO.IN)
close_air = GPIO(GPIO.GPIOHS5, GPIO.IN)
time_air = GPIO(GPIO.GPIOHS6, GPIO.IN)

# Wifi En Pin
fm.register(11, fm.fpioa.GPIOHS0, force=True)
wifi_en=GPIO(GPIO.GPIOHS0, GPIO.OUT)

# Wifi Init
fm.register(7, fm.fpioa.UART2_TX, force=True)
fm.register(6, fm.fpioa.UART2_RX, force=True)
uart_wifi = UART(UART.UART2,115200,timeout=1000,read_buf_len=4096)
# Red Init
fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(32, fm.fpioa.UART1_RX, force=True)
uart_red = UART(UART.UART1,115200,timeout=1000,read_buf_len=4096)

# WiFi
def wifi_enable(en):
    global wifi_en
    wifi_en.value(en)

def wifi_init():
    global uart_wifi
    wifi_enable(0)
    time.sleep_ms(200)
    wifi_enable(1)
    time.sleep(2)
    uart_wifi = UART(UART.UART2,115200,timeout=1000, read_buf_len=4096)
    tmp = uart_wifi.read()
    uart_wifi.write("AT+UART_CUR=921600,8,1,0,0\r\n")
    print(uart_wifi.read())
    # important! baudrate too low or read_buf_len too small will loose data
    uart_wifi = UART(UART.UART2,921600,timeout=1000, read_buf_len=10240)
    uart_wifi.write("AT\r\n")
    tmp = uart_wifi.read()
    print(tmp)
    if not tmp.endswith("OK\r\n"):
        print("reset fail")
        return None
    try:
        nic = network.ESP8285(uart_wifi)
    except Exception:
        return None
    return nic

def MQTT_callback(topic, msg):
    global uart_red

    print('topic: {}'.format(topic))
    print('msg: {}'.format(msg))

    if msg == b'open':
        uart_red.write(b'\x68\x08\x00\xFF\x12\x01\x12\x16')
    if msg == b'close':
        uart_red.write(b'\x68\x08\x00\xFF\x12\x00\x11\x16')
    if msg == b'time':
        uart_red.write(b'\x68\x08\x00\xFF\x12\x02\x13\x16')
        
def MQTT_Rev(tim):
    try:
        client.check_msg()
    except OSError:
        pass

# Connecting
wlan = wifi_init()
wlan.connect(SSID,KEY)
print(wlan.ifconfig())

# Mqtt Params
SERVER = 'xxxxxxxx'
PORT = 1883
CLIENT_ID = 'xxxxxxxx'
USER = 'xxxxxxxx'
PASSWORD = 'xxxxxxxx'
TOPIC = 'xxxxxxxx'
client = MQTTClient(CLIENT_ID, SERVER, PORT,user=USER, password=PASSWORD)
client.set_callback(MQTT_callback)
client.connect()
client.subscribe(TOPIC)

tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC,period=300, callback=MQTT_Rev)

t_before = time.time()
while True:
    # Reconnecting
    if time.time() - t_before > 60:
        # Disconnecting
        client.disconnect()
        tim.deinit()
        # Connecting
        wlan = wifi_init()
        wlan.connect(SSID,KEY)
        print(wlan.ifconfig())

        # Mqtt Params
        SERVER = 'xxxxxxxx'
        PORT = 1883
        CLIENT_ID = 'xxxxxxxx'
        USER = 'xxxxxxxx'
        PASSWORD = 'xxxxxxxx'
        TOPIC = 'xxxxxxxx'
        client = MQTTClient(CLIENT_ID, SERVER, PORT,user=USER, password=PASSWORD)
        client.set_callback(MQTT_callback)
        client.connect()
        client.subscribe(TOPIC)
        tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC,period=300, callback=MQTT_Rev)
        t_before = time.time()
    # Mic
    if open_air.value() == 1:
        uart_red.write(b'\x68\x08\x00\xFF\x12\x01\x12\x16')
        time.sleep(1) 
    if close_air.value() == 1:
        uart_red.write(b'\x68\x08\x00\xFF\x12\x00\x11\x16')
        time.sleep(1)
    if time_air.value() == 1:
        uart_red.write(b'\x68\x08\x00\xFF\x12\x02\x13\x16')
        time.sleep(1)
        
    time.sleep(0.2)

小程序前端

MQTT服务器我选择的是环信即时通讯云

产品概述 IM 开发文档] (easemob.com)

该服务说明比较详细,快速收发demo也比较全,支持服务器端集成SDK、提供API接口,我好爱。😍

收发demo云端我选择的是小程序收发,安装他介绍的操作步骤,补充api参数,初始化代码即可实现订阅功能。这里不做介绍啦。

补充

这个项目其实也没有考虑很多,随便写一些罢了,不过,这里有很多有趣的还可以补充,像:

  1. 你可以通过对接QQ机器人、微信机器人,实现QQ、微信发消息控制智能家居;
  2. 微信、QQ消息通过小爱同学播报;
  3. 通过人脸识别、人体检测,搭配任意摄像机,实现回家欢迎、出门关灯等操作;
  4. 让灯光颜色根据你电脑屏幕颜色来自动变化;
  5. 家里门打开了自动启动XXX游戏;
  6. ……………