1. 前言
如今的智能家居越来越深入人心,越来越受人们的欢迎。智能家居作为与人们日常生活息息相关的科技智能产物,可以给我们的生活带来舒适便利。随着物联网、云计算、无线通信等新技术的发展,智能家居得到了快速发展,能让用户利用智能手机来控制家中的设备,实现远程控制、场景控制、联动控制和定时控制等功能。在安全防护上,智能家居安防系统则够在原来的基础上提供立体化防护,帮助用户时刻守护住宅安全,更符合人们的安全需求。节能减排方面的也有积极作用。比如说,智能家居照明系统,它充分利用了自然光的照明作用,自动调节灯具的亮度,在保证室内明亮度的同时,将能耗降到最低,而对于洗手间、储藏室等地方,更是做到了人来灯亮、人走灯灭,一方面方便了用户的日常生活,另一方面也能防止用户忘记及时关灯而造成浪费。
项目源码与资料下载地址: https://download.csdn.net/download/xiaolong1126626497/85896987
视频演示地址: https://www.bilibili.com/video/BV16Y4y147A3?share_source=copy_web&vd_source=347136f3e32fe297fc17177194ce0a8b
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
IP地址: 183.230.40.96
端口号: 1883
(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语言获取秒单位时间的代码:
#include <stdio.h>
#include <time.h>
#include <time.h>
int main()
{
time_t time_sec;
time_sec=time(NULL);
printf("当前时间(秒):%ld\n",time_sec);
printf("加一年的时间(秒):%ld\n",time_sec+12*30*24*60*60);
return 0;
}
设备密匙查看:
填入在生成密匙软件中的参数格式:
res选项:products/507546/devices/dev1
et是设置token过期时间:1680445911
key的设备key:vdUElCh1OE0oFV6UNewtZIMryKU8OhQiIbAbKwTc9ak=
生成登录密匙:
生成的值:
version=2018-10-31&res=products%2F507546%2Fdevices%2Fdev1&et=1680445911&method=md5&sign=qgaS0NCoxqSnIFZGL%2Fz81Q%3D%3D
生成的数据就是MQTT服务器登录的密匙。
(3)主题订阅与发布的格式
文档地址:https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html
订阅 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}/# 订阅设备所有相关消息
上传数据点的格式介绍:https://open.iot.10086.cn/doc/mqtt/book/example/datapoints.html
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,
}]
}
}
当前设备的主题订阅与主题发布总结:
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}}]}}
(4)软件模拟登录测试
当前采用MQTT客户端模拟设备,登录Onetnet测试,完成数据交互,测试云端产品设备交互是否OK。
软件下载地址:https://download.csdn.net/download/xiaolong1126626497/18784012
根据软件提示,填充好参数,点击连接服务器,接着订阅主题,发送主题。
然后网页登录OneNet查看设备状态,与数据显示。
查看上传的数据。
(5)云端下发命令给设备
onenet支持以同步的形式发送命令给设备,方便控制设备。
发送命令的方法和设备应答的说明文档:https://open.iot.10086.cn/doc/v5/develop/detail/267
总结:
云端下发的命令格式:
$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是随便写的,举个例子。
下面来实操演示一下过程:
登录OneNet官网,点开设备列表页面,先让设备登录服务器,点击更多操作,点击下发命令。
编辑好参数,点击发送。
这时MQTT设备端就会收到提示。
然后拼接好命令再发送应答给服务器。
网页上收到正确的响应。
发布的网页上也显示了正确的数据:
6. LD3320语音识别模块编程
下载程序示例。 将开发板的串口通过USB转TTL模块连接电脑即可。
波特率是9600,语音识别时,想要说小杰 ,唤醒语音识别,然后再说出指令,唤醒语音识别就,模块上有一个红色的LED灯会亮。
当前支持的指令如下:
小杰,开卧室灯
小杰,关卧室灯
小杰,开客厅灯
小杰,关客厅灯
小杰,打开电视
小杰,关闭电视
小杰,打开风扇
小杰,关闭风扇
小杰,打开窗帘
小杰,关闭窗帘
小杰,打开空调
小杰,关闭空调
7. STM32设备端开发
7.1 程序下载
7.2 原理图
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)开关空调: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 按下为高电平
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;
}
}
}
7.5 拿到代码怎么用?
|