基于单片机 STM32 的智能家居安防系统设计(程序+原理图+APP)

资料包括源代码,原理图,pcb,app设计资料,元器件清单,参考说明书(2w字)等等,  

基于单片机 STM32 的智能家居安防系统设计

摘要:本文设计并实现了一种基于 STM32 单片机的智能家居安防系统。该系统集成了密码锁、温湿度采集、煤气烟雾检测、火灾报警、人体红外或门磁防盗报警、远程照明控制、实时时钟显示、OLED 显示、WiFi 通信手机 APP 远程监控、APP 远程修改设备时间以及本地蜂鸣器报警和远程监控等多种功能。通过 STM32 单片机的强大处理能力和丰富的外设资源,实现了对家居环境的全面监控和智能管理,提高了家居安全性和便利性。

关键词:STM32 单片机;智能家居安防系统;密码锁;温湿度采集;煤气烟雾检测;火灾报警;远程监控

一、引言

随着人们生活水平的提高和科技的发展,智能家居安防系统逐渐受到人们的关注。传统的家居安防系统存在功能单一、操作复杂、缺乏智能化管理等问题,无法满足现代家庭对安全、便捷、智能的需求。因此,设计一种基于单片机 STM32 的智能家居安防系统具有重要意义。该系统集成了多种安防功能,通过 STM32 单片机的控制,实现了对家居环境的全面监控和智能管理,提高了家居安全性和便利性。

二、系统总体设计

2.1 系统功能概述

本系统旨在实现以下功能:

  1. 密码锁:确保家居安全,只有输入正确密码才能进入。
  2. 温湿度采集:实时监测室内温湿度,提供舒适的居住环境。
  3. 煤气烟雾检测:一旦检测到煤气或烟雾,立即触发报警。
  4. 火灾报警:发现火灾隐患,及时通知用户并启动报警系统。
  5. 人体红外或门磁防盗报警:通过人体红外或门磁传感器,预防非法入侵。
  6. 远程照明控制:通过手机 APP 远程控制灯光,方便实用。
  7. 实时时钟显示:精确显示当前时间,方便用户查看。
  8. OLED 显示:清晰展示系统状态和相关信息。
  9. WiFi 通信手机 APP 远程监控:通过 WiFi 和手机 APP,实现远程监控和操作。
  10. APP 可远程修改设备时间:方便用户调整设备时间,确保准确性。
  11. 支持本地蜂鸣器报警和远程监控:一旦触发报警,本地和远程都能收到通知。

2.2 系统总体框图

系统总体框图如图 1 所示。系统主要由 STM32 单片机、密码锁模块、温湿度传感器、煤气烟雾传感器、火灾传感器、人体红外传感器、门磁传感器、照明控制模块、实时时钟模块、OLED 显示模块、WiFi 模块、蜂鸣器报警模块等组成。

<img src="https://via.placeholder.com/600x400" />

图 1 系统总体框图

三、硬件设计

3.1 STM32 单片机

本系统选用 STM32F103C8T6 单片机作为主控芯片。该单片机基于 ARM Cortex-M3 内核,具有 64KB 的闪存、20KB 的 SRAM、丰富的外设接口和强大的数据处理能力,能够满足系统的控制需求。

3.2 密码锁模块

密码锁模块采用矩阵键盘输入密码,通过 STM32 单片机读取键盘输入,并与预设密码进行比对。如果密码正确,则解锁;如果密码错误,则触发报警。

3.3 温湿度传感器

温湿度传感器选用 DHT11 数字式温湿度传感器。该传感器能够同时测量环境的温度和湿度,并通过单总线与 STM32 单片机通信。STM32 单片机通过读取 DHT11 传感器的数据,获取当前的温湿度信息。

3.4 煤气烟雾传感器

煤气烟雾传感器选用 MQ-2 传感器。该传感器对煤气、烟雾等有害气体具有较高的灵敏度,能够实时检测环境中的有害气体浓度。当浓度超过设定阈值时,传感器输出高电平信号,触发报警。

