#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制 原创 精华

DS小龙哥
发布于 2022-8-12 16:25
浏览
2收藏

1. 前言

如今的智能家居越来越深入人心,越来越受人们的欢迎。智能家居作为与人们日常生活息息相关的科技智能产物,可以给我们的生活带来舒适便利。随着物联网、云计算、无线通信等新技术的发展,智能家居得到了快速发展,能让用户利用智能手机来控制家中的设备,实现远程控制、场景控制、联动控制和定时控制等功能。在安全防护上,智能家居安防系统则够在原来的基础上提供立体化防护,帮助用户时刻守护住宅安全,更符合人们的安全需求。节能减排方面的也有积极作用。比如说,智能家居照明系统,它充分利用了自然光的照明作用,自动调节灯具的亮度,在保证室内明亮度的同时,将能耗降到最低,而对于洗手间、储藏室等地方,更是做到了人来灯亮、人走灯灭,一方面方便了用户的日常生活,另一方面也能防止用户忘记及时关灯而造成浪费。

2. 设计要求总结

设计题目:基于物联网的语音和环境检测的智能家居控制系统设计

第一种:控制方式需经结合语音命令控制, 控制开关门、灯、电视、开关空调、开关电扇、开关窗帘等。

第二种:控制方式是基于环境检测自动执行控制,根据环境检测结果控制相应的执行机构协作,比如: 当光照低于一定程度(比如低于5OLux)且有人在家里自动开灯,没人在家时自动关灯;如温度高于阈值并且有人在家时打开空调,没人在家时自动关闭等;如光照强度低于一定程度会自动关闭窗帘。电脑和手机APP两端云平台可以展示温湿度,光照等信息,还有各家居的状态,可以在云平台控制家居的开关,可以在云平台进行两种控制方式的切换。

技术选项总结:

(1)物联网平台采用OneNet:OneNET是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物联网解决方案。

(2)主控芯片采用:STM32F103C8T6

(3)语音控制芯片采用:LD3320 支持普通话识别。

(4)开关空调、开关风扇 采用继电器模拟:两个1路5V继电器控制

(5)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟

(6)室内照明灯(卧室、客厅):2盏 3W大功率LED灯模拟

(7)环境光检测检测:BH1750数字传感器

(8)联网的WIFI :选择ESP8266

(9)OLED屏幕:模拟电视显示

(11)温湿度检测:DHT11模块

其中:

(1)STM32主控芯片、语音控制芯片LD3320、室内照明大功率LED灯、环境光检测BH1750、ESP8266-WIFI 通过排母插在PCB板子上。

(2)步进电机UL2003驱动板、继电器 使用排针外接。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

Android平板电脑显示效果:

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

Android手机显示效果:

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3. 硬件选型

3.1 STM32F103C8T6

STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.2 语音识别模块: LD3320

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.3 ESP8266 -串口WIFI

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.4 LED灯-RGB灯

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.5 3W大功率LED灯

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.6 OLED模块

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.7 步进电机模块

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.8 继电器模块

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.9 杜邦线(母对母)

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.10 红外寻迹/循迹模块

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.11 温湿度-DHT11

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

3.12 BH1750光敏传感器

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

4. OneNet创建产品与设备

4.1 创建产品

地址:https://open.iot.10086.cn/develop/global/product/#/console

登录官网、点击右上角进入控制台,然后跟着截图步骤做。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

4.2 创建设备

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

4.3 创建数据流模板

这里添加的就是需要上传的数据流名称,与传感器对应。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

添加完毕。一共10个数据点类型。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

4.4 创建应用

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

链接:https://open.iot.10086.cn/studio/view/project

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

新建项目:

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

4.5 布局界面

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

选择表盘修改名称。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

修改完点击这里保存。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

表盘数据的格式后缀可以修改。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

添加按钮。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

添加段落。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

页面布局成功。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

4.6 绑定数据源

接下来是重点,要为每个控件绑定数据源,才可以与设备进行交互。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

上面的产品ID和Key从哪里来? 看下面截图。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

然后继续增加即可。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

接下来重新进入到刚才给控件绑定数据源的页面。绑定数据源即可。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

取消过滤器配置,使用数据源的数据值。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

下面介绍按钮的数据源配置。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

