stm32+esp8266 GET请求心知天气的简单方法_stm32f103c8t6单片机连接esp8266wifi模块获取天气信息-程序员宅基地

技术标签: stm32  物联网  


前言

因为之前学习stm32+esp8266请求心知天气时看的不是很懂,然后在成功调试出来之后发一篇面向刚入门的学者,当然我也属于是刚入门级别的。

一、ESP8266调试

我这里使用的是ESP8266-01S,首先得烧录固件库,这些买的时候商家也会提供,所以不多做解释。
首先配置好ESP8266所用的指令

AT+CWMODE=1
AT+RST
AT+CWJAP=“232”,"123456789\” 这里的232是你的热点名称 后面数字代表密码
AT+CIPMUX=0 单连接模式
AT+CIPSTART=“TCP”,“116.62.81.138”,80 TCP为连接协议,后面为服务器IP,80表示端口
AT+CIPMODE=1 设置为透传模式
AT+CIPSEND 这个是用来发送数据前的AT指令,当使用完这个指令返回">"这个符号之后 esp8266就会禁止以后的AT指令发送

最后就是直接GET请求 以心知天气API为例:GET https://api.seniverse.com/v3/weather/now.json?key=你的私钥&location=zhaoqing&language=zh-Hans&unit=c

还有一点就是当发送了GET请求之后平台返回的数据是直接进入与esp8266相连的单片机的中断,不需要另外写接收代码

最后可以使用调试助手查阅是否获取到了数据,我这里用的是安信可:https://docs.ai-thinker.com/_media/tools/aithinker_serial_tool_v1.2.3.7z 直接点击链接既可下载

二、代码部分

1.esp8266部分

我使用的是STM32F103C8T6,这个库可以直接复制粘贴使用
我这是从OneNet平台上下载的一个8266库然后修改了一点东西,需要的可以直接去下载一份

#include "stm32f10x.h"
#include <esp8266.h>
#include "delay.h"
#include "usart.h"
#include <string.h>
#include <stdio.h>
#define ESP8266_WIFI_INFO		"AT+CWJAP=\"232\",\"123456789\"\r\n"

#define ESP8266_ONENET_INFO		"AT+CIPSTART=\"TCP\",\"116.62.81.138\",80\r\n"

unsigned char espbuf_Goal[300];//全局变量
unsigned char esp8266_buf[300];
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;
void ESP8266_Clear(void)//清除8266接收数据的包缓存
{
    

	memset(esp8266_buf, 0, sizeof(esp8266_buf));
	esp8266_cnt = 0;
}


_Bool ESP8266_WaitRecive(void)//这个不需要用到,可以不用管,复制就完了
{
    

	if(esp8266_cnt == 0) 							
		return REV_WAIT;
		
	if(esp8266_cnt == esp8266_cntPre)				
	{
    
		esp8266_cnt = 0;							
			
		return REV_OK;								
	}
		
	esp8266_cntPre = esp8266_cnt;					
	
	return REV_WAIT;								

}

_Bool ESP8266_SendCmd(char *cmd, char *res)//发送AT指令用的函数,复制就完了
{
    
	
	unsigned char timeOut = 200;

	Usart_SendString(USART1, (unsigned char *)cmd, strlen((const char *)cmd));
	
	while(timeOut--)
	{
    
		if(ESP8266_WaitRecive() == REV_OK)							//如果收到数据
		{
    
			if(strstr((const char *)esp8266_buf, res) != NULL)		//如果检索到关键词
			{
    
				ESP8266_Clear();									//清空缓存
				
				return 0;
			}
		}
		
		delay_ms(10);
	}
	
	return 1;

}
//放延时可以给中断接收预留时间 该函数是返回GET请求获取的包数据
unsigned char *ESP8266_GetIPD(unsigned short timeOut)//这里我用了一个全局变量将esp8266buf储存到这个全局变量里面
{
    
	do
	{
    
		delay_ms(5);													
	} while(timeOut--);
	strcpy((char*)espbuf_Goal,(char*)esp8266_buf);
	return espbuf_Goal;														
}

