esp32获取网络时间和天气 您所在的位置:网站首页 qq天气显示 esp32获取网络时间和天气

esp32获取网络时间和天气

#esp32获取网络时间和天气| 来源: 网络整理| 查看: 265

@[esp32获取网络时间和天气]

esp32获取网络时间和天气 目录

一.库的获取 二.esp32连接wifi 三.oled显示 四.汉字或图片取模放在oled中显示 五.esp32获取网络时间 六.esp32获取城市天气 七.程序全部代码如下 八.文章引用 一.库的获取 首先需要获取以下的库 点击项目→加载库→管理库 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

#include #include #ifdef U8X8_HAVE_HW_SPI #include #endif #ifdef U8X8_HAVE_HW_I2C #include #endif 这些是oled显示所需要调用的头文件 #include 这个是连wifi所需要的头文件 #include 这个可以进行json的序列化,和转换做数据通讯了 #include "WeatherIcon.h"这个是取模软件取模之后图片的库

二.连接wifi需要用到WiFi.h库 下面展示一些 内联代码片。

#include const char* id="要连接wifi名字"; //定义两个字符串指针常量 const char* psw="wifi密码"; void setup() { Serial.begin(115200); WiFi.begin(id,psw); while(WiFi.status()!=WL_CONNECTED){ //未连接上 delay(500); Serial.println("正在连接..."); } Serial.println("连接成功!"); //连接上 } void loop(){ //空循环 }

运行结果

在这里插入图片描述

三.oled显示(我这里用的是0.96寸oled 4针屏幕) 各种u8g2函数 U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2定义了oled的引脚 不同屏幕更改对应分辨率,套用合适的函数。 u8g2.begin() 构造U8G2 u8g2.clearDisplay() 清除屏幕内容 u8g2.drawXBM()/drawXBMP() 绘制图像 /**

绘制图像@param x 左上角坐标x@param y 左上角坐标y@param w 图形宽度@param h 图形高度@param bitmap 图形内容@Note 关联方法 setBitmapMode */ void U8G2::drawXBM(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap) void U8G2::drawXBMP(u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap) u8g2.print() 绘制内容 u8g2.setFont() 设置字体集 u8g2.setFontDirection() 设置字体方向 u8g2.clearBuffer() 清除缓冲区 u8g2.setCursor(x, y); 设置绘制光标位置 在这里插入图片描述

四.汉字或图片取模放在oled中显示 汉字的话可以直接调用u8g2.setFont 图片取模用这个软件PCtoLCD2002,还有图片必须用bmp格式。 设置格式 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

点击下方生成字模,一键生成图片字模放到你的代码里面。 五.esp32获取网络时间 网络时间服务器最常用的主机名是 pool.ntp.org,通过网络时间服务器获得的时间是世界协调时间(UTC)/格林尼治时间(GMT),不同地区的时间可以通过时区换算, gmtOffset_sec 参数就是用来修正时区的,比如对于我们东八区(UTC/GMT+08:00)来说该参数就需要填写 8 * 3600 ;如果使用夏令时 daylightOffset_sec 就填写3600,否则就填写0; u8g2.print(&timeinfo, “%F %A%T”); %F代表获取的年月日,%A代表获取的星期几的全称,%T表示获取的时分秒。 六.esp32获取城市天气 esp32作客户端向心知天气API发送GET请求;然后,从心知天气响应报文体中的JSON数据解析出天气,气温数据,首先需要注册一个心知天气账号,然后申请一个免费版,然后就可以从网页获取天气了。 在这里插入图片描述

API的地址为api.seniverse.com/v3/weather/now.json?key=私钥(填写自己申请到的)&location=yanji(填写地点)&language=en&unit=c。服务器响应了一个JSON对象 在这里插入图片描述

这里获取的不同code对应不同的天气代码,程序里面可以改成你的天气图片。

在这里插入图片描述

七.程序全部代码如下 下面展示一些 内联代码片。