每个开关可以向设备端发送命令,修改命令下发的格式。
这里的{V} 表示是一个变量,如果我设置成sw1:{V} 那么就表示下发的命令就是sw1:0或者是sw1:1

其他的按钮一样的配置方法,我就不一一截图了。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

4.7 保存预览发布

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

回到项目页面点击发布。就可以分享链接给别人了。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

本项目发布链接地址:https://open.iot.10086.cn/view/main/index.html#/share2d?id=62625265bb4cd10035477bae

5. MQTT协议登录

(1)MQTT服务器地址信息

文档: https://open.iot.10086.cn/doc/v5/develop/detail/248

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

IP地址: 183.230.40.96
端口号: 1883
  • 1.
  • 2.

(2)生成登录密匙信息

查看MQTT登录报文需要填写的参数来源与格式。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

文档: https://open.iot.10086.cn/doc/v5/develop/detail/265

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

算法介绍文档:https://open.iot.10086.cn/doc/v5/develop/detail/241

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

下载token生成工具。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

工具软件里需要填写的参数如下:

【1】res选项参数的格式: products/{产品ID}/devices/{设备名称}

【2】et是设置token过期时间:算出1970-1-1到你想要设置的到期时间,单位是秒,填入即可。

比如: 超时时间设置为2022-4-7,那么,这里填入的秒就是:1970-1-1到2022-4-7之间的秒单位时间。

【3】key的参数格式: 就是设备创建之后,在设备详情页的key

C语言获取秒单位时间的代码:

#include <stdio.h>
#include <time.h>
 #include <time.h>
 