//这个没什么好说的,就是初始化ESP8266的,要注意的是ESP8266的复位引脚要与PC14连接,否则复位指令失效
//直接复制就完了
void ESP8266_Init(void)
{
    
	
	GPIO_InitTypeDef GPIO_Initure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//ESP8266复位引脚
	GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Initure.GPIO_Pin = GPIO_Pin_14;					//GPIOC14-复位
	GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_Initure);
	
	GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
	delay_ms(250);
	GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
	delay_ms(500);
	
	ESP8266_Clear();
	

	while(ESP8266_SendCmd("AT\r\n", "OK"))
		delay_ms(500);
	

	while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
		delay_ms(500);
	

	while(ESP8266_SendCmd("AT+RST\r\n", "OK"))
		delay_ms(500);
	
	

	while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
		delay_ms(500);
	

	while(ESP8266_SendCmd("AT+CIPMUX=0\r\n", "OK"))
		delay_ms(500);
	

	while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
		delay_ms(500);

	while(ESP8266_SendCmd("AT+CIPMODE=1\r\n", "OK"))
		delay_ms(500);
	
	while(ESP8266_SendCmd("AT+CIPSEND\r\n", ">"))
		delay_ms(500);
	
	UsartPrintf(USART2, "6. ESP8266 Init OK\r\n");//用来打印是否已经完成了配置
}

//我把USART1的中断往这个头文件写了,需要改的可以改一下
//里面的代码直接复制就完了
void USART1_IRQHandler(void)
{
    

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
	{
    
		if(esp8266_cnt >= sizeof(esp8266_buf))	esp8266_cnt = 0; //防止串口被刷爆
		esp8266_buf[esp8266_cnt++] = USART1->DR;//读取接收到的数据

		USART_ClearFlag(USART1, USART_FLAG_RXNE);
	}

}

头文件

#ifndef _ESP8266_H_
#define _ESP8266_H_





#define REV_OK		0	//接收完成标志
#define REV_WAIT	1	//接收未完成标志

unsigned char espbuf_Goal[300];
void ESP8266_Init(void);

void ESP8266_Clear(void);

void ESP8266_SendData(unsigned char *data, unsigned short len);

unsigned char *ESP8266_GetIPD(unsigned short timeOut);


#endif

2.单片机代码部分

main.c的代码

#include "stm32f10x.h"
#include "usart.h"
#include "string.h"
#include "delay.h"
#include "time.h"
#include "esp8266.h"
#include <stdio.h>
int main(void)
{
    	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD| RCC_APB2Periph_AFIO,ENABLE);//串口时钟
	delay_init();
	Usart1_Init(115200);//物联网通信
	Usart2_Init(115200);//打印串口信息
	ESP8266_Init();//初始化物联网指令
	ESP8266_Clear();//清除esp8266buf的缓存数据
	char sss[256];
	sprintf(sss,"GET https://api.seniverse.com/v3/weather/now.json?key=SOIDqYnBIHFXVAywS&location=zhaoqing&language=zh-Hans&unit=c\r\n");//发送get请求
	Usart_SendString(USART1, (unsigned char *)sss, strlen((const char *)sss));
	extern unsigned char espbuf_Goal[300];//调用esp8266.c的变量
	ESP8266_GetIPD(200);//获取GET请求的返回包
	ESP8266_Clear();//清除缓存数据
	UsartPrintf(USART2, "%s\r\n",espbuf_Goal);
  while(1)
	{
    			
	}
		
}

在这里插入图片描述
可以看到我们这里已经成功收到来自心知天气返回的一个json的数据表包,而这个包已经储存在espbuf_Goal这个变量里面,剩下的就是如何对espbuf_Goal这个变量进行解析了,这个相信网上有很多资源跟教程,应该不难,或者等过几天再发一篇如何进行json解析这个数据包获取对应的数据


