当前位置:   article > 正文

ESP32获取网络时间_esp32获取时间

esp32获取时间

一:目的

时间是软硬件系统或设备中比较重要的东西,特别是需要和外部进行交互时就更加需要用到有个统一的时间了。目前来说只要能联网的设备的时间主要是从网络时间服务器(NTP)上获取的,这篇文章将对此做个简单的说明。

二:基础说明

Arduino core for the ESP32中获取网络时间是非常简单的,只要下面几步就行:

  • 使用STA或ETH模式连上互联网;
  • 使用下面函数从网络时间服务器上获取并设置时间:

      void configTime(long gmtOffset_sec, int daylightOffset_sec, const char* server1, const char*        server2 = nullptr, const char* server3 = nullptr)

      网络时间服务器最常用的主机名是 pool.ntp.org ;
      通过网络时间服务器获得的时间是世界协调时间(UTC)/格林尼治时间(GMT),不同地区          的时间可以通过时区换算, gmtOffset_sec 参数就是用来修正时区的,比如对于我们东八区(        UTC/GMT+08:00)来说该参数就需要填写 8 * 3600 ;
       如果使用夏令时 daylightOffset_sec 就填写3600,否则就填写0;

设置完成后就可以使用下面函数读取当前时间了: 

  bool getLocalTime(struct tm * info, uint32_t ms = 5000)
  ms 为该操作超时时间,超时则返回false;
  info 是一个 struct tm 结构体对象,用于接收当前时间; 

三:示例演示 

Arduino core for the ESP32中获取网络时间是非常简单的,只要先连上网,然后就可以调用库中封装的方法获取网络时间了。下面是个简单的示例演示: 

  1. #include <WiFi.h>
  2. const char *ssid = "********"; //你的网络名称
  3. const char *password = "********"; //你的网络密码
  4. const char *ntpServer = "pool.ntp.org";
  5. const long gmtOffset_sec = 8 * 3600;
  6. const int daylightOffset_sec = 0;
  7. void printLocalTime()
  8. {
  9. struct tm timeinfo;
  10. if (!getLocalTime(&timeinfo))
  11. {
  12. Serial.println("Failed to obtain time");
  13. return;
  14. }
  15. Serial.println(&timeinfo, "%F %T %A"); // 格式化输出
  16. }
  17. void setup()
  18. {
  19. Serial.begin(115200);
  20. Serial.println();
  21. WiFi.begin(ssid, password);
  22. while (WiFi.status() != WL_CONNECTED)
  23. {
  24. delay(500);
  25. Serial.print(".");
  26. }
  27. Serial.println("WiFi connected!");
  28. // 从网络时间服务器上获取并设置时间
  29. // 获取成功后芯片会使用RTC时钟保持时间的更新
  30. configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  31. printLocalTime();
  32. WiFi.disconnect(true);
  33. WiFi.mode(WIFI_OFF);
  34. Serial.println("WiFi disconnected!");
  35. }
  36. void loop()
  37. {
  38. delay(1000);
  39. printLocalTime();
  40. }

 

 

         

四:额外说明

      网络时间服务器

可用的网络时间服务器主要有下面一些:

 

 

 

struct tm结构体与格式化输出