3.5 火灾传感器

火灾传感器选用烟雾传感器和温度传感器相结合的方式。烟雾传感器采用光电烟雾传感器,能够检测空气中的烟雾浓度;温度传感器采用热敏电阻,能够检测环境的温度。当烟雾浓度或温度超过设定阈值时,触发火灾报警。

3.6 人体红外传感器和门磁传感器

人体红外传感器选用热释电红外传感器,能够检测人体的红外辐射,用于防盗报警。门磁传感器安装在门窗上,当门窗被非法打开时,传感器输出信号,触发报警。

3.7 照明控制模块

照明控制模块采用继电器控制灯光的开关。STM32 单片机通过控制继电器的通断,实现对灯光的远程控制。

3.8 实时时钟模块

实时时钟模块选用 DS1302 时钟芯片。该芯片具有高精度、低功耗、接口简单等特点,能够为系统提供准确的时间信息。

3.9 OLED 显示模块

OLED 显示模块选用 0.96 英寸的 OLED 显示屏。该显示屏具有自发光、对比度高、视角广等特点,能够清晰地显示系统状态和相关信息。

3.10 WiFi 模块

WiFi 模块选用 ESP8266 模块。该模块具有体积小、功耗低、易于集成等特点,能够实现系统与手机 APP 的无线通信。

3.11 蜂鸣器报警模块

蜂鸣器报警模块采用有源蜂鸣器。当系统触发报警时,STM32 单片机控制蜂鸣器发出警报声,提醒用户注意。

四、软件设计

4.1 软件总体流程

软件设计主要包括主程序、初始化程序、传感器数据采集程序、密码锁程序、报警程序、照明控制程序、时钟显示程序、OLED 显示程序、WiFi 通信程序等。主程序负责初始化系统、循环检测传感器数据、调用各子程序;初始化程序设置系统参数;传感器数据采集程序采集温湿度、煤气烟雾、火灾等传感器数据;密码锁程序处理密码输入和比对;报警程序根据传感器数据和密码锁状态触发报警;照明控制程序控制灯光的开关;时钟显示程序显示当前时间;OLED 显示程序显示系统状态和相关信息;WiFi 通信程序实现系统与手机 APP 的通信。

4.2 初始化程序

初始化程序包括系统时钟初始化、GPIO 初始化、ADC 初始化、USART 初始化、I2C 初始化、SPI 初始化等。系统时钟初始化设置 STM32 单片机的主频;GPIO 初始化将连接传感器、继电器、OLED 显示屏、WiFi 模块的 GPIO 口设置为相应的输入或输出模式;ADC 初始化设置 ADC 的通道、采样频率等参数;USART 初始化设置 USART 的波特率、数据位、停止位等参数;I2C 初始化设置 I2C 接口的时钟频率、地址等参数;SPI 初始化设置 SPI 接口的时钟频率、数据格式等参数。

4.3 传感器数据采集程序

传感器数据采集程序包括温湿度传感器数据采集、煤气烟雾传感器数据采集、火灾传感器数据采集、人体红外传感器数据采集和门磁传感器数据采集等。通过调用相应的传感器驱动程序,读取传感器的数据,并进行处理和存储。

4.4 密码锁程序

密码锁程序负责处理密码输入和比对。当用户输入密码时,程序读取矩阵键盘的输入,并与预设密码进行比对。如果密码正确,则解锁;如果密码错误,则触发报警,并限制输入次数。

4.5 报警程序

报警程序根据传感器数据和密码锁状态触发报警。当煤气烟雾传感器、火灾传感器、人体红外传感器或门磁传感器检测到异常情况时,或者密码锁输入错误次数超过限制时,程序触发报警。报警方式包括本地蜂鸣器报警和远程 APP 通知。

4.6 照明控制程序

