能够连接物联网平台(ONENET)上传传感器数据与图像
stm32f4标准工程:stm32f407自建标准工程(stm32f4标准工程)
ONENET平台资料:包含WIFI模块的驱动和ONENET平台的连接例程,还有修改后的移植代码(onenet资料)
最终工程:移植优化后的最终stm32f407工程(onenet接入修改工程)
WIFI模块硬件连接与接口
这里WIFI模块使用的是 安信可ESP-12F ESP8266,附上一张模块的最小系统图:
ps:模块的REST是复位引脚,可接高电平,也可以接IO口,来控制模块的复位;模块的GPIO0是烧写固件引脚,可以不接,也可以接IO口用作烧写固件使用;模块的TXD和RXD就是串口接口引脚,交叉对应接到STM32F4的引脚上即可,默认波特率115200.
在串口正常通信的情况下,STM32F4与WIFI模块用标准AT命令进行通信,具体AT指令可以参考资料里面的AT指令集。
ONENET平台资料说明
打开材料准备中的ONENET平台资料,对里面的文件夹进行相关说明:
onenet资料\onenet开发板资料:这个文件夹中包含了ONENET平台的开发板例程,里面包含了很多连接的例程。

onenet资料\移植相关的文件:这个文件中包含了三部分:
(1)第一部分为onenet平台EDP连接示例代码;
(2)第二部分为自己修改的onenet平台EDP连接的模块化代码,因为原来的示例代码是stm32f103的,所以修改成stm32f407的代码,可以直接移植使用,可以自己对比第一部分来看有哪些修改的地方;
(3)第三部分为onenet平台EDP接入的协议文档,里面介绍了相关指令,数据帧的意义,可以参考着看。

onenet资料\移植相关的文件\dev:里面有两个文件夹,wifi文件夹中为驱动WIFI模块(ESP8266)的底层驱动代码;onenet为连接平台的相关应用代码。
基于单片机的智能冰箱系统
2021-05-23邓然邵鑫宇于剑光朱英坤
科学与生活订阅 2021年5期收藏
关键词:无线通信冰箱单片机
邓然 邵鑫宇 于剑光 朱英坤