该结构体代码如下:

  1. struct tm {
  2. int tm_sec; // 秒,取值0~59;
  3. int tm_min; // 分,取值0~59;
  4. int tm_hour; // 时,取值0~23;
  5. int tm_mday; // 月中的日期,取值1~31;
  6. int tm_mon; // 月,取值0~11;
  7. int tm_year; // 年,其值等于实际年份减去1900;
  8. int tm_wday; // 星期,取值0~6,0为周日,1为周一,依此类推;
  9. int tm_yday; // 年中的日期,取值0~365,0代表1月1日,1代表1月2日,依此类推;
  10. int tm_isdst; // 夏令时标识符,实行夏令时的时候,tm_isdst为正;不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负
  11. };

 该结构体可以格式化输出,格式化规则如下:

  1. %a 星期几的简写
  2. %A 星期几的全称
  3. %b 月分的简写
  4. %B 月份的全称
  5. %c 标准的日期的时间串
  6. %C 年份的后两位数字
  7. %d 十进制表示的每月的第几天
  8. %D 月/天/年
  9. %e 在两字符域中,十进制表示的每月的第几天
  10. %F 年-月-日
  11. %g 年份的后两位数字,使用基于周的年
  12. %G 年分,使用基于周的年
  13. %h 简写的月份名
  14. %H 24小时制的小时
  15. %I 12小时制的小时
  16. %j 十进制表示的每年的第几天
  17. %m 十进制表示的月份
  18. %M 十时制表示的分钟数
  19. %p 本地的AM或PM的等价显示
  20. %r 12小时的时间
  21. %R 显示小时和分钟:hh:mm
  22. %S 十进制的秒数
  23. %t 水平制表符
  24. %T 显示时分秒:hh:mm:ss
  25. %u 每周的第几天,星期一为第一天 (值从06,星期一为0
  26. %U 第年的第几周,把星期日做为第一天(值从053
  27. %V 每年的第几周,使用基于周的年
  28. %w 十进制表示的星期几(值从06,星期天为0
  29. %W 每年的第几周,把星期一做为第一天(值从053
  30. %x 标准的日期串
  31. %X 标准的时间串
  32. %y 不带世纪的十进制年份(值从099
  33. %Y 带世纪部分的十进制年份
  34. %z,%Z 时区名称,如果不能得到时区名称则返回空字符

 五:获取时间并在0.96OLED屏中显示时间

 

  1. #include <Wire.h> // 使用 I2C 的库
  2. #include <Adafruit_GFX.h> //Adafruit 库写入显示器
  3. #include <Adafruit_SSD1306.h>
  4. #include <WiFi.h>
  5. const char *ssid = "nova6"; //你的网络名称
  6. const char *password = "zdx123456"; //你的网络密码
  7. #define SCREEN_WIDTH 128 // 使用的是 128×64 OLED 显示屏
  8. #define SCREEN_HEIGHT 64 //
  9. // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
  10. // I2C 通信协议
  11. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);// (-1) 参数表示您的 OLED 显示器没有 RESET 引脚
  12. void testscrolltext(void); //函数声明
  13. const char *ntpServer = "pool.ntp.org";
  14. const long gmtOffset_sec = 8 * 3600;
  15. const int daylightOffset_sec = 0;
  16. void printLocalTime()
  17. {
  18. struct tm timeinfo;
  19. if (!getLocalTime(&timeinfo))
  20. {
  21. Serial.println("Failed to obtain time");
  22. return;
  23. }
  24. Serial.println(&timeinfo, "%F %T %A"); // 格式化输出
  25. display.clearDisplay();// 清除显示
  26. display.setTextSize(2);// 设置文本大小
  27. display.setTextColor(WHITE);// 设置文本颜色
  28. display.setCursor(0, 30);//设置显示坐标
  29. // Display static text
  30. display.println(&timeinfo, "%F %T");//
  31. }
  32. void setup() {
  33. Serial.begin(115200);//115200 的波特率初始化串行监视器以进行调试
  34. WiFi.begin(ssid, password);
  35. while (WiFi.status() != WL_CONNECTED)
  36. {
  37. delay(500);
  38. Serial.print(".");
  39. }
  40. Serial.println("WiFi connected!");
  41. if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) //0x3d 0x3c 0x78 0x7A // Address 0x3D for 128x64
  42. {
  43. Serial.println(F("SSD1306 allocation failed"));
  44. for(;;);
  45. }
  46. delay(2000);
  47. display.clearDisplay();// 清除显示
  48. // display.clearDisplay();// 清除显示
  49. // display.setTextSize(3);// 设置文本大小
  50. // display.setTextColor(WHITE);// 设置文本颜色
  51. // display.setCursor(0, 30);//设置显示坐标
  52. // // Display static text
  53. // display.println("naiva");//
  54. // display.setTextColor(WHITE);// 设置文本颜色
  55. // display.setCursor(20, 0);//设置显示坐标
  56. // display.println("haha");//
  57. // display.display(); // 屏幕上实际显示文本
  58. configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  59. printLocalTime();
  60. }
  61. //void configTime(long gmtOffset_sec, int daylightOffset_sec, const char* server1, const char* server2 = nullptr, const char* server3 = nullptr)
  62. int i = 0;
  63. void loop() {
  64. // //testscrolltext();
  65. // display.clearDisplay();
  66. // display.setTextSize(1); //
  67. // display.setTextColor(WHITE);
  68. // display.setCursor(10, 0);
  69. // display.println(F("naiva"));
  70. // display.display(); //
  71. // delay(100);
  72. // display.startscrollright(0x00, 0x0F);// 从左到右滚动文本
  73. // delay(4000);
  74. // display.stopscroll();// 停止滚动
  75. // delay(1000);
  76. // display.startscrollleft(0x00, 0x0F);// 从右到左滚动文本
  77. // delay(4000);
  78. // display.stopscroll();
  79. // delay(1000);
  80. printLocalTime();
  81. display.setTextColor(WHITE);// 设置文本颜色
  82. display.setCursor(20, 0);//设置显示坐标
  83. display.println(i);//
  84. display.display(); // 屏幕上实际显示文本
  85. i = i+1;
  86. delay(1000);
  87. }
  88. void testscrolltext(void) {
  89. display.clearDisplay();
  90. display.setTextSize(2); // Draw 2X-scale text
  91. display.setTextColor(WHITE);
  92. display.setCursor(10, 0);
  93. display.println(F("NAIVA415"));
  94. display.display(); // Show initial text
  95. delay(100);
  96. // Scroll in various directions, pausing in-between:
  97. display.startscrollright(0x00, 0x0F);
  98. delay(2000);
  99. display.stopscroll();
  100. delay(1000);
  101. display.startscrollleft(0x00, 0x0F);
  102. delay(2000);
  103. display.stopscroll();
  104. delay(1000);
  105. display.startscrolldiagright(0x00, 0x07);
  106. delay(2000);
  107. display.startscrolldiagleft(0x00, 0x07);
  108. delay(2000);
  109. display.stopscroll();
  110. delay(1000);
  111. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/472008
推荐阅读
相关标签
  

闽ICP备14008679号