eps32联网获取天气情况+oled显示屏显示

实验原理:

ESP32 支持 2.4G 网络,那我们可以通过发送 HTTP 请求来获取实时天气数据。一般来说,天气数据是由一些公共 API 接口提供的,这些接口需要向它们发送 HTTP 请求以获取数据。

HTTP 请求与 API:

当我们在浏览器中输入网址或者使用应用程序时,我们实际上是向服务器发出请求。HTTP请求是客户端(如浏览器)与服务器之间通信的方式,用于获取或发送Web资源。这些资源可以是文本文件、图像、脚本等,客户端通过HTTP协议发起请求,服务器返回相应的响应。
我们虽然可以对任意网址发送网络请求,但是这样毫无意义,比如,我想要获取某个地区的天气状况,就需要调用相对应的接口,也就是API。
APl(Application Programming Interface)是指应用程序编程接口,它定义了应用程序之间进行通信的方式和规范。API允许不同的应用程序之间进行数据交换,使得应用程序可以共享资源和信息,从而提高应用程的效率和可用性。
APIl通常使用HTTP请求来提供服务,客户端通过发送HTTP请求访问API,服务器则通过HTTP响应返回所需的数据。API可以提供许多不同的服务,例如访问数据库、获取实时数据、处理图像等。
当我们使用别人提供的API的时候就需要遵守别人制定的规则,使用对应的链接、请求方法等等,我们需要查看API文档来获取这些信息。比如,我们今天使用聚合数据的API接口。
总之,HTTP请求是客户端与服务器之间通信的方式,API则是应用程序之间通信的方式。通过HTTP请求访问API,我们可以实现不同应用程序之间的数据交换和共享。

JSON数据

JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用程序之间的数据传输。它是一种文本格式,易于阅读和编写,并且可以被各种编程语言支持。
JSON数据由键值对组成,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象等数据类型。

JSON数据通常用于Web应用程序中,例如从后端服务器获取数据或向后端服务器发送数据。在前端JavaScript中,可以使用内置的JSON对象将JSON字符串转换为JavaScript对象,或将JavaScript对象转换为JSON字符串。

SPI

SPI (Serial Peripheral Interface)协议是由摩托罗拉公司提出的通讯协议,即串行外围设备接口,是一种同
步全双工、主从式接口,但并不是所有的SPI都是全双工。洎主机或从机的数据在时钟上升沿或下降沿
同步。主机和从机可以同时传输数据。SPI 接口可以是1线、2线3线式或4线式,这节课,我们用到的就
是3线SPI。
产生时钟信号的器件称为主机。主机和从机之间传输的数据与主机产生的时钟同步。同I2C接口相比,
SPI器件支持更高的时钟频率。胪查阅产品数据手册以了解SPI接口的时钟频率规格。
标准4线SPI芯芯的管脚上只占用四根线。
MOSI :主器件数据输出, 从器件数据输入。
MISO :主器件数据输入,从器件数据输出。
SCK :时钟信号,主设备控制发出。
cs (NSS) :从机设备选择信号,主设备控制。当CS为低电平则选中从器件。
3线SPI只有 MISO ,但是对于显示屏来说使用是足够了,因为显示屏没什么数据需要回调给主机。
SPI接口只能有一个主机,可以有一个或多个从机。下图显际了主机和从机之间的SPI连接。洎主机的
片选信号用于选择从机。这通常是一个低电平有效信号,拉搞时从机与SPI总线断开连接。当使多个从机
时,主机需要为每个从机提供单独的片选信号。MOSI 和MISO是数据线。MOSI 将数据从主机发送到从
机,MISO将数据从从机发送到主机。

ESP32集成了4个SPI外设。
●两个在内部用于访问ESP32所连接的闪存。两个控制器共享相同的SPI总线信号,組有一个仲裁器
来确定哪个可以访问该总线。
●另外两个是通用SPI控制器,分别称为HSPI和VSPI。 它们向用户开放,賄独立的总线信号,分别具有
相同的名称。条总线具有3条CS线,最多能控制6个SPI从设备。

硬件连接

OLED                           ESP32

VDD                               +3.3V

GND                                GND

SCLK                               18

SDA                                  13

CS                                     4

DC                                    2

RES                                  15

这里6针的OLED显示屏与7针的OLED显示屏的连接区别不是很大。

图中可见CS引脚是低电平有效,商家设计6脚OLED时直接将CS引脚接地,这其实并没什么影响。

软件要求

用到的软件为Arduino IDE

安装包:https://pan.baidu.com/s/1VVxpuaYhsV3SYJucB4ZHTg?pwd=k1gh 
提取码:k1gh 

依赖包:ArduinoJson、U8g2

代码示例:

#include <SPI.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <ArduinoJson.h>

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0,/*clock*/18,/*data=*/13,/*cs*/4,/*dc*/2,/*reset=*/15);
const char *ssid="11";                      //输入自己的wifi账号
const char *password="15223125934";         //输入自己的wifi密码
//定义   此处是聚合数据官网给的,可以自己创建账号获得key参数
String url="http://apis.juhe.cn/simpleWeather/query";    //请求网址响应
String city="宁波";                                      //输入想要获得的城市
String key="df39b169ab000f5874c44a5a8027f5f4";           


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //连接WiFi
  WiFi.begin(ssid,password);
  Serial.print("正在连接Wi-Fi");
  //检测是否连接成功
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("连接成功");
  Serial.print("IP地址:");
  Serial.println(WiFi.localIP());

  //创建HTTPCLient 对象
  HTTPClient http;

  //发送GET请求
  http.begin(url+"?city="+city+"&key="+key);
  int httpCode=http.GET();
  //获取响应状态码
  Serial.printf("HTTP 状态码:%d",httpCode);
  //获取响应正文
  String response=http.getString();
  Serial.println("响应数据");
  Serial.println(response);

  http.end();
  //创建DynamicJsonDocument对象
  DynamicJsonDocument doc(1024);
  //解析JSON数据
  deserializeJson(doc,response);
  //从解析后的JSON文档中获取值
  unsigned int temp=doc["result"]["realtime"]["temperature"].as<unsigned int>();
  String info=doc["result"]["realtime"]["info"].as<String>();
  int aqi=doc["result"]["realtime"]["aqi"].as<int>();

  Serial.printf("温度:%d\n",temp);
  Serial.printf("天气:%s\n",info);
  Serial.printf("空气指数:%d\n",aqi);

  u8g2.begin();
  u8g2.enableUTF8Print();
    //设置字体
  u8g2.setFont(u8g2_font_xifont);
  //设置字体方向
  u8g2.setFontDirection(0);
  u8g2.clearBuffer();
  u8g2.setCursor(16,16);
  u8g2.print("城市宁波");
  u8g2.setCursor(0,32);
  u8g2.print("温度");
  u8g2.setCursor(48,32);
  u8g2.print(temp);
  u8g2.setCursor(0,48);
  u8g2.print("天气");
  u8g2.setCursor(48,48);
  u8g2.print(info);
  u8g2.setCursor(0,64);
  u8g2.print("空气指数");
  u8g2.setCursor(80,64);
  u8g2.print(aqi);
  u8g2.sendBuffer();
}

void loop() {
  // put your main code here, to run repeatedly:

}

由于下载的u8g2库里面的中文有缺失,代码中的u8g2_font_xifont是自己创建的库。

创建自定义的库可以参照:Arduino上U8g2库自定义中文库的经历_arduino u8g2_font15_msyh_chinese_长风Eric(fengcan)的博客-CSDN博客

上面这篇博客评论区有大佬指出的瑕疵之处要看一下 

实验结果 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值