ESP8266获取网络时间 实时时钟

这篇具有很好参考价值的文章主要介绍了ESP8266获取网络时间 实时时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

程序现象

esp8266获取时间,STM32,物联网,嵌入式硬件,stm32,单片机

 

一、用串口调试助手调试

1.发送指令AT+RST重启模块使应用模式更改生效;

2.发送指令ATE0取消回显

3.使用串口发送指令AT+CWMODE=1设置模块Wi-Fi应用模式为Station模式;

4.发送指令AT+CWJAP ="ssid","pwd"连接AP;

5.发送指令AT+CIPMUX=0设置模块为单路连接模式,模块默认为单路连接模式;

6.发送指令AT+CIPSTART="TCP","api.k780.com",80 与服务器建立TCP连接 ;

7.发送指令AT+CIPMODE=1设置模块传输模式为透传模式;

8.发送指令AT+CIPSEND开启透传模式向服务器发送数据,模块收到此指令后先换行后返回“>”

9.剩下只需要发送 GET http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1\r\n,就能获取到年月时间。      (调用一个网络API接口,这个接口会返回标准网络时间)

esp8266获取时间,STM32,物联网,嵌入式硬件,stm32,单片机

 可以看到发送完第九条指令后会收到如上图,所以整体思路:用串口进行通信,发送AT指令,获取到的数据存在Buf中,然后对Buf中的数据解析。获取timestamp后为时间戳,获取datetime_1后为日期时间。

USART串口模块

这一部分的初始化和之前一样,串口接收部分要进行判断如果接收到 '>' ,用Flag标记表示后面调用API后会收到时间戳和时间等数据。

#include "stm32f10x.h"                  // Device header
#include "MyUSART.h"
#include "esp.h"
#include <string.h>

char Buf[512];
unsigned char i;
uint8_t Flag;


void MyUSART_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 ,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;                
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;              
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_Parity =USART_Parity_No ;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init (USART1,&USART_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	USART_Cmd(USART1,ENABLE);
	
}
void MyUSART_SendString(char* str)
{
	uint8_t stri=0;
	while(str[stri] != '\0')
		USART_SendData (USART1,str[stri++]);
}
void USART1_IRQHandler()
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE))
	{
		Buf[i++]=USART_ReceiveData(USART1);
		if(Buf[i-1] == '>')
		{
			Flag=1;
		}
		else if((Buf[i-2]=='\r')&&(Buf[i-1]=='\n'))  
		{
			Buf[i-2]='\0';
			i = 0;
		}
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
}

ESP8266WIFI模块

这一部分初始化操作发送AT指令,在主函数中根据返回的数字可以判断哪里有问题

Comman_Rec()这个函数用来处理Buf中接收到的数据。

#include "stm32f10x.h"                  // Device header
#include "MyUSART.h"
#include <stdio.h>
#include <string.h>
#include "Delay.h"
#include "OLED.H"
#include <stdlib.h>

extern char Buf[512];
const char* WIFI ="GT";
const char* PASS="123456789";
extern uint8_t Flag;
uint32_t timestamp_cnt;
char subdatetime_1[11]; 
char subdatetime_2[8];
uint32_t temp = 2;

int fputc(int ch,FILE *f )   //printf重定向  
{
	USART_SendData(USART1,(uint8_t)ch);
	while(USART_GetFlagStatus (USART1,USART_FLAG_TC) == RESET);
	return ch;
}
char esp_Init(void)
{

	memset(Buf,0,sizeof(Buf));
	printf("AT+RST\r\n");
	Delay_ms(2000);

	memset(Buf,0,sizeof(Buf));
	printf("ATE0\r\n");    //关闭回显memset(Buf,0,sizeof(Buf));
	Delay_ms(1000);
	if(strcmp(Buf,"OK")!=0 )
		return 1;
	
	memset(Buf,0,sizeof(Buf));
	printf("AT+CWMODE=1\r\n");
	Delay_ms(50);
	if(strcmp(Buf,"OK")!=0)
		return 2;
	
	
	memset(Buf,0,sizeof(Buf));
	printf("AT+CWJAP=\"%s\",\"%s\"\r\n",WIFI,PASS); //连接热点
	Delay_ms(1000);
	if(strcmp(Buf,"OK")!=0)
		return 3;
	
	memset(Buf,0,sizeof(Buf));
	printf("AT+CIPMUX=0\r\n");
	Delay_ms(500);
	if(strcmp(Buf,"OK")!=0)
		return 4;
	
	memset(Buf,0,sizeof(Buf));
	printf("AT+CIPSTART=\"TCP\",\"api.k780.com\",80\r\n");
	Delay_ms(500);
	if(strcmp(Buf,"OK")!=0)
		return 5;
	
	memset(Buf,0,sizeof(Buf));
	printf("AT+CIPMODE=1\r\n");
	Delay_ms(500);
	if(strcmp(Buf,"OK")!=0)
		return 6;
		
	memset(Buf,0,sizeof(Buf));
	printf("AT+CIPSEND\r\n");
	Delay_ms(500);
	if(Flag != 1)
		return 7;
	return 0;
}

