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

esp32获取网络时间和天气

目录

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

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

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

#include<WiFi.h>
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 <WiFi.h>
#include "time.h"
#include <ArduinoJson.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <Arduino.h>#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#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:%Su8g2.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();//连接WifiWiFi.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,16u8g2.print("城市: ");//u8g2.print(cityName);u8g2.print("延吉");u8g2.setCursor(65, 25);//0,36//u8g2.print("天气: ");//u8g2.print(weather);//u8g2.setCursor(65, 52);//0,52u8g2.print("温度: ");u8g2.print(temperature);u8g2.print("℃");u8g2.setCursor(0, 50);u8g2.print(&timeinfo, "%F    %A");//%A, %B %d %Y %H:%M:%Su8g2.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>();String weather = obj1["now"]["text"].as<String>();String code = obj1["now"]["code"].as<String>();String temperature = obj1["now"]["temperature"].as<String>();int code_int = obj1["now"]["code"].as<int>();OLEDDispaly(cityName, code_int, temperature);//OLEDDispaly(cityName, weather, temperature);//int code_int = obj1["now"]["code"].as<int>();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

esp32获取网络时间和天气相关推荐

  1. Arduino ESP32 获取网络时间并同步本地RTC时钟

    Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...

  2. stm32 + ESP8266 wifi获取网络时间和天气 stm32天气预报

    大家遇到什么什么题,可以私聊我. 近期由于某些原因,玩了一下stm32+WiFi获取网络天气和网络时间.之前一直觉得这个东西会有点难度,其实,做完了才发现,其实那只是想象中的难而已.现在,将这几天的成 ...

  3. Arduino ESP32 通过getString方法获取网络时间和气象数据

    Arduino ESP32-通过getString方法获取网络时间和气象数据 国家气象数据API接口:http://www.weather.com.cn/data/sk/101010100.html ...

  4. ESP32通过WIFI获取网络时间

    title: ESP32通过WIFI获取网络时间 一.这里首先要知道esp32的wifi如何连接,才能获取到网络服务器的时间 不知道wifi怎么连接的这里有相关链接--esp32wifi连接网络 二. ...

  5. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间

    目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...

  6. ESP8266获取网络时钟、天气

    硬件平台 正点原子ESP8266 前提 烧录到ESP8266的固件版本不要太老了,用比较新的(具体界限不清楚) 以安信可官网提供的AT固件举例,第5个不支持获取网络时间(AT指令不支持),我用的是第4 ...

  7. ESP32-C3 ESP-IDF 配置smartconfig 和 sntp 获取网络时间

    ESP32-C3 ESP-IDF 配置smartconfig 和 sntp 获取网络时间 /* Esptouch exampleThis example code is in the Public D ...

  8. ESP8266+STM32获取网络时间、OLED显示时间图片视频。

    学习过程不易,发文共享以下学习过程~ 先说说我的设计内容的组成: 目录 学习过程不易,发文共享以下学习过程~ 1. STM32控制ESP8266获取网络时间 第一步:电脑控制ESP8266获取时间数据 ...

  9. 获取网络时间并刷新本地时间(源码2)

    因为上次那个获取网络时间失效了(使用的是37端口),获取网络时间并刷新本地时间(源码1) 所以网上又找了一份代码,使用的是123端口,虽然没有测试成功,这里也做下记录,估计是本机环境问题,过两天再进行 ...

最新文章

  1. Linux文件系统大杂烩
  2. 软件架构设计原则和大数据平台架构层
  3. [云炬创业学笔记]第一章创业是什么测试1
  4. 更新失败无法连接更新服务器未响应,逆水寒客户端更新失败_长时间停滞未响应相关问题解答[图]...
  5. 《糖豆人:终极淘汰赛》成功背后蕴含了何种设计?
  6. Visual Studio DSL 入门 9---创建状态机的图形符号
  7. 浅谈数组常见遍历方法
  8. sql server 2008 每次都要use_这个方法选的都是强势股,短线操作,快进快出,不恋战,建议收藏...
  9. MySQL知识点查阅
  10. python qt build environment
  11. php制作入库单,教你如何利用vba制作自动登记数据的仓库入库单
  12. iOS应用内购基本步骤及问题
  13. Program size: Code, RO-data , RW-data, ZI-data
  14. hdu2243之AC自动机+矩阵乘法
  15. 电脑出现ntldr is missing无法开机怎么办
  16. 1807520-99-5,DNP-PEG4-alcohol含有二硝基苯和羟基的PEG连接剂
  17. Quartus | FPGA开发工具(Inter系列芯片)
  18. python hook pc微信_一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~...
  19. 职场上情商高的人有什么特征,盘点职场上情商高的人必做的3件事
  20. URL编码和Base64编码

热门文章

  1. (三)python计算夏普率
  2. 回归预测 | MATLAB实现WOA-LSTM鲸鱼算法优化长短期记忆神经网络多输入单输出回归预测
  3. 【Python合集】“所有晦暗都留给过往,从遇见你开始,凛冬散尽,星河长明”(附四款源码)
  4. 1999-2021年各省份普通⾼等学校在校学⽣数
  5. 电子元器件工作温度等级划分
  6. java超类 子类_Java超类引用子类对象的规律
  7. linux中nginx上传文件方法,nginx加载webdav模块实现http协议上传文件
  8. CCNA-(思科网络)静态路由配置
  9. 在canvas中绘制箭头
  10. java小区门禁管理模块_JAVA门禁系统