#include #include "time.h" #include #include #include #include #ifdef U8X8_HAVE_HW_SPI #include #endif #ifdef U8X8_HAVE_HW_I2C #endif #include "WeatherIcon.h" //-------Wifi信息------// const char* ssid = "5698419";//WiFi名字 const char* password = "12345678";//WiFi密码 const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 8 * 3600; const int daylightOffset_sec = 0; //------------------- // //api.seniverse.com/v3/weather/now.json?key=SbCTo-Zgsj2X_44Er&location=Xian&language=en&unit=c //api.seniverse.com/v3/weather/now.json?key=SBWS8RqYioGeLldvZ&location=yanji&language=zh-Hans&unit=c const int httpPort = 80; //端口号 const char* host = "api.seniverse.com"; //服务器地址 String reqUserKey = "SBWS8RqYioGeLldvZ";//知心天气API私钥 String reqLocation = "延吉";//地址 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_SW_I2C u8g2(U8G2_R0, /* clock=*/ 22, /* data=*/ 23, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, pure SW emulated I2C //void OLEDDispaly(String cityName, String weather, String temperature); void OLEDDispaly(String cityName, int code_int, String temperature); void wifi_connect(); void httpRequest(); void parseJson(WiFiClient client); void printLocalTime() { struct tm timeinfo; if(!getLocalTime(&timeinfo)){ Serial.println("Failed to obtain time"); return; } //Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); u8g2.setFont(u8g2_font_wqy12_t_gb2312); u8g2.setFontDirection(0); u8g2.clearBuffer(); u8g2.setCursor(0, 50); u8g2.print(&timeinfo, "%F %A");//%A, %B %d %Y %H:%M:%S u8g2.setCursor(65, 40); u8g2.setFont(u8g2_font_unifont_t_chinese2); u8g2.print(&timeinfo, "%T"); u8g2.sendBuffer(); //delay(1000);//1000 } void setup() { // put your setup code here, to run once: Serial.begin(115200); u8g2.begin(); u8g2.enableUTF8Print(); wifi_connect(); configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTime(); } void loop() { // put your main code here, to run repeatedly: //printLocalTime(); httpRequest(); delay(1000);//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) { void OLEDDispaly(String cityName,int code_int, String temperature) { struct tm timeinfo; if(!getLocalTime(&timeinfo)){ Serial.println("Failed to obtain time"); return; } u8g2.setFont(u8g2_font_wqy12_t_gb2312); u8g2.setFontDirection(0); u8g2.clearBuffer(); //u8g2.drawXBMP(3, 3, 35, 32, cloudy); u8g2.setCursor(43 , 16 ); u8g2.println("多"); u8g2.setCursor(43 , 30 ); u8g2.println("云"); u8g2.setCursor(65, 10);//0,16 u8g2.print("城市: "); //u8g2.print(cityName); u8g2.print("延吉"); u8g2.setCursor(65, 25);//0,36 //u8g2.print("天气: "); //u8g2.print(weather); //u8g2.setCursor(65, 52);//0,52 u8g2.print("温度: "); u8g2.print(temperature); u8g2.print("℃"); u8g2.setCursor(0, 50); u8g2.print(&timeinfo, "%F %A");//%A, %B %d %Y %H:%M:%S u8g2.setCursor(65, 40); u8g2.setFont(u8g2_font_unifont_t_chinese2); u8g2.print(&timeinfo, "%T"); u8g2.setFont(u8g2_font_wqy12_t_gb2312); switch (code_int) { case 0: case 1: case 2: case 3: u8g2.drawXBMP(3, 3, 32, 32, sunny); u8g2.setCursor(43 , 16 ); u8g2.println("晴"); u8g2.setCursor(43 , 30 ); u8g2.println("天"); break; //国内城市白天晴 case 4: case 5: case 6: case 7: case 8: u8g2.drawXBMP(3, 3, 35, 32, cloudy); u8g2.setCursor(43 , 16 ); u8g2.println("多"); u8g2.setCursor(43 , 30 ); u8g2.println("云"); break; //多云 case 9: u8g2.drawXBMP(3, 3, 32, 32, ying); u8g2.setCursor(43 , 16 ); u8g2.println("阴"); u8g2.setCursor(43 , 30 ); u8g2.println("天"); break; //阴 case 10: u8g2.drawXBMP(3, 3, 32, 32, zhenyu); u8g2.setCursor(43 , 16 ); u8g2.println("阵"); u8g2.setCursor(43 , 30 ); u8g2.println("雨"); break; //阵雨 case 11: case 12: u8g2.drawXBMP(3, 3, 32, 32, light_rain); u8g2.setCursor(43 , 16 ); u8g2.println("雷"); u8g2.setCursor(43 , 30 ); u8g2.println("雨"); break; //雷雨 case 13: u8g2.drawXBMP(3, 3, 32, 32, xiaoyu); u8g2.setCursor(43 , 16 ); u8g2.println("小"); u8g2.setCursor(43 , 30 ); u8g2.println("雨"); break; //小雨 case 14: u8g2.drawXBMP(3, 3, 32, 32, zhongyu); u8g2.setCursor(43 , 16 ); u8g2.println("中"); u8g2.setCursor(43 , 30 ); u8g2.println("雨"); break; //中雨 case 15: case 16: case 17: case 18: u8g2.drawXBMP(3, 3, 37, 32, dayu); u8g2.setCursor(43 , 16 ); u8g2.println("大"); u8g2.setCursor(43 , 30 ); u8g2.println("雨"); break; //大雨 default: u8g2.drawXBMP(3, 3, 32, 32, sunny); u8g2.setCursor(43 , 16 ); u8g2.println("晴"); u8g2.setCursor(43 , 30); u8g2.println("天"); break; //国内城市白天晴//这里雪天的图片字模还没有搞,希望你可以来完成。 } u8g2.sendBuffer(); delay(1000); } 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 weather = obj1["now"]["text"].as(); String code = obj1["now"]["code"].as(); String temperature = obj1["now"]["temperature"].as(); int code_int = obj1["now"]["code"].as(); OLEDDispaly(cityName, code_int, temperature); //OLEDDispaly(cityName, weather, temperature); //int code_int = obj1["now"]["code"].as(); Serial.println(cityName); Serial.println(code); //Serial.println(weather); Serial.println(temperature); }