void ESP_Pub(void)        //当接收到'>'时
{
	if(Flag == 1)
	{
		printf("GET http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1\r\n");
		Delay_ms(2000);
	}
}


void Comman_Rec(void)
{
	    char *timestamp_start = strstr(Buf,"timestamp"); // 定位到"timestamp"字段的起始位置
		if (timestamp_start != NULL) 
		{
			timestamp_start += (strlen("timestamp")+3); // 跳过"timestamp"
			char timestamp[11];
			strncpy(timestamp, timestamp_start, 10); // 复制10个字符到timestamp数组
			timestamp[10] = '\0'; 					// 添加字符串结束符
			timestamp_cnt =atoi(timestamp);		//转换为整数
		}
		char *datetime1_start = strstr(Buf,"datetime_1"); 
		if (datetime1_start != NULL) 
		{
			datetime1_start += (strlen("datetime_1")+3); 
			strncpy(subdatetime_1, datetime1_start, 10); 
			subdatetime_1[10] = '\0'; 
			strncpy(subdatetime_2, datetime1_start+11, 7); 
			subdatetime_2[7] = '\0'; 

		}
}

主函数

#include "stm32f10x.h"                  // Device header
#include "OLED.H"
#include <stdio.h>
#include "Delay.h"
#include "MyUSART.H" 
#include "esp.h"

extern char Buf[512];
extern uint8_t Flag;
extern uint32_t timestamp_cnt;
extern char subdatetime_1[11];
extern char subdatetime_2[9];


void Init(void)
{
	uint8_t Judge=0;
	OLED_Init();
	OLED_ShowString(1,1,"Linking..");
	Delay_ms(100);
	MyUSART_Init(); 
	
	do
	{
		Judge = esp_Init();
		OLED_ShowString(1,1,"code:    ");
		OLED_ShowNum(2,1,Judge,1);
	}while(Judge!=0);  

}

int main(void)
{
	Init();
	if(Flag==1)
	{
		OLED_ShowString(1,1,"SUCCESS");
	}
	else
	{
		OLED_ShowString(1,1,"FAIL");
	}
	while(1)
	{
		ESP_Pub();
		Comman_Rec();
		OLED_ShowNum(1,1,timestamp_cnt,10);
		OLED_ShowString(2,1,subdatetime_1);
		OLED_ShowString(3,1,subdatetime_2);

	}

}

注意:这个代码存在的问题是比标准的北京时间慢两秒,因为每次调用网络API接口都会Delay2秒,所以可以只获取时间戳,加上两秒后再根据网上的代码将时间戳转换为具体的时间格式。还可以根据上一节实时时钟的代码实现掉电不丢失的功能。而且有时候显示一会会跳变一下,也有很多问题,我在网上没找到stm32库函数的这个功能实现,还没找到更好的思路。文章来源地址https://www.toymoban.com/news/detail-743274.html