照明控制程序负责控制灯光的开关。程序通过控制继电器的通断,实现对灯光的远程控制。用户可以通过手机 APP 或系统按键控制灯光的开关。

4.7 时钟显示程序

时钟显示程序负责显示当前时间。程序通过读取 DS1302 时钟芯片的数据,获取当前时间信息,并通过 OLED 显示屏进行显示。

4.8 OLED 显示程序

OLED 显示程序负责显示系统状态和相关信息。程序将采集到的传感器数据、密码锁状态、时间信息等转换为字符串格式,并通过 I2C 接口发送到 OLED 显示屏进行显示。

4.9 WiFi 通信程序

WiFi 通信程序实现系统与手机 APP 的通信。程序通过 ESP8266 模块与手机 APP 建立连接,接收手机 APP 发送的控制指令,并将系统的状态信息发送给手机 APP。控制指令包括照明控制、密码锁控制、设备时间修改等。

五、系统详细功能实现

5.1 密码锁功能实现

系统上电后,初始化密码锁模块和 OLED 显示模块。当用户输入密码时,密码锁程序读取矩阵键盘的输入,并与预设密码进行比对。如果密码正确,则解锁,并在 OLED 显示屏上显示“解锁成功”;如果密码错误,则触发报警,并在 OLED 显示屏上显示“密码错误”。同时,限制输入次数,当输入错误次数超过限制时,锁定键盘一段时间。

5.2 温湿度采集功能实现

系统上电后,初始化 DHT11 温湿度传感器和 OLED 显示模块。在主程序的循环中,不断调用 DHT11 温湿度传感器数据采集程序,采集室内的温湿度数据。采集到的数据通过 OLED 显示程序显示到 OLED 显示屏上,方便用户实时了解室内的温湿度状况。

5.3 煤气烟雾检测功能实现

系统上电后,初始化 MQ-2 煤气烟雾传感器和蜂鸣器报警模块。在主程序的循环中,不断调用 MQ-2 传感器数据采集程序,采集环境中的煤气烟雾浓度数据。当浓度超过设定阈值时,触发报警程序,控制蜂鸣器发出警报声,并在 OLED 显示屏上显示“煤气烟雾报警”。

5.4 火灾报警功能实现

系统上电后,初始化烟雾传感器、温度传感器和蜂鸣器报警模块。在主程序的循环中,不断调用烟雾传感器和温度传感器数据采集程序,采集环境中的烟雾浓度和温度数据。当烟雾浓度或温度超过设定阈值时,触发报警程序,控制蜂鸣器发出警报声,并在 OLED 显示屏上显示“火灾报警”。

5.5 人体红外或门磁防盗报警功能实现

系统上电后,初始化人体红外传感器、门磁传感器和蜂鸣器报警模块。在主程序的循环中,不断调用人体红外传感器和门磁传感器数据采集程序,检测是否有人体移动或门窗被非法打开。当检测到异常情况时,触发报警程序,控制蜂鸣器发出警报声,并在 OLED 显示屏上显示“防盗报警”。

5.6 远程照明控制功能实现

系统上电后,初始化照明控制模块、WiFi 模块和手机 APP。用户可以通过手机 APP 发送照明控制指令,WiFi 模块接收到指令后,通过 USART 接口发送给 STM32 单片机。STM32 单片机解析指令后,控制照明控制模块的继电器通断,实现对灯光的远程控制。同时,OLED 显示屏显示当前的灯光状态。

5.7 实时时钟显示功能实现

系统上电后,初始化 DS1302 时钟芯片和 OLED 显示模块。在主程序的循环中,不断调用 DS1302 时钟芯片数据读取程序,获取当前时间信息。获取到的时间信息通过 OLED 显示程序显示到 OLED 显示屏上,方便用户实时查看当前时间。

5.8 OLED 显示功能实现

