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

您所在的位置:网站首页 7107数码管做温度显示 eps32联网获取天气情况+oled显示屏显示

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

2024-07-17 19:33| 来源: 网络整理| 查看: 265

实验原理:

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 #include #include #include #include #include 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(); String info=doc["result"]["realtime"]["info"].as(); int aqi=doc["result"]["realtime"]["aqi"].as(); 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博客

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

实验结果 



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3