摘要:互联网技术的日益发展带动了智能冰箱的市场占有率,家电接入物联网迈入高速市场化发展期,从而带有无线通信模块的智能家电迎来了发展期。智能冰箱能够进行不同模式间切换,自动适应不同环境,始终保持食物最佳储存状态,通过电脑或手机,可以对冰箱内食物数量、质量进行监控,为用户提供健康食谱,通过互联网进行网络下单补充食材,并能进行美食分享。本系统旨在设计一款智能冰箱系统,选用性能较高的STM32单片机进行系统搭建,使冰箱内环境参数恒定,可以通过智能化手段查看数据。利用DS18B20传感器实现对冷冻室温度测量。DHT11传感器实现对保鲜室内温湿度测量,可以通过屏幕查看当前温湿度。根据测量结果自动启动设备实现制冷,除霜。通过Wifi无线通信实现,终端设备查看数据。
关键词:冰箱;温度;单片机;无线通信
1绪论
1.1 课题研究的背景和意义
随着人们对智能新技术依赖和需求不断提高。智能家居成为了人们追求的目标。智能家居利用家庭住宅为平台,将目前多种成熟技术、智能化硬件、智能终端等进行应用,组建成一个智能化家居系统。在目前国家经济快速发展的同时,对于家居住宅节能减排、保护环境、绿色、低碳等要求下,智能家居控制设备所体现出的自身优越性,逐渐成为住宅行业未来发展追求的重点。
1.2 智能冰箱的研究现状
国外对智能家居的研究从1980年开始,到目前为止已经发展了三十多年,比中国起步早,大概经过了四次技术变化。
智能家居产品使用最多的是第三次智能家居技术,实现家中所有设备统一控制,不过第四次技术中使用IP技术,在一些发达国家已经开始研发,有相应的产品。
2013年4月,三星推出了一款名为T9000的智能冰箱,除了冰箱本身在外观上是四开门的设计外,最为吸引人眼球的是这款冰箱加载了安卓的系统,这款冰箱门上配备了一块10英寸的触摸屏,支持WiFi网络的连接,并且有自带的笔记应用程序Evernote
海信也在2012年11月份推出了博纳SMART智能冰箱,这款冰箱可以搭载物联云服务,引入全新的食品管理功能。2015年海尔公司发布“馨厨”互联网智能冰箱,自带10寸屏幕、立体声扬声器,通过此电子屏可以进行影音娱乐播放,生活咨询查询,以及网络交互等。
1.3 主要研究内容
基于单片机的智能电冰箱设计与实现,DS18B20温度传感器采集冰箱内冷冻室内温度,DHT11温湿度传感器采集冰箱冷藏室内温度和湿度,数据传送给STM32F103主控单元模块,OLED液晶显示数据。根据不同数据可以控制制冷设备和除霜设备,同时无线传输数据到终端设备显示,达到恒温恒湿的效果。
2 智能冰箱总方案设计
根据智能冰箱的特性可知,家居冰箱数据传输要求通信方式具有数据量小、传输距离比较近、节点多、安全系数高等特点,而无线通信具有自组网、多节点、低功耗、短延迟等特点,无疑是智能家居内部网络通信方式的最佳选择,所以在智能家居通信方式上采用WiFi等无线通讯方式相结合的形式。
2.1 系统分析
系统主要由以下部分组成:智能冰箱、远程服务器及智能移动终端(智能手机或PAD)。系统以STM32F103单片机为控制核心,利用DHTIl数字式温度传感器采集温度信号,并送入单片机处理后显示。然后把数据通过单片机的串口送入串口转Wi-Fi数据传输模块中,由该模块进行无线数据的收发。无线路由器进行中继和路由,远程服务器对收发的数据进行处理,并与智能移动终端进行通信,由智能移动终端对冰箱进行远程控制及远程状态显示。智能冰箱控制系统及无线系统结构框图如图2-1所示。
2.2 无线通信方案选择
本系统采用无线通信方式通信,将传感器采集到冰箱的数据经过无线方式传送到手机显示,同时通过此无线方式,进行控制。
2.2.2 Wifi
WiFi之所以能够风行全球,这与它的固有特性是分不开的,相比于其他无线通信技术,传输速度快、电力消耗非常低、无线链路更好的工作、高信号可靠性。采用wifi无线通信方式作为无线通信方案。
2.3 智能冰箱硬件选型
在智能冰箱系统的设计当中,硬件选择主要包括控制器芯片、温度传感器和WIFI芯片。同一个功能,可以选择不同的硬件,但是好的硬件对整个系统的稳定性、功耗和经济成本至关重要,因此,硬件的选择对于本研究方案至关重要。
2.3.1控制器芯片选择
该微处理器功能强大、价格低廉,工作电压在2~3.6V,具有多种省电模式,这保证了低功耗应用,工作环境温度在-40℃~+80℃/-40℃~+105℃,这显示了它可以在寒冬酷暑的季节稳定运行。
主要具有以下几种优势:
(1)成本低
(2)功能强大
(3)技术成熟
(4)功耗相对较低。
2.3.2冷藏室温湿度传感器选择
DHT11温湿度传感器也是一款含有已经校准的数字信号输出的温湿度传感器部分。具有的数字模块的采集技术与温湿度传感器的技术,保证了产品含有很好的可靠性与稳定性。这DHT11温湿度传感器如图2-3所示。
2.3.3冷冻室温度传感器选择
冷冻室需要对食品进行冷冻,所以需要选择一款量程适合低温检测的传感器。DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
2.3.4 Wifi模块选择
ATK-ESP8266是一款高性能串口-无线模块,它板载ESP8266模块,通过串口和主控芯片通讯,这样可以很方便和主控芯片进行连接,最终选取ATK-ESP8266作为系统的WiFi模块。
2.4 系统软件选型
在 STM32 主控芯片开发时采用的是Keil u Vision5 开发环境。它主要针对 ARM 处理器,特别是采用 ARM Cortex-M 作为内核的处理器。Keilu Vision5 可以兼容Keil u Vision4,并在Keil u Vision4 的基础上,加强了对 Cortex-M微控制器开发的支持,并且把传统的开发模式和界面分成了 MDK Core 和Software Packs 两部分。
经过方案讨论,最后制定了最终智能冰箱系统设计方案。硬件框图如图2-6所示。
3 系统软件设计
本文软件设计选择在STM32主控芯片开发时采用的是Keil u Vision5开发环境。采用JLINK仿真器进行研究。在进行系统设计的过程中应用了模块化的设计思路,也就是说系统中的各个环节由子函数的调用发挥作用。
3.1 软件总体设计
Keil u Vision5是keil公司2013年10月推出的一款主要针对使用u Vision5 IDE 集成开发工具,它主要针对ARM处理器,特别是采用ARM Cortex-M作为内核的处理器。
Keilu Vision5 可以兼容Keil u Vision4,并在Keil u Vision4 的基础上,加强了对Cortex-M微控制器开发的支持,并且把传统的开发模式和界面分成 MDK Core 和Software Packs 两部分。
JLINK仿真器是SEGGER公司推出的JTAG仿真器,主要是为支持仿真ARM内核芯片,能在KEIL、ADS等多种集成开发环境下支持大部分ARM系列内核的仿真。
4结论
本文设计一款简单实用价格低廉的智能冰箱系统。该系统采用STM32 作为硬件平台,配合嵌入式操作系统实现智能控制的基本功能。该系统不追求华丽外表,主要是价格低廉、简单实用,着眼于低端市场。本文设计了一种智能冰箱系统,该系统基于Wifi无线通信技术实现冰箱内食品环境温湿度信息采集、冷藏室和冷冻室等温度远程调节与监控、信息提示功能、数据存储等集控制和信息管理于一体,全方位全过程数据质控的成套设备及控制管理系统,具有安全可靠、能耗低、保鲜效果好、健康卫生等优点。
参考文献
[1]洪鑫,陈功.冰箱的网络智能化交互设计策略研究[J].机电产品开发与创新,2018,31(01):16-18+22.
[2]吕秀凤,焦其意,崔培培,高冬花.综述智能冰箱的发展现状[J]. 家电科技,2015,(11):24-25.
课题类别:黑龙江省教育科学“十四五”规划2021年度重点课题
课题名称:新工科背景下基于AIOT的物联网工程专业人才培养模式的探究
课题编号GJB1421618
哈尔滨华德学院 黑龙江哈尔滨 150028
深圳远嘉科技专注wifi模块生产研发。
新一代嵌入式串口WiFi模块TLN13UA06,体积小,功耗低。采用UART接口,内置IEEE802.11 协议栈以及TCP/IP协议栈,能够实现用户串口到无线网络之间的转换。
串口WiFi模块TLN13UA06支持串口透明数据传输模式并且具有安全多模能力,使传统串 口设备更好的加入无线网络。
串口WiFi模块TLN13UA06特点:
★功耗在3.3V时候,电流不到130MA,功耗最低
★大小只有2.0CMx3CM,体积最小
★双排(2 x 4)插针式接口
★支持波特率范围:1200bps~115200bps
★支持硬件RTS/CTS流控
★单3.3V供电
★支持IEEE802.11b/g无线标准
★支持频率范围:2.412~2.484 GHz
★支持3种无线网络类型:基础网(STA或AP)、自组网(Ad-hoc)
★支持多种安全加密及认证机制:
WEP64/WEP128/ TKIP/CCMP(AES)
OPEN/WPA-PSK/WPA2-PSK
★支持快速联网
★支持无线漫游
★支持节能模式
★支持多种网络协议:TCP/UDP/ICMP/DHCP/DNS/HTTP
★支持DHCP Server、DNS Server
★支持自动和命令两种工作模式
★支持串口透明传输模式
★支持AT+控制指令集
★支持多种参数配置方式:串口/WEB服务器/无线适配器。
Wifi模块的主要功能
第一.地址绑定:本模块支持在联网过程中绑定目的网络BSSID地址的功能。根据802.11协议规定,不同的无线网络可以具有相同的网络名称(也就是SSID/ESSID),但是必须对应一个唯一的BSSID 地址。非法入侵者可以通过建立具有相同的SSID/ESSID的无线网络的方法,使得网络中的STA联接到非法的AP上,从而造成网络的泄密。通过BSSID地址绑定的方式,可以防止STA 接入到非法的网络,从而提高无线网络的安全性。
第二.无线漫游:本模块支持基于802.11协议的无线漫游功能。无线漫游指的是为了扩大一个无线网络的覆盖范围,由多个AP共同创建一个具有相同的SSID/ESSID的无线网络,每个AP用来覆盖不同的区域,接入到该网络的STA可以根据所处位置的不同选择一个最近(即信号最强)的AP来接入,而且随着STA的移动自动的在不同的AP之间切换。
第三. 灵活的参数配置: 基于串口连接,使用配置管理程序 ;基于串口连接,使用Windows下的超级终端程序 ;基于网络连接,使用IE浏览器程序; 基于无线连接,使用配置管理程序。
第四.基础网,是由AP创建,众多STA加入所组成的无线网络,这种类型的网络的特点是AP是整个网络的中心,网络中所有的通信都通过AP来转发完成
第五.自组网,是仅由两个及以上STA自己组成,网络中不存在AP,这种类型的网络是一种松散的结构,网络中所有的STA都可以直接通信。
第六. 安全机制,支持不同的安全模式,包括:WEP64/WEP128/ TKIP/CCMP(AES) WEP/WPA-PSK/WPA2-PSK。
第七.快速联网:本模块支持通过指定信道号的方式来进行快速联网。在通常的无线联网过程中,会首先对当前的所有信道自动进行一次扫描,来搜索准备连接的目的AP创建的(或Adhoc)网络。串口wifi模块提供了设置工作信道的参数,在已知目的网络所在信道的条件下,可以直接指定模块的工作信道,从而达到加快联网速度的目的.。希望对你有帮助!!
详细资料可以追问!
串口WiFi模块是由具备WiFi外设的ARM组成的系统,它们上电后会启动自己的系统然后等待与你的单片机进行串口通信,主动权还是掌握在你的单片机上,远程控制甚至是远程升级都是单片机自己实现的功能。
串口WiFi模块你可以看成是单片机的串口扩展,就是一个具有WiFi无线传输功能的串口而已,连接只需要按模块需求连接串口各条信号线即可。有的WiFi模块还允许你使用模块上现有的ARM资源,你可以节省单片机,将自己的程序直接运行在该模块上。
1.WIFI板块+秉火STM32MINI板
2.通过APP控制WIFI板块串口输出“ONA”,“ONB”,“ONF”,MINI板接收,控制电平转换以控制电机正转,反转,停止
现在问题是程序烧好了,发送端(WIFI串口输出)也没问题了,但是不知道程序问题出在哪?
3.附上程序:
#include "stm32f10x_lib.h"
#include "stdio.h"
#include "stm32f10x_it.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);
void delay_nms(u16 time);
void TIM4_Configuration(void);
void SendCom_Juge(void);
void TIM3_Configuration(void);
char instruct[5],j;
u8 Recv_Comp;
u16 Rev=4000;//转速
/*******************************************************************************
* 函数名 : main
* 函数描述 : Main 函数
*******************************************************************************/
int main(void)
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
USART_Configuration();
TIM4_Configuration();
TIM3_Configuration();
while(1)
delay_nms(30);
SendCom_Juge();
void delay_nms(u16 time)
u16 i=0;
while(time--)
i=12000; //自己定义
while(i--) ;
/*******************************************************************************
* 函数名 : NVIC_Configuration
*******************************************************************************/
void NVIC_Configuration(void)
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);/* Set the Vector Table base location at 0x20000000 */
#else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel ; //通道设置为串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占先等级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //中断响应优先级0,赋予高的优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断
NVIC_Init(NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel; /*TIM3中断*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*先占优先级0级*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; /*从优先级3级*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*IRQ通道被使能*/
NVIC_Init(NVIC_InitStructure);
/*******************************************************************************
* 函数名 : USART_Configuration
*******************************************************************************/
void USART_Configuration(void)
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2 , USART_InitStructure);
USART_Cmd(USART2 , ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //一定要开启串口接收中断
USART_ClearFlag(USART2,USART_FLAG_TC); //发送完成标志位
/*******************************************************************************
* 函数名 : RCC_Configuration
* 函数描述 : 设置系统各部分时钟
*******************************************************************************/
void RCC_Configuration(void)
ErrorStatus HSEStartUpStatus; /* 定义枚举类型变量 HSEStartUpStatus */
RCC_DeInit(); /* 复位系统时钟设置*/
RCC_HSEConfig(RCC_HSE_ON); /* 开启HSE*/
HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* 等待HSE起振并稳定*/
if(HSEStartUpStatus == SUCCESS) /* 判断HSE起是否振成功,是则进入if()内部 */
RCC_HCLKConfig(RCC_SYSCLK_Div1); /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1); /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK1Config(RCC_HCLK_Div2); /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
FLASH_SetLatency(FLASH_Latency_2); /* 设置FLASH延时周期数为2 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 使能FLASH预取缓存 */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
RCC_PLLCmd(ENABLE); /* 使能PLL */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); /* 等待PLL输出稳定 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* 选择SYSCLK时钟源为PLL */
while(RCC_GetSYSCLKSource() != 0x08); /* 等待PLL成为SYSCLK时钟源 */
/* 打开APB2总线上的GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM3|RCC_APB1Periph_USART2 , ENABLE ); //
/*******************************************************************************
* 函数名 : GPIO_Configuration
* 函数描述 : 设置各GPIO端口功能
*******************************************************************************/
void GPIO_Configuration(void)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /* 设置USART2的Tx脚(PA.2)为第二功能推挽输出模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; /* 设置USART2的Rx脚(PA.3)为浮空输入脚 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA , GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//脉冲
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;;
GPIO_Init(GPIOA , GPIO_InitStructure);
void TIM3_Configuration(void)
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/* 定义 TIM_TimeBase 初始化结构体 TIM_TimeBaseStructure */
TIM_OCInitTypeDef TIM_OCInitStructure; /* 定义 TIM_OCInit 初始化结构体 TIM_OCInitStructure */
TIM_TimeBaseStructure.TIM_Period = 4600; //15KHZ 计数重载值
TIM_TimeBaseStructure.TIM_Prescaler = 0;// 预分频值为(0+ 1 = 1)
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割0
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM3 , TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 工作模式为 PWM 输出模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = Rev;//
TIM_OC2Init(TIM3, TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3 , TIM_OCPreload_Enable); /* 使能预装载寄存器 */
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_Cmd(TIM3 , ENABLE); /* 启动 TIM 计数 */
int fputc(int ch, FILE *f)
USART_SendData(USART2, (u8) ch);
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
return ch;
void TIM4_Configuration(void)
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 4;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
TIM_ARRPreloadConfig(TIM4, DISABLE);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
void SendCom_Juge(void)
if(Recv_Comp==1)
Recv_Comp=0;
j=0;
if((instruct[0] == 'O') (instruct[1] == 'N') (instruct[2] == 'A'))
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
if((instruct[0] == 'O') (instruct[1] == 'N') (instruct[2] == 'B'))
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
if((instruct[0] == 'O') (instruct[1] == 'N') (instruct[2] == 'F'))
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
本文标签:stm32f103wifi方案