文章目录

  • 前言
  • 一、ESP8266调试
  • 二、代码部分
    • 1.esp8266部分
    • 2.单片机代码部分
  • 总结

前言

因为之前学习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获取的简单方法,有其他什么不懂的可以留言,当然是对这篇文章的问题,其他太高深的问题我也不懂。以上代码有不好的地方可以指出,我也是初学者,写的可能不是很好。

stm32+esp8266 GET请求心知天气的简单方法相关推荐

  1. ESP8266+oled连接心知天气显示时间和实时天气

    因为时间比较仓促,目前存在许多问题没有解决. 首先进行aduino环境配置,具体方法可参考以下链接,若选错开发板型号编译会报错配置esp8266开发板的Arduino开发环境_交通运输怪味张的博客-C ...

  2. STM32使用CJSON获取心知天气

    文章目录 1.程序配置 2.新建json数据 3.读取json数据 4.解析心知天气 5.ESP01S获取数据 6.STM32获取数据 本文是接着上一篇文章的后续来写,上一篇写的太长了后面太累了就没写 ...

  3. esp8266点灯LCD12864心知天气+农历+空气质量ArduinoJson6

    接上篇 esp8266 mixly blynk远程控制 + NTP+天气预报及一体 智能钟 时钟原理图见上篇文章 心知天气.农历API用的是ArduinoJson6解析.且采用的char* 变量 .上 ...

  4. STM32使用ESP8266模块AT指令连接心知天气API获取天气信息

    由于之前使用STM32单片机来开发一些物联网的小项目,接触到了WIFI模块ESP8266,所以写下来记录一下.本文主要介绍的是STM32通过发送AT指令集来控制ESP8266 WIFI模块连接WiFi ...

  5. 使用 Fiddler 调试 心知天气,stm32 esp8266获取天气api

    心知天气 - 免费用户的功能: 国内 370 个主要城市 天气实况,包括天气现象文字.代码和气温 3 项数据 未来 3 天天气预报,包括白天天气现象文字及代码.晚间天气现象文字及代码.当天最高温度和最 ...

  6. esp8266获取天气信息:心知天气get及url讲解说明

    本人最近在使用esp8266获取天气预报,在网上搜寻了一番,使用了心知天气的api(不是打广告),本人对网络方面不是很懂,经过几天的查找资料与学习,然后在博客记录下,方便以后的学习可广大学友. url ...

  7. Esp8266 --深入分析官方json解析源码及如何使用json接口解析心知天气

    什么是json? 懵逼回答:[参考菜鸟教程]   a.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)   b.JSON 是轻量级的文本数据交 ...

  8. 利用Arduino Esp8266 心知天气API 获取天气预报信息(修改后可以DIY一个小型的桌面气象台)

    前期准备: 注册心知天气,获取API密钥  https://www.seniverse.com 生成API请求地址,北京今天和未来4天的预报请求地址如下: https://api.seniverse. ...

  9. ESP8266使用AT指令获取时间和心知天气

    一.硬件:ESP8266,USB TO TTL模块,软件:串口调试助手 二.在心知官网注册账号:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 三.连接esp8266和us ...

最新文章

  1. hdu 1026 bfs+记录路径
  2. Java十大排序算法总结,Java排序算法总结之冒泡排序
  3. Fastjson批量检查及一键利用工具
  4. Vijos CoVH之再破难关(搜索+hash)
  5. 甜甜用计算机1050除以一个数,上册四年级数学期末试卷带答案
  6. org.hibernate.QueryException: could not resolve property
  7. 关于路由器操作系统的那点事儿
  8. Java编程思想 经典评注分享
  9. Transcad转Ptv Visum的学习之路
  10. 利息计算器 html,html+jQuery简单的利息计算器
  11. java 封装 继承 多态
  12. oracle查询一年的第几周,Oracle--计算某一日期为一年中的第几周
  13. Linux学习-软件磁盘阵列
  14. 比有钱更重要的,是拥有“选择权”(深度好文)
  15. win10+keras+yolo4训练自己的数据集
  16. React.Meno
  17. ubuntu16.04升级至18.04
  18. 计算机软件考研课程,计算机软件考研408专业课经验分享
  19. 第十四章 SQL命令 CREATE TABLE(一)
  20. 铝板展开插件_钣金件快速绘图与展开程序CAD插件(钣金展开插件工具)Vr2.10 最新版...

热门文章

  1. android 強制屏幕方向,今日精品安卓App推荐:锁定屏幕旋转方向
  2. eureka 手动删除失效的服务
  3. 利用无效字节码指令引发逆向工具崩溃(二)
  4. 电脑重装系统UEFI启动如何设置
  5. Pt100转RS-485,热电阻温度Modbus数据采集模块 WJ125
  6. 统计学学习笔记——(4)差异性
  7. Synology群晖 DS920 +,DS420 +,DS720 +,DS220 + NAS横向对比 群晖20plus系列怎么选
  8. 潘石屹这回是真的卖掉了“根”
  9. Python小白入门练习试题
  10. velocity页面js引入#foreach遍历list