到了这里,关于ESP8266获取网络时间 实时时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32+ESP8266水墨屏天气时钟:简易多级菜单(数组查表法)

    本次的水墨屏幕项目需要做一个多级菜单的显示,所以写出来一起学习,本篇文章不单单适合于水墨屏,像0.96OLED屏幕也适用,区别就是修改显示函数。 多级菜单的实现,一般有两种实现的方法 1.通过双向链表实现 2.通过数组查表实现 两种方法的思路都是把所有的界面连接在

    2024年04月10日
    浏览(43)
  • STM32+esp8266,让你的STM32开发板连接网络-----esp8266

    分享一下,STM32开发板连接网络的第一种方法:连接esp8266。 esp8266与STM32利用串口通信连接,esp8266连接网络,把收到的数据通过串口的方式传输给STM32,之后STM32接收到消息做出对应的反应。 使用到的开发板如图:esp-12和正点原子stm32f103zet6. 首先,我们先掌握一下什么事串口通

    2024年02月02日
    浏览(44)
  • 【STM32】ESP8266 WiFi模块实时上报温湿度及控制LED灯项目笔记

    本项目无线通讯模块使用的是WiFi模块ESP8266,乐鑫公司推出的高性能、低功耗串口WiFi模块ESP8266应该是使用最广泛的一种WIFI模块之一了,它自身带有高性能的MCU(Microcontroller Unit),因此它既可以通过串口连接为外部MCU提供 WiFi通信功能,也就是我们本项目所用到的功能;当然

    2024年01月21日
    浏览(61)
  • 【STM32训练—WiFi模块】第二篇、STM32驱动ESP8266WiFi模块获取天气

    目录 第一部分、前言 1、获取心知天气API接口 2、硬件准备 第二部分、电脑串口助手调试WIFI模块获取天气 1、ESP8266获取天气的流程 2、具体步骤 第三部分、STM32驱动ESP8266模块获取天气数据 1、天气数据的解析 1.1、什么函数来解析天气数据? 2.1、解析后的数据如何使用?  2、

    2024年02月09日
    浏览(44)
  • (2)STM32+ESP8266+手机网络助手实现AP模式通信

    根据手头要实现的需求, 我需要通过手机端向32端发送指令,32端进行判断执行,所以采用esp8266的AP模式,将esp8266模块本身作为热点服务器,手机端作为客户端,连接热点WiFi发送数据 。 STM32rct6板、esp8266(ESP-01S)、手机端网络助手app wifi模块直接与TTL转串口模块相连即可,RX

    2024年02月07日
    浏览(54)
  • STM32+ESP8266连接电脑Qt网络上位机——准备工作

            准备工作:先使用手机和电脑实现局域网,保证电脑的上位机和手机APP,实现服务器和客户机无障碍通信! 文章目录 一、准备工作 二、手机作为服务器 三、电脑作为服务器 工具:         手机端 : NeTorch 网络调试工具         电脑端 : 野火网络调试助

    2023年04月16日
    浏览(44)
  • STM32使用ESP8266模块AT指令连接心知天气API获取天气信息

    由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下。 本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi并与心知天气API建立TCP连接获取天气信息。 ESP8266我使用的是正点原子的ATK-ESP8266,已经提前烧录好AT指令集

    2023年04月08日
    浏览(66)
  • STM32+ESP8266连接电脑Qt网络上位机——QT篇

    上篇 :   STM32+ESP8266连接电脑Qt网络上位机——准备工作 目录 一、部分Qt代码及实现过程 二、实现过程——使用ESP8266连接上位 最终效果         本上位机结合了主机和服务器两种模式,在断开连接的时候可以切换模式。当作为服务器时,本机电脑的 ip 为该上位机的 ip ,可

    2024年02月01日
    浏览(42)
  • 【IoT网络层】STM32 + ESP8266 +MQTT + 阿里云物联网平台 |开源,附资料|

    🌟博主领域:嵌入式领域人工智能软件开发 本节目标: 通过MQTT.fx模拟连接或通过串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266 ESP-01来连接网络,获取设备数据发送到阿里云物联网平台并显示且oled显

    2024年02月04日
    浏览(57)
  • ESP8266使用AT指令获取时间和心知天气

    一.硬件:ESP8266,USB TO TTL模块,软件:串口调试助手 二.在心知官网注册账号:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 三.连接esp8266和usb转ttl,打开串口调试助手 四.发送AT指令 1.复位模块 发送 AT+RST 返回 ready 2.测试AT指令 发送 AT 返回 OK 3.配置STA模式

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包