int main()
{
    time_t time_sec;
    time_sec=time(NULL);  //当前的秒单位时间--UTC时间
	printf("当前时间(秒):%ld\n",time_sec);
	printf("加一年的时间(秒):%ld\n",time_sec+12*30*24*60*60);
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

设备密匙查看:

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

填入在生成密匙软件中的参数格式:

res选项:products/507546/devices/dev1
et是设置token过期时间:1680445911
key的设备key:vdUElCh1OE0oFV6UNewtZIMryKU8OhQiIbAbKwTc9ak=
  • 1.
  • 2.
  • 3.

生成登录密匙:

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

生成的值:
version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D
  • 1.
  • 2.

生成的数据就是MQTT服务器登录的密匙。

(3)主题订阅与发布的格式

文档地址:https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

订阅 topic	订阅效果
$sys/{pid}/{device-name}/dp/post/json/accepted	订阅设备数据点上报成功的消息
$sys/{pid}/{device-name}/dp/post/json/rejected	订阅设备数据点上报失败的消息
$sys/{pid}/{device-name}/dp/post/json/+	订阅设备数据点上报结果
$sys/{pid}/{device-name}/cmd/request/+	订阅设备所有命令消息
$sys/{pid}/{device-name}/cmd/response/+/+	订阅设备所有命令应答结果消息
$sys/{pid}/{device-name}/cmd/#	订阅设备所有命令相关消息
$sys/{pid}/{device-name}/#	订阅设备所有相关消息
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

上传数据点的格式介绍:https://open.iot.10086.cn/doc/mqtt/book/example/datapoints.html

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

topic 命名规则如下:
$sys/{pid}/{device-name}/dp/post/json

本例中,发布 topic 名称为:
$sys/238322/mqtts-test-device/dp/post/json

payload示例如下:
{
    "id": 123,        
    "dp": {             
        "temperatrue": [{     
            "v": 30,
        }],
        "power": [{     
            "v": 4.5,        
        }]
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

当前设备的主题订阅与主题发布总结:

IP地址: 183.230.40.96
端口号: 1883
clientId: dev1
username: 507546
password: version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D

订阅主题:  $sys/507546/dev1/#
发布主题:  $sys/507546/dev1/dp/post/json
发布消息:  
{"id":123,"dp":{"bh1750":[{"v":45}],"dht11_h":[{"v":88}],"dht11_t":[{"v":26}]}}

发布消息: 
{"id":123,"dp":{"bh1750":[{"v":45}],"dht11_h":[{"v":88}],"dht11_t":[{"v":26}]}}


{"id":123,"dp":{"bh1750":[{"v":45}],"dht11_h":[{"v":88}],"dht11_t":[{"v":26}],"gps":[{"v":{"lon":120.086199,"lat":30.139219}}]}}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

(4)软件模拟登录测试

当前采用MQTT客户端模拟设备,登录Onetnet测试,完成数据交互,测试云端产品设备交互是否OK。

软件下载地址:https://download.csdn.net/download/xiaolong1126626497/18784012

根据软件提示,填充好参数,点击连接服务器,接着订阅主题,发送主题。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

然后网页登录OneNet查看设备状态,与数据显示。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

查看上传的数据。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

(5)云端下发命令给设备

onenet支持以同步的形式发送命令给设备,方便控制设备。

发送命令的方法和设备应答的说明文档:https://open.iot.10086.cn/doc/v5/develop/detail/267

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

总结:

云端下发的命令格式:
$sys/507546/dev1/cmd/request/3baf8324-e5d4-43f1-be89-118299c3b583
LED_ON

其中:
3baf8324-e5d4-43f1-be89-118299c3b583  表示当前的请求ID,设备应答的时候需要带上这个ID返回去。
LED_ON  表示云端下发的命令内容


设备收到这个命令之后,需要向云端回应。

回应的格式如下:
发布主题: $sys/507546/dev1/cmd/response/3baf8324-e5d4-43f1-be89-118299c3b583
发布的消息:111

其中:111   是返回给云端的消息内容,111是随便写的,举个例子。

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

下面来实操演示一下过程:

登录OneNet官网,点开设备列表页面,先让设备登录服务器,点击更多操作,点击下发命令。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

编辑好参数,点击发送。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

这时MQTT设备端就会收到提示。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

然后拼接好命令再发送应答给服务器。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

网页上收到正确的响应。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

发布的网页上也显示了正确的数据:

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

6. LD3320语音识别模块编程

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

下载程序示例。 将开发板的串口通过USB转TTL模块连接电脑即可。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

波特率是9600,语音识别时,想要说小杰,唤醒语音识别,然后再说出指令,唤醒语音识别就,模块上有一个红色的LED灯会亮。

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

当前支持的指令如下:

小杰,开卧室灯
小杰,关卧室灯
小杰,开客厅灯
小杰,关客厅灯
小杰,打开电视
小杰,关闭电视
小杰,打开风扇
小杰,关闭风扇
小杰,打开窗帘
小杰,关闭窗帘
小杰,打开空调
小杰,关闭空调
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

7. STM32设备端开发

7.1 程序下载

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

7.2 原理图

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

7.3 硬件接线

本设计的硬件接线说明:1)OLED显示屏接线:
D0----(SCK)------------------->>PB14
D1----(MOSI)------------------>>PB13
RES—(复位脚低电平有效)-------->>PB12
DC--(数据和命令控制管脚)------>>PB1
CS--(片选引脚)---------------->>PA7
GND--------------------------->>GND
VCC--------------------------->>3.3V或者5V


(2)ATK-ESP8266 WIFI接线
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)


(3)LD3320语音识别模块接线说明
GND----GND
VCC---3.3V
PB11----LD3320语音模块_TX
PB10----LD3320语音模块_RX


(4)开关空调:15V继电器控制
PA6------LED

(5)开关风扇:15V继电器控制
PA4------LED

(6)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟
ULN2003接线:
 IN-D: PB5   d
 IN-C: PB4   c
 IN-B: PB3   b
 IN-A: PB2   a
+  : 5V
-  : GND

(7)卧室照明灯:一盏3W大功率LED灯模拟
PB8------LED

(8)客厅照明灯:一盏3W大功率LED灯模拟
PB9------LED

(9)环境光检测检测:BH1750数字传感器
SDA-----PB7
SCL-----PB6
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)


(10)温湿度传感器: DHT11
VCC--VCC
GND---GND
DAT---PA5 

(11)红外寻迹/循迹模块
VCC--3.3V
GND---GND
DAT---PA8


(--)板载LED灯:低电平亮
LED1--PC13  
BEEP2--PC14

(--)板载按键: 
KEY1--PA0  按下为高电平

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.

7.4 核心代码

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <string.h>
#include <stdlib.h>
#include "timer.h"
#include "oled.h"
#include "fontdata.h"
#include "esp8266.h"
#include "app.h"
#include "mqtt.h"
#include "iic.h"
#include "bh1750.h"
#include "dht11.h"
#include "motor.h"