OLED 显示功能通过 OLED 显示程序实现。程序将采集到的传感器数据、密码锁状态、时间信息等转换为字符串格式,并通过 I2C 接口发送到 OLED 显示屏进行显示。OLED 显示屏能够清晰地显示系统状态和相关信息,方便用户了解系统的运行状态。

5.9 WiFi 通信手机 APP 远程监控功能实现

WiFi 通信手机 APP 远程监控功能通过 WiFi 通信程序实现。程序通过 ESP8266 模块与手机 APP 建立连接,接收手机 APP 发送的控制指令,并将系统的状态信息发送给手机 APP。用户可以通过手机 APP 远程监控系统的运行状态,如温湿度、煤气烟雾浓度、火灾情况、防盗情况等,并可以发送控制指令对系统进行远程操作,如照明控制、密码锁控制等。

5.10 APP 可远程修改设备时间功能实现

APP 可远程修改设备时间功能通过 WiFi 通信程序实现。用户可以通过手机 APP 发送设备时间修改指令,WiFi 模块接收到指令后,通过 USART 接口发送给 STM32 单片机。STM32 单片机解析指令后,调用 DS1302 时钟芯片的时间设置程序,修改设备的当前时间。修改完成后,OLED 显示屏显示新的时间信息。

5.11 支持本地蜂鸣器报警和远程监控功能实现

支持本地蜂鸣器报警和远程监控功能通过报警程序和 WiFi 通信程序实现。当系统触发报警时,报警程序控制蜂鸣器发出警报声,并在 OLED 显示屏上显示报警信息。同时,WiFi 通信程序将报警信息发送给手机 APP,方便用户远程了解报警情况。用户可以通过手机 APP 查看报警信息,并采取相应的措施。

六、系统测试与优化

6.1 系统测试

在实际硬件电路上进行系统测试,检查智能家居安防系统的各项功能是否正常。测试内容包括密码锁功能、温湿度采集功能、煤气烟雾检测功能、火灾报警功能、人体红外或门磁防盗报警功能、远程照明控制功能、实时时钟显示功能、OLED 显示功能、WiFi 通信手机 APP 远程监控功能、APP 可远程修改设备时间功能以及支持本地蜂鸣器报警和远程监控功能等。

6.2 问题分析与解决

在测试过程中,可能会遇到一些问题,如传感器数据不准确、密码锁解锁失败、报警误触发、照明控制失灵、WiFi 通信不稳定等。针对这些问题,进行详细的分析,找出问题的原因,并采取相应的解决措施。例如,如果传感器数据不准确,可能是传感器校准不准确或信号干扰导致,需要重新校准传感器或增加滤波措施;如果密码锁解锁失败,可能是键盘输入错误或密码比对程序错误导致,需要检查键盘输入和密码比对程序;如果报警误触发,可能是传感器阈值设置不合理或报警程序逻辑错误导致,需要调整传感器阈值或修改报警程序逻辑。

6.3 系统优化

为了提高系统的性能和稳定性,对系统进行优化。例如,优化传感器数据采集算法,提高数据采集的精度和速度;优化密码锁算法,提高密码比对的准确性和安全性;优化报警算法,减少误触发的概率;优化照明控制算法,提高照明控制的精准度和稳定性;优化 WiFi 通信程序,提高通信的稳定性和可靠性。

七、结论

本文设计并实现了一种基于单片机 STM32 的智能家居安防系统。该系统集成了密码锁、温湿度采集、煤气烟雾检测、火灾报警、人体红外或门磁防盗报警、远程照明控制、实时时钟显示、OLED 显示、WiFi 通信手机 APP 远程监控、APP 可远程修改设备时间以及支持本地蜂鸣器报警和远程监控等多种功能。经过系统测试和优化,该系统具有较高的准确性和稳定性,能够满足智能家居安防的需求。通过 STM32 单片机的控制,实现了对家居环境的全面监控和智能管理,提高了家居安全性和便利性。

八、展望

