热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ESP8266+OLED显示天气

ESP8266+OLED显示天气  在太极创客学习ESP8266三四天了,记录一下学习过程,还请各位大佬多加指点。  基本思路:首先,ESP8266作客户端向心知天气API发送GE
ESP8266+OLED显示天气

  在太极创客学习ESP8266三四天了,记录一下学习过程,还请各位大佬多加指点。
  基本思路:首先,ESP8266作客户端向心知天气API发送GET请求;然后,从心知天气响应报文体中的JSON数据解析出天气,气温等数据;最后用在OLED上把天气信息显示。

1 硬件及连接

  • ESP8266-NodeMCU
  • OLED屏幕
  • 四根杜邦线
  • 数据线一条
    OLED的VCC连接ESP8266-NodeMCU的3V引脚,GND连接MCU的G引脚,SCL连接MCU的D1引脚,SDA连接MCU的D2引脚

2 心知天气API

在知心天气申请API,并记住私钥
《ESP8266+OLED显示天气》
《ESP8266+OLED显示天气》
《ESP8266+OLED显示天气》
《ESP8266+OLED显示天气》
API的地址为api.seniverse.com/v3/weather/now.json?key=私钥(填写自己申请到的)&location=Xian(填写地点)&language=en&unit=c。服务器响应了一个JSON对象

{
"results":
[
{
"location":{"id":"WQJ6YY8MHZP0","name":"Xian","country":"CN","path":"Xian,Xian,Shanxi,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
"now":{"text":"Shower","code":"10","temperature":"7"},
"last_update":"2021-03-10T17:25:00+08:00"
}
]
}

改JSON对象的元素是一个数组,数组的元素时三条JSON数据,数据名分别为Location,Now,以及last_update。

3 代码

#include
#include
#include
#include
//-------Wifi信息------//
const char* ssid = "xxxx";
const char* password = "xxxx";
//------------------- //
api.seniverse.com/v3/weather/now.json?key=SbCTo-Zgsj2X_44Er&location=Xian&language=en&unit=c
const int httpPort = 80; //端口号
const char* host = "api.seniverse.com"; //服务器地址
String reqUserKey = "xxxxxxxxxx";//知心天气API私钥
String reqLocation = "Xian";//地址
String reqUnit = "c";//摄氏度
//-------------------http请求-----------------------------//
String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
+ "&location=" + reqLocation +
"&language=en&unit=" + reqUnit;
String httprequest = String("GET ") + reqRes + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n";
//--------------------------------------------------------//
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,/* reset=*/ U8X8_PIN_NONE);
void OLEDDispaly(String cityName, String weather, String temperature);
void wifi_connect();
void httpRequest();
void parseJson(WiFiClient client);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
u8g2.begin();
wifi_connect();
}
void loop() {
// put your main code here, to run repeatedly:
httpRequest();
delay(3000);
}
void wifi_connect() {
//提示信息
Serial.print("Wifi connecting");
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_unifont_t_chinese2);
u8g2.setCursor(0, 16);
u8g2.print("Wifi connecting ...");
u8g2.sendBuffer();
//连接Wifi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\nWifi Connected!");
u8g2.clearBuffer();
u8g2.setCursor(0, 16);
u8g2.print("Wifi connected!!!");
u8g2.sendBuffer();
}
void httpRequest() {
WiFiClient client;
//1 连接服务器
if (client.connect(host, httpPort)) {
Serial.println("连接成功,接下来发送请求");
client.print(httprequest);//访问API接口
String response_status = client.readStringUntil('\n');
Serial.println(response_status);
if (client.find("\r\n\r\n")) {
Serial.println("响应报文体找到,开始解析");
}
parseJson(client);
}
else {
Serial.println("连接服务器失败");
}
client.stop();
}
void OLEDDispaly(String cityName, String weather, String temperature) {
u8g2.clearBuffer();
u8g2.setCursor(0, 16);
u8g2.print("City: ");
u8g2.print(cityName);
u8g2.setCursor(0, 36);
u8g2.print("Weather: ");
u8g2.print(weather);
u8g2.setCursor(0, 52);
u8g2.print("temperature: ");
u8g2.print(temperature);
u8g2.sendBuffer();
}
void parseJson(WiFiClient client) {
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
DynamicJsonDocument doc(capacity);
deserializeJson(doc, client);
JsonObject obj1 = doc["results"][0];
String cityName = obj1["location"]["name"].as<String>();
String weather = obj1["now"]["text"].as<String>();
String temperature = obj1["now"]["temperature"].as<String>();
OLEDDispaly(cityName, weather, temperature);
Serial.println(cityName);
Serial.println(weather);
Serial.println(temperature);
}

推荐阅读
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文介绍了一种在ANSI C中动态分配二维数组的方法。通过创建指针数组并为每个指针分配连续空间,可以灵活地管理内存。文章还讨论了一些常见的错误和注意事项。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
author-avatar
手机用户2602881053
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有