效果演示: link 在这里插入图片描述 在这里插入图片描述

> 这里是引用

使用Arduino开发ESP32(19):获取网络时间_Naisu的各种笔记-CSDN博客_arduino获取网络时间 https://blog.csdn.net/Naisu_kun/article/details/115627629?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162971773816780366588858%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162971773816780366588858&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-3-115627629.pc_search_result_cache&utm_term=esp32%E8%8E%B7%E5%8F%96%E7%BD%91%E7%BB%9C%E6%97%B6%E9%97%B4&spm=1018.2226.3001.4187 深入学习Arduino u8g2 OLED库,一篇就够_单片机菜鸟哥的博客-CSDN博客_u8g2 https://blog.csdn.net/dpjcn1990/article/details/92831760 0.96寸OLED取模教程——字符与图片取模_果果小师弟的博客-CSDN博客_oled取模软件使用方法 https://blog.csdn.net/qq_39400113/article/details/108036400 ESP8266+OLED显示天气_LeftOrRight:)的博客-CSDN博客 https://blog.csdn.net/qq_34970873/article/details/114642373?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163002721516780271547277%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163002721516780271547277&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-2-114642373.pc_search_result_cache&utm_term=esp32%E7%94%A8oled%E6%8C%89%E9%94%AE%E6%BB%9A%E5%8A%A8%E6%98%BE%E7%A4%BA&spm=1018.2226.3001.4187 天气现象代码说明 | 心知天气文档 (seniverse.com) https://docs.seniverse.com/api/start/code.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有