未来的研究可以进一步拓展该智能家居安防系统的功能,如增加视频监控功能、智能语音识别功能、环境自适应控制功能等。同时,可以提高系统的集成度和可靠性,降低成本,使智能家居安防系统具有更广泛的应用前景。此外,还可以将该系统与物联网技术相结合,实现与其他智能家居设备的互联互通,为智能家居的发展提供更加有力的支持。

#include "stm32f10x.h"
#include "usart3.h"
#include "esp8266.h"
#include "delay.h"
#include <string.h>
#include <stdio.h>

#define  ESP8266_BUF         Usart3RecBuf 
#define  ESP8266_CNT         Rx3Counter
#define  STM32_RX1BUFF_SIZE  USART3_RXBUFF_SIZE

unsigned short esp8266_cntPre = 0;

//==========================================================
//	函数名称:	ESP8266_Clear
//
//	函数功能:	清空缓存
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:	
//==========================================================
void ESP8266_Clear(void)
{
	memset(ESP8266_BUF, 0, sizeof(ESP8266_BUF));
	ESP8266_CNT = 0;
}

//==========================================================
//	函数名称:	ESP8266_WaitRecive
//
//	函数功能:	等待接收完成
//
//	入口参数:	无
//
//	返回参数:	REV_OK-接收完成		REV_WAIT-接收超时未完成
//
//	说明:		循环调用检测是否接收完成
//==========================================================
_Bool ESP8266_WaitRecive(void)
{
	if(ESP8266_CNT == 0) 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
		return REV_WAIT;
		
	if(ESP8266_CNT == esp8266_cntPre)				//如果上一次的值和这次相同,则说明接收完毕
	{
		ESP8266_CNT = 0;							//清0接收计数
			
		return REV_OK;								//返回接收完成标志
	}
		
	esp8266_cntPre = ESP8266_CNT;					//置为相同
	
	return REV_WAIT;								//返回接收未完成标志
}

//==========================================================
//	函数名称:	ESP8266_SendCmd
//
//	函数功能:	发送命令
//
//	入口参数:	cmd:命令
//				res:需要检查的返回指令
//
//	返回参数:	0-成功	1-失败
//
//	说明:		
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res, u16 time)
{	
  uart3_send((unsigned char *)cmd,strlen((const char *)cmd));
	
	while(time--)
	{
		if(ESP8266_WaitRecive() == REV_OK)							//如果收到数据
		{
			if(strstr((const char *)ESP8266_BUF, res) != NULL)		//如果检索到关键词
			{
				ESP8266_Clear();									//清空缓存
				
				return 0;
			}
		}
		
		delay_ms(1);
	}
	
	return 1;

}

//==========================================================
//	函数名称:	ESP8266_SendData
//
//	函数功能:	发送数据
//
//	入口参数:	data:数据
//				len:长度
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_SendData(unsigned char *data, unsigned short len)
{

	char cmdBuf[32];
	
	ESP8266_Clear();								//清空接收缓存
	sprintf(cmdBuf, "AT+CIPSEND=0,%d\r\n", len);		//发送命令
	if(!ESP8266_SendCmd(cmdBuf, ">", 200))				//收到‘>’时可以发送数据
	{
			uart3_send(data , len);         //发送设备连接请求数据
	}
}