/*
本设计的硬件接线说明: 

(1)OLED显示屏接线:
D0----(SCK)------------------->>PB14
D1----(MOSI)------------------>>PB13
RES—(复位脚低电平有效)-------->>PB12
DC--(数据和命令控制管脚)------>>PB1
CS--(片选引脚)---------------->>PA7
GND--------------------------->>GND
VCC--------------------------->>3.3V或者5V


(2)ATK-ESP8266 WIFI接线
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)


(3)LD3320语音识别模块接线说明
GND----GND
VCC---3.3V
PB11----LD3320语音模块_TX
PB10----LD3320语音模块_RX


(4)开关空调:1路5V继电器控制
PA6------LED

(5)开关风扇:1路5V继电器控制
PA4------LED

(6)开关窗帘采用步进电机模拟: 28BYJ4步进电机模拟
ULN2003接线:
 IN-D: PB5   d
 IN-C: PB4   c
 IN-B: PB3   b
 IN-A: PB2   a
+  : 5V
-  : GND

(7)卧室照明灯:一盏3W大功率LED灯模拟
PB8------LED

(8)客厅照明灯:一盏3W大功率LED灯模拟
PB9------LED

(9)环境光检测检测:BH1750数字传感器
SDA-----PB7
SCL-----PB6
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)


(10)温湿度传感器: DHT11
VCC--VCC
GND---GND
DAT---PA5 

(11)红外寻迹/循迹模块
VCC--3.3V
GND---GND
DAT---PA8


(--)板载LED灯:低电平亮
LED1--PC13  
BEEP2--PC14

(--)板载按键: 
KEY1--PA0  按下为高电平

*/


//物联网服务器的设备信息
#define MQTT_ClientID "dev1"
#define MQTT_UserName "507546"
#define MQTT_PassWord "version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D"

//订阅与发布的主题
#define SET_TOPIC  "$sys/507546/dev1/#"  //订阅
#define POST_TOPIC "$sys/507546/dev1/dp/post/json"  //发布

//设置连接的路由器信息
#define CONNECT_WIFI  "Xiaomi_meizi6"   //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define CONNECT_PASS "12170307yu"       //将要连接的路由器密码

#define CONNECT_SERVER_IP "183.230.40.96"   //服务器IP地址
#define CONNECT_SERVER_PORT 1883            //服务器端口号


char mqtt_message[100];

//WIFI发送数据存储区域
char data_buff[500];

u8 esp8266_state=0;

double Longitude=120.196517; //经度
double latitude=30.194493;  //纬度

u8 bh1750=0;
 
u8 dht11_temp;
u8 dht11_humidity;
u8 sw1=0;
u8 sw2=0;
u8 sw3=0;
u8 sw4=0;
u8 sw5=0;
u8 sw7=0;

