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驱动板、继电器 使用排针外接。



Android平板电脑显示效果:

Android手机显示效果:


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

3.2 语音识别模块: LD3320

3.3 ESP8266 -串口WIFI

3.4 LED灯-RGB灯

3.5 3W大功率LED灯

3.6 OLED模块

3.7 步进电机模块

3.8 继电器模块

3.9 杜邦线(母对母)

3.10 红外寻迹/循迹模块

3.11 温湿度-DHT11

3.12 BH1750光敏传感器

4. OneNet创建产品与设备
4.1 创建产品
地址:https://open.iot.10086.cn/develop/global/product/#/console
登录官网、点击右上角进入控制台,然后跟着截图步骤做。






4.2 创建设备



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

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

4.4 创建应用

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

新建项目:





4.5 布局界面

选择表盘修改名称。

修改完点击这里保存。

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

添加按钮。

添加段落。

页面布局成功。

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



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

然后继续增加即可。


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

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

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


每个开关可以向设备端发送命令,修改命令下发的格式。
这里的{V} 表示是一个变量,如果我设置成sw1:{V} 那么就表示下发的命令就是sw1:0或者是sw1:1
其他的按钮一样的配置方法,我就不一一截图了。


4.7 保存预览发布


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


本项目发布链接地址: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

(2)生成登录密匙信息
查看MQTT登录报文需要填写的参数来源与格式。

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


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

下载token生成工具。

工具软件里需要填写的参数如下:
【1】res选项参数的格式: products/{产品ID}/devices/{设备名称}
【2】et是设置token过期时间:算出1970-1-1到你想要设置的到期时间,单位是秒,填入即可。
比如: 超时时间设置为2022-4-7,那么,这里填入的秒就是:1970-1-1到2022-4-7之间的秒单位时间。
【3】key的参数格式: 就是设备创建之后,在设备详情页的key
C语言获取秒单位时间的代码:

设备密匙查看:

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

生成的数据就是MQTT服务器登录的密匙。
(3)主题订阅与发布的格式
文档地址:https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html


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


当前设备的主题订阅与主题发布总结:
(4)软件模拟登录测试
当前采用MQTT客户端模拟设备,登录Onetnet测试,完成数据交互,测试云端产品设备交互是否OK。
软件下载地址:https://download.csdn.net/download/xiaolong1126626497/18784012
根据软件提示,填充好参数,点击连接服务器,接着订阅主题,发送主题。

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

查看上传的数据。

(5)云端下发命令给设备
onenet支持以同步的形式发送命令给设备,方便控制设备。
发送命令的方法和设备应答的说明文档:https://open.iot.10086.cn/doc/v5/develop/detail/267

总结:
下面来实操演示一下过程:
登录OneNet官网,点开设备列表页面,先让设备登录服务器,点击更多操作,点击下发命令。

编辑好参数,点击发送。

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

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

网页上收到正确的响应。

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

6. LD3320语音识别模块编程

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

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

当前支持的指令如下:

7. STM32设备端开发
7.1 程序下载

7.2 原理图

7.3 硬件接线
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"
#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"
#define CONNECT_SERVER_PORT 1883
char mqtt_message[100];
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;
u8 mode=0;
u32 i=0;
u8 key_val;
u32 TimeCnt=0;
u32 wifi_TimeCnt=0;
JTAG_Set();
USART1_Init(115200);
USART2_Init(115200);
TIMER2_Init(72,20000);
USART3_Init(9600);
TIMER3_Init(36,20000);
KEY_Init();
LED_Init();
LED2_Init();
IIC_Init();
DHT11_Init();
Moto_Init();
APP_Init();
printf("正在初始化OLED...\r\n");
OLED_Init(0xc8,0xa1);
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));
MQTT_Init();
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");
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");
}
DelayMs(10);
TimeCnt++;
wifi_TimeCnt++;
if(TimeCnt>=100)
{
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)
{
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);
}
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;
}
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 拿到代码怎么用?



本文正在参加物联网有奖征文活动】,活动链接: https://ost.51cto.com/posts/14758
从选材到搭建都讲解都非常详细的文章。