//==========================================================
//	函数名称:	ESP8266_GetIPD
//
//	函数功能:	获取平台返回的数据
//
//	入口参数:	等待的时间(乘以10ms)
//
//	返回参数:	平台返回的原始数据
//
//	说明:		不同网络设备返回的格式不同,需要去调试
//				如ESP8266的返回格式为	"+IPD,x:yyy"	x代表数据长度,yyy是数据内容
//==========================================================
unsigned char *ESP8266_GetIPD(unsigned short timeOut)
{

	char *ptrIPD  = NULL;
	char *CONNECT = NULL;
	
	do
	{
		if(ESP8266_WaitRecive() == REV_OK)								//如果接收完成
		{
			ptrIPD = strstr((char *)ESP8266_BUF, "IPD,");				//搜索“IPD”头
			if(ptrIPD == NULL)											//如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
			{
				//printf("\"IPD\" not found\r\n");
			}
			else
			{
				ptrIPD = strchr(ptrIPD, ':');							//找到':'
				if(ptrIPD != NULL)
				{
					ptrIPD++;
					return (unsigned char *)(ptrIPD);
				}
				else
					return NULL;
				
			}
			CONNECT = strstr((char *)ESP8266_BUF, "0,CONNECT");	
			if(CONNECT != NULL)
			{
					CONNECT++;
					return (unsigned char *)(CONNECT);
			}
		}
		delay_ms(5);													//延时等待
	} while(timeOut--);
	
	return NULL;														//超时还未找到,返回空指针

}

//==========================================================
//	函数名称:	ESP8266_Init
//
//	函数功能:	初始化ESP8266
//
//	入口参数:	无
//
//	返回参数:	无
//
//	说明:		
//==========================================================
void ESP8266_Init(void)
{
	USART3_Init(115200);   //串口初始化
	
	ESP8266_Clear();
}


//*************************云平台代码***********************//
char device_data[128];
uint8_t SmartConfig = 0;							//配网标志位
uint8_t wifi_status;									//wifi状态标志位
uint16_t time_flag_1ms;

char *ESP8266_GetRece(void)
{
	return ESP8266_BUF;
}
//==========================================================
//	函数名称:	Esp8266LinkloTExplorer
//	函数功能:	连接阿里云,并且订阅主题
//	入口参数:	无
//	返回参数:	无
//==========================================================
void ESP8266LinkloT(void)
{
  char send_buf[512];
  //发送客户端ID、用户名、密码
  sprintf(send_buf,"AT+MQTTUSERCFG=0,1,\"NULL\",\"%s&%s\",\"%s\",1,1,\"\"\r\n",DeviceName,ProductKey,Password);			
	ESP8266_SendCmd(send_buf, "OK",200);
	delay_ms(500);
  //发送客户端ID
  sprintf(send_buf,"AT+MQTTCLIENTID=0,\"%s\"\r\n",ClientId);			
	ESP8266_SendCmd(send_buf, "OK",200);
	delay_ms(500);
  //连接MQTT阿里云服务器
	sprintf(send_buf,"AT+MQTTCONN=0,\"%s\",%s,1\r\n",mqttHostUrl,port);																			 
	ESP8266_SendCmd(send_buf, "OK",200);
		delay_ms(500);
	//订阅主题
	sprintf(send_buf,"AT+MQTTSUB=0,\"/sys/%s/%s/ting/servic/property/set\",1\r\n",ProductKey,DeviceName);	
	ESP8266_SendCmd(send_buf, "OK",200);
		delay_ms(500);
	
}

//==========================================================
//	函数名称:	ESP8266_Status
//	函数功能:	ESP8266状态判断
//	入口参数:	无
//	返回参数:	0-连接状态     1-断开状态
//AT+CIPSTA_CUR?
//+CIPSTA_CUR:ip:"192.168.2.12"
//+CIPSTA_CUR:gateway:"192.168.2.1"
//+CIPSTA_CUR:netmask:"255.255.255.0"
//OK
//==========================================================
_Bool ESP8266_Status(void)
{
	unsigned int timeOut;
	char *Status;
	/* IP查询 */
	uart3_send((unsigned char *)"AT+CIPSTA?\r\n", strlen((const char *)"AT+CIPSTA?\r\n"));
	timeOut = 50;
	while(timeOut--)
	{
		if(ESP8266_WaitRecive() == REV_OK)							//如果收到数据
		{
			if(strstr((const char *)ESP8266_BUF, "OK") != NULL)		//如果检索到关键词
			{
				Status = strstr((const char *)ESP8266_BUF, "ip:");
				if(*(Status+4)!='0')
				{
					ESP8266_Clear();									//清空缓存
					return 0;
				}
				else
				{
					ESP8266_Clear();									//清空缓存
					return 1;
				}
			}
		}
		delay_ms(10);
	}
	ESP8266_Clear();
	return 1;
}