总结

由于是第一次发博客,所以有很多不好的地方需要改进,如果说还有看不懂不会用的可以多看几次多琢磨几次,先把以上的几个AT指令测试几次,就明白了,最后main.c那边的get请求!!! 千万记住最后要加\r\n 否则你是请求不出去的,至于上面还有一个usart的头文件,那个里面其实就是最基本的usar配置和中断优先级配置,这些你们可以自己去配置,也不难,可以多去看看一些其他博主的文章。

最后就是这个esp8266的代码我也不是原创,不过也不难,就是对usart_sendstring这个函数进行不断的封装还有串口中断接收数据而已,我只是提供一些适合初学者GET获取的简单方法,有其他什么不懂的可以留言,当然是对这篇文章的问题,其他太高深的问题我也不懂。以上代码有不好的地方可以指出,我也是初学者,写的可能不是很好。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/StromEzzz/article/details/123963958

智能推荐

MYSQL数据库四种索引类型介绍_mysql可以使用那些列作为数据索引-程序员宅基地

文章浏览阅读8.4k次,点赞17次,收藏25次。MYSQL数据库四种索引类型主键索引: 主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。唯一索引: 索引列的所有值都只能出现一次,即必须唯一,值可以为空。普通索引 : 基本的索引类型,值可以为空,没有唯一性的限制。全文索引: 全文索引的索引类型为FULLTEXT。全..._mysql可以使用那些列作为数据索引

c#中用循环语句输出九九乘法表_c# 通过for循环输出10 20 30-程序员宅基地