/*
主函数: 程序执行的入口
*/
int main(void)
{
    u8 dian_shi=0; //1表示电视开 0表示电视关
    u8 mode=0; //0 表示手动模式  1表示自动模式
    u32 i=0;
    u8 key_val;
	u32 TimeCnt=0;
    u32 wifi_TimeCnt=0;
    JTAG_Set();
    USART1_Init(115200);    //串口1的初始化
    USART2_Init(115200);    //串口-WIFI
    TIMER2_Init(72,20000);  //超时时间20ms
    USART3_Init(9600);      //串口-语音模块
    TIMER3_Init(36,20000);  //超时时间20ms
    
    //板载按键初始化
    KEY_Init();
    //板载LED灯初始化
    LED_Init();
    //外接LED初始化
    LED2_Init();
    //BH1750的IIC接口
    IIC_Init();
    //初始化DHT11
    DHT11_Init();
    //步进电机初始化	
    Moto_Init(); 
    //初始化
    APP_Init();
    

    printf("正在初始化OLED...\r\n");  
	OLED_Init(0xc8,0xa1); //OLED显示屏初始化--正常显示
	OLED_Clear(0x00);//清屏	
    
     strcpy((char*)USART2_RX_BUFFER,"<>卧室灯已打开");
     if(strstr((char*)&USART2_RX_BUFFER[1],"卧室灯已打开"))
     {
        printf("识别正确.\r\n");
     }
     else
     {
         printf("识别错误.\r\n");
     }
    
    printf("正在初始化ESP8266..\r\n");  
    for(i=0;i<5;i++)
    {
        if(ESP8266_Init()==0)
        {
            esp8266_state=1;
            break;
        }
        else
        {
            esp8266_state=0;
            printf("ESP8266硬件检测错误.\n");  
        }
    }
  
   if(esp8266_state)
   {
        printf("准备连接服务器....\r\n");
        //非加密端口
        printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));
         
        //2. MQTT协议初始化	
        MQTT_Init(); 

        //3. 连接服务器  
        for(i=0;i<5;i++)
        {
            if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0)
            {
                esp8266_state=1;
                break;
            }
            esp8266_state=0;
            printf("服务器连接失败,正在重试...\n");
            delay_ms(500);
        }
        printf("服务器连接成功.\n");

        //3. 订阅主题
        if(MQTT_SubscribeTopic(SET_TOPIC,0,1))
        {
           printf("主题订阅失败.\n");
        }
        else
        {
           printf("主题订阅成功.\n");
        } 
   }
   
   
   //上电时,让云端的按钮都处于关闭状态
   sprintf(data_buff,"{\"id\":123,\"dp\":{\"sw1\":[{\"v\":0}],\"sw2\":[{\"v\":0}],\"sw3\":[{\"v\":0}],\"sw4\":[{\"v\":0}]"
   ",\"sw5\":[{\"v\":0}],\"sw7\":[{\"v\":0}],\"mode\":[{\"v\":0}]}}");
    MQTT_PublishData(POST_TOPIC,data_buff,0);
  
   //等待稳定
   delay_ms(1000);
   
    while(1)
	{	
        key_val=KEY_GetValue();
        if(key_val)
        {
             printf("按键按下.\r\n");
        }
        
        //清屏
        //OLED_Clear(0);  
        //时间记录
        DelayMs(10);
        TimeCnt++;
        wifi_TimeCnt++;
        
        if(TimeCnt>=100) //1000毫秒一次
        {
            TimeCnt=0;
            LED1=!LED1;
            LED2_1=!LED2_1;
            LED2_2=!LED2_2;
            LED2_3=!LED2_3;
            
            //判断模式
            if(mode)
            {
                printf("当前处于自动模式.\r\n");
            }
            else
            {
                printf("当前处于手动模式.\r\n");
            }
            
            //读取光强度
            bh1750=Read_BH1750_Data();
            printf("光强度:%d\r\n",bh1750);
            
            //读取温湿度
            if(DHT11_Read_Data(&dht11_temp,&dht11_humidity))
            {
                printf("温度读取失败.\r\n");
            }
                        
            printf("环境温度:%d\r\n环境湿度:%d\r\n",dht11_temp,dht11_humidity);
            
            //电视开
            if(dian_shi)
            {
                sprintf(mqtt_message,"BH1750 :%4d",bh1750);
                OLED_ShowString(0,0,16,mqtt_message);
                
                sprintf(mqtt_message,"DHT11_T:%4d",dht11_temp);
                OLED_ShowString(0,16,16,mqtt_message);
                
                sprintf(mqtt_message,"DHT11_H:%4d",dht11_humidity);
                OLED_ShowString(0,16*2,16,mqtt_message);
                
                sprintf(mqtt_message,"mode:%d p:%d",mode,DEV_HONGWAI);
                OLED_ShowString(0,16*3,16,mqtt_message);
            }
            else
            {
               OLED_Clear(0x00);//清屏	 
            }
            
            
            //自动模式下
            if(mode)
            {
                //白天
                if(bh1750>50)
                {
                    DEV_WOSHI_LED=0;
                    DEV_KETIN_LED=0;
                    sw4=0;
                    sw5=0;
                    
                    //如果光很强,就自动关闭窗帘
                    if(bh1750>200)
                    {
                       //如果窗帘是处于开启状态,就关闭
                        if(sw3)
                        {
                            sw3=0; 
                            //启动窗帘关闭
                            Motorcw_ring(1,300);
                        } 
                    }
                }
                //黑夜
                else
                {
                    //有人--红外线检测
                    if(DEV_HONGWAI==0)
                    {
                        DEV_WOSHI_LED=1;
                        DEV_KETIN_LED=1;
                        sw4=1;
                        sw5=1;
                    }
                    //没人
                    else
                    {
                        DEV_WOSHI_LED=0;
                        DEV_KETIN_LED=0;
                        sw4=0;
                        sw5=0;
                    }
                    
                                 sprintf(data_buff,"{\"id\":123,\"dp\":{\"bh1750\":[{\"v\":%d}],\"dht11_t\":[{\"v\":%d}],\"dht11_h\":[{\"v\":%d}],\"sw1\":[{\"v\":%d}],\"sw2\":[{\"v\":%d}],\"sw3\":[{\"v\":%d}],\"sw4\":[{\"v\":%d}]"
               ",\"sw5\":[{\"v\":%d}],\"sw7\":[{\"v\":%d}],\"mode\":[{\"v\":%d}]}}",
                        bh1750,dht11_temp,dht11_humidity,sw1,sw2,sw3,sw4,sw5,sw7,mode);
                         printf("data_buff:%s\r\n",data_buff);
                        MQTT_PublishData(POST_TOPIC,data_buff,0);
                                
                }
            }
	    }
        
        //上传到物联网服务器的频率
        if(wifi_TimeCnt>=300) //3000毫秒一次
        {
            wifi_TimeCnt=0;
            
            sprintf(data_buff,"{\"id\":123,\"dp\":{\"bh1750\":[{\"v\":%d}],\"dht11_t\":[{\"v\":%d}],\"dht11_h\":[{\"v\":%d}],\"sw1\":[{\"v\":%d}],\"sw2\":[{\"v\":%d}],\"sw3\":[{\"v\":%d}],\"sw4\":[{\"v\":%d}]"
   ",\"sw5\":[{\"v\":%d}],\"sw7\":[{\"v\":%d}],\"mode\":[{\"v\":%d}]}}",
            bh1750,dht11_temp,dht11_humidity,sw1,sw2,sw3,sw4,sw5,sw7,mode);
             printf("data_buff:%s\r\n",data_buff);
            MQTT_PublishData(POST_TOPIC,data_buff,0);
        }

       // 接收WIFI返回的数据
        if(USART2_RX_FLAG)
        {
            USART2_RX_BUFFER[USART2_RX_CNT]='\0';
            
            printf("WIFI收到数据:\r\n");
            //向串口打印服务器返回的数据
            for(i=0;i<USART2_RX_CNT;i++)
            {
                printf("%c",USART2_RX_BUFFER[i]);
            }
            printf("USART2_RX_CNT=%d\r\n",USART2_RX_CNT);
            
             if(USART2_RX_CNT<=5)
             {
                  USART2_RX_CNT=0;
                  USART2_RX_FLAG=0;
                 continue;
             } 
            //如果是下发了属性
            //$sys/507546/dev1/cmd/request/a87b5e5f-f636-4e48-aa4c-b50ce32828cfsw2:1
             //手动模式
            if(strstr((char*)&USART2_RX_BUFFER[5],"mode:0"))
            {
                printf("开关-手动模式.\r\n");
                mode=0;
            }
            //自动模式
            else if(strstr((char*)&USART2_RX_BUFFER[5],"mode:1"))
            {
                printf("开关-自动模式.\r\n");
                mode=1;
            }
            
             //手动模式
             if(mode==0)
             {
                //风扇关
                if(strstr((char*)&USART2_RX_BUFFER[5],"sw1:0"))
                {
                    printf("开关-风扇关闭.\r\n");
                    DEV_FEN_SAHN=0;
                    sw1=0;
                }
                //风扇开
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw1:1"))
                {
                    printf("开关-风扇打开.\r\n");
                    DEV_FEN_SAHN=1;
                    sw1=1;
                }
                //空调关
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw2:0"))
                {
                    DEV_KONG_TIAO=0;
                    sw2=0;
                }
                //空调开
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw2:1"))
                {
                    DEV_KONG_TIAO=1;
                    sw2=1;
                }
                //窗帘关
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw3:0"))
                {
                    Motorcw_ring(1,300);
                    sw3=0;
                }
                //窗帘开
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw3:1"))
                {
                    Motorcw_ring(1,300);
                    sw3=1;
                }
                //卧室灯关
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw4:0"))
                {
                    DEV_WOSHI_LED=0;
                    sw4=0;
                }
                //卧室灯开
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw4:1"))
                {
                    DEV_WOSHI_LED=1;
                    sw4=1;
                }
                //客厅灯关
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw5:0"))
                {
                    DEV_KETIN_LED=0;
                    sw5=0;
                }
                //客厅灯开
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw5:1"))
                {
                    DEV_KETIN_LED=1;
                    sw5=1;
                }
                //电视关
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw7:0"))
                {
                   dian_shi=0;
                    sw7=0;
                }
                //电视开
                else if(strstr((char*)&USART2_RX_BUFFER[5],"sw7:1"))
                {
                   dian_shi=1;
                   sw7=1;
                }
             }
             
            USART2_RX_CNT=0;
            USART2_RX_FLAG=0;
        }
        
         //实时接收语音模块返回的数据
         if(USART3_RX_FLAG)
         {
             USART3_RX_BUFFER[USART3_RX_CNT]='\0';
             printf("USART3_RX_BUFF=%d,%s\r\n",USART3_RX_CNT,USART3_RX_BUFFER);
             
             //手动模式
             if(mode==0)
             {
                //风扇关
                if(strstr((char*)USART3_RX_BUFFER,"风扇已关闭"))
                {
                    printf("语音-风扇已关闭.\r\n");
                    DEV_FEN_SAHN=1;
                    sw1=1;
                }
                //风扇开
                else if(strstr((char*)USART3_RX_BUFFER,"风扇已打开"))
                {
                    printf("语音-风扇已打开.\r\n");
                    DEV_FEN_SAHN=0;
                    sw1=0;
                }
                //空调关
                else if(strstr((char*)USART3_RX_BUFFER,"空调已关闭"))
                {
                    DEV_KONG_TIAO=1;
                    sw2=1;
                }
                //空调开
                else if(strstr((char*)USART3_RX_BUFFER,"空调已打开"))
                {
                    DEV_KONG_TIAO=0;
                    sw2=0;
                }
                //窗帘关
                else if(strstr((char*)USART3_RX_BUFFER,"窗帘已关闭"))
                {
                    Motorcw_ring(1,300);
                    sw3=0;
                }
                //窗帘开
                else if(strstr((char*)USART3_RX_BUFFER,"窗帘已打开"))
                {
                    Motorcw_ring(1,300);
                    sw3=1;
                }
                //卧室灯关
                else if(strstr((char*)USART3_RX_BUFFER,"卧室灯已关闭"))
                {
                    DEV_WOSHI_LED=0;
                    sw4=0;
                }
                //卧室灯开
                else if(strstr((char*)USART3_RX_BUFFER,"卧室灯已打开"))
                {
                    DEV_WOSHI_LED=1;
                    sw4=1;
                }
                //客厅灯关
                else if(strstr((char*)USART3_RX_BUFFER,"客厅灯已关闭"))
                {
                    DEV_KETIN_LED=0;
                    sw5=0;
                }
                //客厅灯开
                else if(strstr((char*)USART3_RX_BUFFER,"客厅灯已打开"))
                {
                    DEV_KETIN_LED=1;
                    sw5=1;
                }
                //电视关
                else if(strstr((char*)USART3_RX_BUFFER,"电视机已关闭"))
                {
                   dian_shi=0;
                    sw7=0;
                }
                //电视开
                else if(strstr((char*)USART3_RX_BUFFER,"电视机已打开"))
                {
                   dian_shi=1;
                   sw7=1;
                }
             }
             
             memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER));
             USART3_RX_CNT=0;
             USART3_RX_FLAG=0;
         } 
    }        
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251.
  • 252.
  • 253.
  • 254.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.
  • 268.
  • 269.
  • 270.
  • 271.
  • 272.
  • 273.
  • 274.
  • 275.
  • 276.
  • 277.
  • 278.
  • 279.
  • 280.
  • 281.
  • 282.
  • 283.
  • 284.
  • 285.
  • 286.
  • 287.
  • 288.
  • 289.
  • 290.
  • 291.
  • 292.
  • 293.
  • 294.
  • 295.
  • 296.
  • 297.
  • 298.
  • 299.
  • 300.
  • 301.
  • 302.
  • 303.
  • 304.
  • 305.
  • 306.
  • 307.
  • 308.
  • 309.
  • 310.
  • 311.
  • 312.
  • 313.
  • 314.
  • 315.
  • 316.
  • 317.
  • 318.
  • 319.
  • 320.
  • 321.
  • 322.
  • 323.
  • 324.
  • 325.
  • 326.
  • 327.
  • 328.
  • 329.
  • 330.
  • 331.
  • 332.
  • 333.
  • 334.
  • 335.
  • 336.
  • 337.
  • 338.
  • 339.
  • 340.
  • 341.
  • 342.
  • 343.
  • 344.
  • 345.
  • 346.
  • 347.
  • 348.
  • 349.
  • 350.
  • 351.
  • 352.
  • 353.
  • 354.
  • 355.
  • 356.
  • 357.
  • 358.
  • 359.
  • 360.
  • 361.
  • 362.
  • 363.
  • 364.
  • 365.
  • 366.
  • 367.
  • 368.
  • 369.
  • 370.
  • 371.
  • 372.
  • 373.
  • 374.
  • 375.
  • 376.
  • 377.
  • 378.
  • 379.
  • 380.
  • 381.
  • 382.
  • 383.
  • 384.
  • 385.
  • 386.
  • 387.
  • 388.
  • 389.
  • 390.
  • 391.
  • 392.
  • 393.
  • 394.
  • 395.
  • 396.
  • 397.
  • 398.
  • 399.
  • 400.
  • 401.
  • 402.
  • 403.
  • 404.
  • 405.
  • 406.
  • 407.
  • 408.
  • 409.
  • 410.
  • 411.
  • 412.
  • 413.
  • 414.
  • 415.
  • 416.
  • 417.
  • 418.
  • 419.
  • 420.
  • 421.
  • 422.
  • 423.
  • 424.
  • 425.
  • 426.
  • 427.
  • 428.
  • 429.
  • 430.
  • 431.
  • 432.
  • 433.
  • 434.
  • 435.
  • 436.
  • 437.
  • 438.
  • 439.
  • 440.
  • 441.
  • 442.
  • 443.
  • 444.
  • 445.
  • 446.
  • 447.
  • 448.
  • 449.
  • 450.
  • 451.
  • 452.
  • 453.
  • 454.
  • 455.
  • 456.
  • 457.
  • 458.
  • 459.
  • 460.
  • 461.
  • 462.
  • 463.
  • 464.
  • 465.
  • 466.
  • 467.
  • 468.
  • 469.
  • 470.
  • 471.
  • 472.
  • 473.
  • 474.
  • 475.
  • 476.
  • 477.
  • 478.
  • 479.
  • 480.
  • 481.
  • 482.
  • 483.
  • 484.
  • 485.
  • 486.
  • 487.
  • 488.
  • 489.
  • 490.
  • 491.
  • 492.
  • 493.
  • 494.
  • 495.
  • 496.
  • 497.
  • 498.
  • 499.
  • 500.
  • 501.
  • 502.
  • 503.
  • 504.
  • 505.
  • 506.
  • 507.
  • 508.
  • 509.
  • 510.
  • 511.
  • 512.
  • 513.
  • 514.
  • 515.
  • 516.
  • 517.
  • 518.
  • 519.
  • 520.
  • 521.
  • 522.
  • 523.
  • 524.
  • 525.
  • 526.
  • 527.
  • 528.
  • 529.
  • 530.
  • 531.
  • 532.
  • 533.
  • 534.
  • 535.
  • 536.
  • 537.
  • 538.
  • 539.
  • 540.
  • 541.
  • 542.
  • 543.
  • 544.
  • 545.
  • 546.
  • 547.
  • 548.
  • 549.
  • 550.
  • 551.
  • 552.
  • 553.
  • 554.
  • 555.
  • 556.
  • 557.
  • 558.
  • 559.
  • 560.
  • 561.
  • 562.
  • 563.
  • 564.
  • 565.
  • 566.
  • 567.
  • 568.
  • 569.
  • 570.
  • 571.
  • 572.
  • 573.
  • 574.
  • 575.
  • 576.
  • 577.
  • 578.

7.5 拿到代码怎么用?

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

#物联网征文# 基于STM32设计的智能家居控制系统_支持语音控制-鸿蒙开发者社区

本文正在参加物联网有奖征文活动】,活动链接: https://ost.51cto.com/posts/14758

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
3
收藏 2
回复
举报
3
1
2
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

从选材到搭建都讲解都非常详细的文章。

回复
2022-8-12 17:56:38


回复
    相关推荐
    这个用户很懒,还没有个人简介
    帖子
    视频
    声望
    粉丝
    社区精华内容