//==========================================================
//	函数名称:	ESP8266_Get_Time
//	函数功能:	获取网络时间
//	入口参数:	无
//	返回参数:	无
//==========================================================
Time_Get ESP8266_Get_Time(void)
{
	unsigned short timeOut;
	char *Start;
	Time_Get Time;
	
	uart3_send((unsigned char *)"AT+CIPSNTPTIME?\r\n", strlen((const char *)"AT+CIPSNTPTIME?\r\n"));
	timeOut = 2000;
	while(timeOut--)
	{
		if(ESP8266_WaitRecive() == REV_OK)							//如果收到数据
		{
			if(strstr((const char *)ESP8266_BUF, "OK") != NULL)		//如果检索到关键词
			{
				Start = strstr((const char *)ESP8266_BUF, "TIME:") + 5;
				
				if(strstr(Start, "Mon") != NULL)				//星期获取
					Time.week = 1;
				else if(strstr(Start, "Tue") != NULL)
					Time.week = 2;
				else if(strstr(Start, "Wed") != NULL)
					Time.week = 3;
				else if(strstr(Start, "Thu") != NULL)
					Time.week = 4;
				else if(strstr(Start, "Fri") != NULL)
					Time.week = 5;
				else if(strstr(Start, "Sat") != NULL)
					Time.week = 6;
				else if(strstr(Start, "Sun") != NULL)
					Time.week = 7;
				
				if(strstr(Start, "Jan") != NULL)				//月份获取
					Time.month = 1;
				else if(strstr(Start, "Feb") != NULL)
					Time.month = 2;
				else if(strstr(Start, "Mar") != NULL)
					Time.month = 3;
				else if(strstr(Start, "Apr") != NULL)
					Time.month = 4;
				else if(strstr(Start, "May") != NULL)
					Time.month = 5;
				else if(strstr(Start, "Jun") != NULL)
					Time.month = 6;
				else if(strstr(Start, "Jul") != NULL)
					Time.month = 7;
				else if(strstr(Start, "Aug") != NULL)
					Time.month = 8;
				else if(strstr(Start, "Sep") != NULL)
					Time.month = 9;
				else if(strstr(Start, "Oct") != NULL)
					Time.month = 10;
				else if(strstr(Start, "Nov") != NULL)
					Time.month = 11;
				else if(strstr(Start, "Dec") != NULL)
					Time.month = 12;
				
				Start = strstr(Start, " ") + 1;		//月份首地址
				Start = strstr(Start, " ") + 1;		//日期首地址
				if(*Start==' ')
				{
				  Start = strstr(Start, " ") + 1;		//日期首地址
				  Time.day = (*Start-'0');		//获取日期
				}
				else
				{
				  Time.day = (*Start-'0')*10 + (*(Start+1)-'0');		//获取日期
				}
				Start = strstr(Start, " ") + 1;		//小时首地址
				Time.hour = (*Start-'0')*10 + (*(Start+1)-'0');		//获取小时
				Start = strstr(Start, ":") + 1;		//分钟首地址
				Time.minute = (*Start-'0')*10 + (*(Start+1)-'0');		//获取分钟
				Start = strstr(Start, ":") + 1;		//秒首地址
				Time.second = (*Start-'0')*10 + (*(Start+1)-'0');		//获取秒
				Start = strstr(Start, " ") + 1;		//年首地址
				Time.year = (*Start-'0')*1000 + (*(Start+1)-'0')*100 + (*(Start+2)-'0')*10 + (*(Start+3)-'0');//获取年
				
				ESP8266_Clear();									//清空缓存
				break;
			}
		}
		
		delay_ms(10);
	}
	return Time;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科创工作室li

你的鼓励将是大学生的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值