文章浏览阅读5.2k次,点赞3次,收藏5次。 一些基础的逻辑运算,自己也是初学者,记录一下,全是自己的一些见解,大神请轻喷输出结果:代码:public void ChengFaBiao(){ for (int a = 1;a&lt;=9;a++){ for (int b = 1; b &lt;= a; b++) { Console.Write (b + "*" + a + "=" + a * b+" "); ..._c# 通过for循环输出10 20 30

AGPBI: {"kind":"error","text":"Cannot fit requested classes in a single dex file (# methods: 67300 >-程序员宅基地

文章浏览阅读2.8k次。错误信息 AGPBI: {"kind":"error","text":"Cannot fit requested classes in a single dex file (# methods: 67300 > 65536)","sources":[{}],"tool":"D8"}com.android.builder.dexing.DexArchiveMergerExce..._agpbi: {"kind":"error","text":"cannot fit requested classes in a single dex

python之windrose风向玫瑰图的用法_windroseaxes.from_ax-程序员宅基地

文章浏览阅读2w次,点赞4次,收藏47次。1.安装A package is available and can be downloaded from PyPi and installed using:$ pip install windroseInstall latest development version$ pip install git+https://github.com/python-windrose/wi..._windroseaxes.from_ax

pxe linux 配置文件,(六)PXE技术篇--pxelinux 的配置文件-程序员宅基地

文章浏览阅读1k次。pxe 启动引导器pxelinux.0 在 syslinux 包中, 把它拷贝到 /var/lib/tftpboot/ 下, 客户机会从此目录读取该文件安装yum -y install syslinux复制文件cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot我们告诉客户端使用 vmlinuz 作为内核, 并且使用 initrd.img 作为初..._pxelinux.0文件在什么地方

图解:深度优先搜索与广度优先搜索及其六大应用_请叙述广度优先搜索和深度优先搜索的特点和使用场合-程序员宅基地

文章浏览阅读5.9k次,点赞13次,收藏46次。图算法第二篇 深度优先搜索与广度优先搜索及其应用约定:本文所有涉及的图均为无向图,有向图会在之后的文章涉及1.图的存储方式我们首先来回顾一下图的存储方式:邻接矩阵和邻接表。为了实现更好的性能,我们在实际应用中一般使用邻接表的方式来表示图。具体的实现代码为:package Graph;import java.util.LinkedList;public class Graph{ private final int V;//顶点数目 private int E;/.._请叙述广度优先搜索和深度优先搜索的特点和使用场合

随便推点

树莓派(3B)刷OpenWrt变路由_树莓派3b openwrt-程序员宅基地

文章浏览阅读2k次,点赞5次,收藏10次。树莓派(3B)刷OpenWrt变路由由于去年使用树莓派(3B+)进行此项目未成功,今年因为做别的项目,刚好换成了树莓派(3B),顺便就尝试着完成去年未完成的项目,最终成功,顺利将树莓派(3B)通过刷OpenWrt将其变身路由。在此,非常感谢带我入门的学长,本次项目是在学长研究的基础上进行的,真正的成功属于他们,我只是一个搬运者与借鉴者。一、格式化SD卡使用“SDFormatter.exe”工具格式化SD卡;二、烧录OpenWrt镜像打开“Win32DiskImager.exe”工具,找到完成格式_树莓派3b openwrt

进程环境相关(APUE)_linux 进程 文件 apue-程序员宅基地

文章浏览阅读90次。就是一个main程序的运行开始到结束的一些介绍,运行环境的一些,比较简单的一章,里面那个setjmp和longjmp函数那里有点难懂,记得后面信号那里还出现了。mian函数背后进程(main函数)的开始进程的终止的方式(8种(其中5种正常))三个正常终止进程的函数:exit、_exit和_Exit,三者有什么不同,参数代表什么(终止状态)什么情况下终止状态是未定义的,什么情况下终止状态..._linux 进程 文件 apue

《Linux从0到99》七 进程地址空间_99在内存中的地址-程序员宅基地

文章浏览阅读108次。地址空间1. 什么是地址空间?2. 虚拟地址空间出现的原因3. 地址空间的工作方式4. 地址空间的三种管理方式01 分页式内存管理(提高内存利用率)02 分段式内存管理(便于管理)03 段页式内存管理(既提高了内存利用率,又便于内存管理)1. 什么是地址空间?地址空间(address space) 表示任何一个计算机实体所占用的内存大小。比如外设、文件、服务器或者一个网络计算机。地址空间包括物理空间以及虚拟空间。物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上_99在内存中的地址

php mysql 排名算法_PHP实现四种基础排序算法的运行时间比较(推荐)-程序员宅基地

文章浏览阅读120次。许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。下面通过本文给大家介绍PHP实现四种基础排序算法的运行时间比较,一起看下吧。废话不多说了,直接给大家贴代码了。具体代码如下所示:/*** php四种基础排序算法的运行时间比较* @authors Jesse (jesse152@..._for($i=0;$i

YOLOV3代码详解_b, target_labels = target[:, :2].long().t()-程序员宅基地

文章浏览阅读7.5k次,点赞16次,收藏126次。代码分析:https://github.com/eriklindernoren/PyTorch-YOLOv3论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf注:本次分析的代码是以上给出的网址,全部根据自己的理解写的,如有不足,还请指正。1、datasets.py因为所有模型都包括数据加载,模型载入,训练和测试等,所以先从数据的载..._b, target_labels = target[:, :2].long().t()

均衡技术matlab,无线通信均衡技术matlab仿真.doc-程序员宅基地

文章浏览阅读304次。无线通信均衡技术matlab仿真现给出迫零均衡(ZF)、最小均方误差均衡中的最小均方算法(LMS)的matlab程序,理解各程序,完成以下习题。将程序运行结果及各题目的解答写入word中:用matlab分别运行“main_zf.m”和“main_lms.m”(a)在程序中标注“注释”处加上注释(英文或中文)。(b)写出这两种算法实现的流程。(c)运行程序,会得到关于信号的一系列图形,包括信号序列图..._matlab信道均衡代码

推荐文章

热门文章

相关标签