【开源】用ESP32制作一个桌面天气预报站

7bc56bc3f3d91fd0711f34190ec1e247.png

九月一到,就有了秋意,秋意在一个多雾的黎明溜来,到了炎热的下午便不见踪影。它踮起脚尖掠过树顶,染红几片叶子,然后乘着一簇飞掠过山谷离开。秋天已悄悄到来,背上你的行囊,叫上你的小伙伴一起去外面看看缤纷的世界。这不我养的小青蛙已经出去旅行了,它总是会给我发一些它在旅游时候的照片,不过最近在外好像有了艳遇。给大家看看它寄回来的照片。

afa2c49645fdf318d28124fe5fb12d4f.png

我每当我看到我这里天气的变好或变差的时候,我都会去看看我的蛙儿子在哪里旅行。

气象站功能:

  1. 接受当地时间及当地天气,显示在屏幕上;

  2. 使用ESP32-E的电容触摸引脚,切换屏幕显示内容,显示青蛙旅行图片。

一、准备材料

1、硬件材料

  • ESP32-E主板

  • 3.7v电池

  • 3.7V电池充电器

  • TFT显示屏

5c941c74b9e3099c73cd0832aa74eb24.png

2、外壳打印:

获取图纸链接[1]

1fa806c6d8cea87a272c277f10e71646.png

二、制作过程

2.1 将各个模块按下图进行连接

bdeab83d2db1e67d533baa6fa43297ac.png

2.2 安装开发板和库文件

  • 关于如何下载本次使用的库文件,DFRobot_GDL库文件[2]

  • 关于如何使用Firebeetle Board-ESP32-E[3]

  • 关于如何下载库文件[4]

三、使用esp32获取网络天气及时间

ESP32同时支持STA以及AP模式的WiFi连接。

  • STA 模式:ESP32模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。

  • AP 模式:ESP32模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。

  • STA+AP 模式:两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。

 
  1. #include <WiFi.h>

  2. #include <HTTPClient.h>

  3. #include <ArduinoJson.h>

  4. HTTPClient http;

  5. const char* ssid="dfrobotOffice";

  6. const char* password="dfrobot2011";

  7. const char* ntpServer = "pool.ntp.org";

  8. const long gmtOffset_sec = 28800;

  9. const int daylightOffset_sec = 0;

  10. DynamicJsonDocument doc(1024);

  11. DynamicJsonDocument doc1(1024);

  12. void printLocalTime(){

  13.  struct tm timeinfo;

  14.  if(!getLocalTime(&timeinfo)){

  15.    Serial.println("Failed to obtian time");

  16.    return ;

  17.  }

  18.  Serial.println(&timeinfo,"%A, %B %d %Y %H:%M:%S");

  19. }

  20. void printLocalWeather(){

  21.     http.begin("http://www.weather.com.cn/data/cityinfo/101270101.html");

  22.     int httpCode = http.GET();

  23.     if(httpCode == HTTP_CODE_OK){

  24.       String pageData = http .getString();

  25.       //Serial.println(pageData);

  26.       deserializeJson(doc,pageData);

  27.       JsonObject obj = doc.as<JsonObject>();

  28.       String weatherInfo = obj["weatherinfo"];

  29.       deserializeJson(doc1,weatherInfo);

  30.       JsonObject obj1 = doc1.as<JsonObject>();

  31.       String city = obj1["city"];

  32.       String temp1 = obj1["temp1"];

  33.       String temp2 = obj1["temp2"];

  34.       String weather = obj1["weather"];

  35.       String cityInfo ="地点:"+ city;

  36.       String tempInfo =" 温度: " + temp1 + "~" + temp2;

  37.       String cityWeatherinfo = " 天气状况: " + weather;

  38.       Serial.println("获得天气情况如下:");

  39.       printLocalTime();

  40.       Serial.print(cityInfo);

  41.       Serial.print(tempInfo);

  42.       Serial.println(cityWeatherinfo);

  43.     }else{

  44.       Serial.println("GET ERR");

  45.     }

  46.     http.end();

  47. }

  48. void setup() {

  49. Serial.begin(115200);

  50.   Serial.printf("Connecting to %s",ssid);

  51.   WiFi.begin(ssid,password);

  52.   while(WiFi.status()!=WL_CONNECTED){

  53.     delay(500);

  54.     Serial.print(".");

  55.   }

  56.   Serial.println(" CONNECTED");

  57.   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  58.  // printLocalWeather();  

  59. }

  60. void loop() {

  61.   if(WiFi.status() == WL_CONNECTED){

  62.     printLocalWeather();  

  63.   }else{

  64.     Serial.println("WiFi  Disconnect");

  65.    }

  66. }

说明:本Demo实现了通过WiFi功能获取网络时间以及通过访问国家气象局提供的http://www.weather.com.cn/datalcityinfo/101010100.html来获取天气情况,本接口中“101010100"为城市代码。

注意:该例程需要下载ArduinoJson库,下载方式如下图:

38d9c705f71229040a84a2e8c95ad803.png

90678b39bae7d0aa2d8c3244f4172e58.png

结果

d89c8d2cf3f874057f4712a22379323c.png

四、添加旋转太空人图片

4.1 旋转太空人的动态图

其实是从动态图里面截取下来的4张图片  通过每100毫秒切换一张图片,达到旋转太空人的形态。

e9d4144a43d5a396d3fcbeae61bd704d.png

4.2 把图片转换成数组

49d1709d92d79ccfaf195606410b3636.png

4.3 把图片的数组存放到.h文件下

9a806cd8053237e9115dcad57a000b96.png

4.4 图片的使用代码如下

 
  1. #include <DFRobot_GDL.h>

  2. #include "BMP.h"

  3. #define TFT_DC  D2

  4. #define TFT_CS  D6

  5. #define TFT_RST D3

  6. #define PICNUMBER 6

  7. DFRobot_ST7789_240x240_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);

  8. void setup() {

  9.     screen.begin();

  10. }

  11. void loop() {

  12.   screen.drawPIC(/*x=*/0,/*y=*/124,/*w=*/124,/*h=*/124,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_black1);

  13.   delay(100);

  14.   screen.drawPIC(/*x=*/0,/*y=*/124,/*w=*/124,/*h=*/124,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_black2);

  15.   delay(100);

  16.   screen.drawPIC(/*x=*/0,/*y=*/124,/*w=*/124,/*h=*/124,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_black3);

  17.   delay(100);

  18.   screen.drawPIC(/*x=*/0,/*y=*/124,/*w=*/124,/*h=*/124,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_black4);

  19.   delay(100);

  20.   screen.drawPIC(/*x=*/0,/*y=*/124,/*w=*/124,/*h=*/124,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_black5);

  21. }

4.5 图片动态展示

74c2b2c28c5ab73f4bd6d94926471f4d.png

五、把从网络上获取到的天气和时间信息显示在TFT屏幕

5.1 python环境搭建

在使用setup.py脚本生成自定义字体之前,需要做如下准备:

  • 登录网址https://www.python.org/downloads/,下载python3.6及以上版本;

  • 安装完毕后,需要用下列命令安装python第三方依赖包:

  • pip3 install numpy

  • pip install freetype-py

  • pip install chardet

5.2 生成自定义字体

把ttf文件放在库文件的对应ttf文件夹下,这里我提供了一个ttf文件,供大家使用。链接获取[5]:

  • 将TTF字体文件存放在ttf文件夹里,例如:SIMKAI.TTF(简体字 楷体)

  • text.txt文件中输入你想生成的字符,例如:你好,世界!

  • 打开config.txt文件,配置生成字体文件的名字前缀和字体大小

f5718ecf93c305b076fd296a143f1a4a.png

5.3 在屏幕上显示

  • 运行setup.py脚本,会在font文件夹生成一系列后缀名为.h的字体文件,并弹出一个font.txt的文本,再进行以下步骤,即可在屏上显示:你好,世界!

  • 将font文件夹里的文件复制到DFRobot_GDL\src\Fonts\Fonts目录下;

  • 将弹出的font.txt的内容粘贴到DFRobot_GDL\src\Fonts\DFRobot_Font.h文件中;

  • 打开Arduino IDE,构造屏对象,如tft,调用tft.setFont(&SIMKAIFont48pt);

  • 调用tft.println("你好,世界!"),此时即可在屏上显示"你好,世界!"

3a38d09aead9e297e54c0386890365db.png

5.4 显示天气和时间的代码如下

 
  1. #include <DFRobot_GDL.h>

  2. #include <WiFi.h>

  3. #include <HTTPClient.h>

  4. #include <ArduinoJson.h>

  5. #include "BMP.h"

  6. HTTPClient http;

  7. const char* ssid="dfrobotOffice";

  8. const char* password="dfrobot2011";

  9. const char* ntpServer = "pool.ntp.org";

  10. const long gmtOffset_sec = 28800;

  11. const int daylightOffset_sec = 0;

  12. DynamicJsonDocument doc(1024);

  13. DynamicJsonDocument doc1(1024);

  14. #define TFT_DC  D2

  15. #define TFT_CS  D6

  16. #define TFT_RST D3

  17. #define PICNUMBER 6

  18. String weekDays[]={"周天", "周一", "周二","周三", "周四", "周五", "周六"};

  19. DFRobot_ST7789_240x240_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);

  20. void setup() {

  21.   Serial.begin(115200);

  22.   screen.begin();

  23.   Serial.printf("Connecting to %s",ssid);

  24.   WiFi.begin(ssid,password);

  25.   while(WiFi.status()!=WL_CONNECTED){

  26.     delay(500);

  27.     Serial.print(".");

  28.   }

  29.   Serial.println(" CONNECTED");

  30.   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  31.   screen.fillScreen(COLOR_RGB565_BLACK);  

  32. }

  33. void printLocalWeather(){

  34.     http.begin("http://www.weather.com.cn/data/cityinfo/101270101.html");

  35.     int httpCode = http.GET();

  36.     if(httpCode == HTTP_CODE_OK){

  37.       String pageData = http .getString();

  38.       //Serial.println(pageData);

  39.       deserializeJson(doc,pageData);

  40.       JsonObject obj = doc.as<JsonObject>();

  41.       String weatherInfo = obj["weatherinfo"];

  42.       deserializeJson(doc1,weatherInfo);

  43.       JsonObject obj1 = doc1.as<JsonObject>();

  44.       String city = obj1["city"];

  45.       String temp1 = obj1["temp1"];

  46.       String temp2 = obj1["temp2"];

  47.       String weather = obj1["weather"];

  48.       String cityInfo = city;

  49.       String tempInfo =temp1 + "~" + temp2;

  50.       String cityWeatherinfo =weather;

  51.       Serial.println("获得天气情况如下:");

  52.       Serial.print(cityInfo);

  53.       Serial.print(tempInfo);

  54.       Serial.println(cityWeatherinfo);

  55.       

  56.       struct tm timeinfo;

  57.       if(!getLocalTime(&timeinfo)){

  58.       Serial.println("Failed to obtian time");

  59.       return ;

  60.       }

  61.       Serial.println(&timeinfo, "%F %R %u"); // 格式化输出

  62.       //显示天气及时间信息

  63.       screen.setFont(&simkaiFont72pt );//Set the font to FreeMono12pt7b

  64.       screen.setCursor(/*x=*/15,/*y=*/0);

  65.       screen.println(&timeinfo,"%H");

  66.       screen.setCursor(/*x=*/15,/*y=*/55);

  67.       screen.println(&timeinfo,"%M");

  68.       screen.setFont(&simkaiFont72pt );//Set the font to FreeMono12pt7b

  69.       screen.setCursor(/*x=*/0,/*y=*/0);

  70.       screen.setTextColor(COLOR_RGB565_LGRAY);

  71.       screen.setTextWrap(true);

  72.       screen.setFont(&simkaiFont48pt );//Set the font to FreeMono12pt7b

  73.       screen.setCursor(/*x=*/124,/*y=*/0);

  74.       screen.println(weekDays[timeinfo.tm_wday]);

  75.       screen.setFont(&simkaiFont24pt );//设置字体大小 为24像素点大小

  76.       screen.setCursor(/*x=*/130,/*y=*/70); //设置显示光标

  77.       screen.println(cityWeatherinfo);//屏幕显示天气状况,如多云转晴类字样

  78.       screen.drawPIC(/*x=*/125,/*y=*/200,/*w=*/24,/*h=*/24,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_black6);//屏幕显示位置图标

  79.       screen.setFont(&simkaiFont36pt );//设置字体大小 为36像素点大小

  80.       screen.setCursor(/*x=*/120,/*y=*/135);//设置显示光标

  81.       screen.println(tempInfo);//屏幕显示温度信息

  82.       screen.setCursor(/*x=*/204,/*y=*/135);

  83.       screen.println("°");//显示温度的符号

  84.       screen.setCursor(/*x=*/150,/*y=*/190);

  85.       screen.println(cityInfo);//屏幕显示你所在城市的位置信息   

  86.     }else{

  87.       Serial.println("GET ERR");

  88.     }

  89.     http.end();

  90. }

  91. void loop() {

  92.     if(WiFi.status() == WL_CONNECTED){

  93.     printLocalWeather();  

  94.   }else{

  95.     Serial.println("WiFi  Disconnect");

  96.    }

  97. }

5.5 显示效果

ad4159e0bd8599e0d09b181b47873424.png

六、使用电容触摸显示青蛙儿子旅行照片

6.1 电容按键

ESP32提供了电容触摸传感器的功能, 共有T0,T2~T9 共 9个touch传感器可用.分别对应引脚4、2、15、13、12、14、27、33、32. 无需设置PinMode,touchRead()返回值为0~255. 触摸强度越大,返回值越小。烧录此例程,将使用4/D12引脚作为触摸按键,并通过串口监视器返回触摸值。

 
  1. void setup()

  2. {

  3.   Serial.begin(9600);

  4. }

  5. void loop()

  6. {

  7.    Serial.printf("touch:%d\n",touchRead(4));

  8. }

结果

74cc5a86aea231af30727574361ca783.png

6.2 选择放置的图片

492ff8301520dc7f7d82fbe3074b8921.png

6.3 触摸一次就切换一次图片代码

 
  1. #include <DFRobot_GDL.h>

  2. #include "BMP.h"

  3. #define TFT_DC  D2

  4. #define TFT_CS  D6

  5. #define TFT_RST D3

  6. #define PICNUMBER 6

  7. uint8_t randNumber;

  8. DFRobot_ST7789_240x240_HW_SPI screen(/*dc=*/TFT_DC,/*cs=*/TFT_CS,/*rst=*/TFT_RST);

  9. uint8_t printfrog(uint8_t number){

  10.     switch(number){

  11.     case 0:

  12.     screen.drawPIC(/*x=*/0,/*y=*/0,/*w=*/240,/*h=*/240,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_qingwa1);//显示的随机图片

  13.     delay(2000);

  14.     break;

  15.     case 1:

  16.     screen.drawPIC(/*x=*/0,/*y=*/0,/*w=*/240,/*h=*/240,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_qingwa2);

  17.     delay(2000);

  18.     break;

  19.     case 2:

  20.     screen.drawPIC(/*x=*/0,/*y=*/0,/*w=*/240,/*h=*/240,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_qingwa3);

  21.     delay(2000);

  22.     break;

  23.     case 3:

  24.     screen.drawPIC(/*x=*/0,/*y=*/0,/*w=*/240,/*h=*/240,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_qingwa4);

  25.     delay(2000);

  26.     break;

  27.     case 4:

  28.     screen.drawPIC(/*x=*/0,/*y=*/0,/*w=*/240,/*h=*/240,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_qingwa5);

  29.     delay(2000);

  30.     break;

  31.     case 5:

  32.     screen.drawPIC(/*x=*/0,/*y=*/0,/*w=*/240,/*h=*/240,/*bitmap gImage_Bitmap=*/( uint8_t*)gImage_qingwa6);

  33.     delay(2000);

  34.     break;

  35.     }

  36.   }

  37. void setup() {

  38.   Serial.begin(115200);

  39.   screen.begin();

  40. }

  41. void loop() {

  42.      if(touchRead(4)<=20)

  43.    {

  44.     screen.fillScreen(COLOR_RGB565_BLACK);  

  45.     Serial.println("摸到了");

  46.     randNumber =random(PICNUMBER);

  47.     Serial.println(randNumber);//随机数的打印

  48.     printfrog(randNumber);

  49.     }

  50.     else{

  51.       Serial.println("没有摸到");

  52.       }

  53.   }

6.4  随机触摸显示图片效果展示

65096fc07059f14c2b56fb1c3d7df24e.png

七、 完整功能代码展示

点击左下角阅读原文查看

从这次的小应用中我学会了很多东西,比如在tft屏幕上显示图片、动态图、中文。如何抓取天气信息,如何把抓取到的信息显示到tft屏幕上。

所以去旅行吧,不理会繁杂的琐事,自由自在地,去体验一个城市,一段故事,留下一片欢笑。

原文链接:https://mc.dfrobot.com.cn/thread-311127-1-1.html

项目作者: 创客达闻西

首发于DF创客社区

开源项目,转载请务必注明项目出处与原作者信息

参考资料

[1]

图纸链接: https://mc.dfrobot.com.cn/forum.php?mod=attachment&aid=MTMzNjgyfGE2NzAxYmY2YzNkOTc5MDk0MTJmNjkyOTNmOWIxNzJhfDE2MzM5MzQwNTM%3D&request=yes&_f=.rar

[2]

DFRobot_GDL库文件: https://codeload.github.com/DFRobot/DFRobot_GDL/zip/master

[3]

使用Firebeetle Board-ESP32-E: https://wiki.dfrobot.com.cn/_SKU_DFR0654_FireBeetle_Board_ESP32_E

[4]

下载库文件: https://mc.dfrobot.com.cn/thread-1854-1-1.html

[5]

ttf文件: https://mc.dfrobot.com.cn/forum.php?mod=attachment&aid=MTMzMzIzfGQ5NDRmNTVhNjk5MGVlYzI4NjExNTk5ZDZmMjc3YjFlfDE2MzM5MzQwNTM%3D&request=yes&_f=.rar

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以提供一些建议,但最终的实现取决于您的需求和技术水平。首先,您需要搜集所需的组件,如esp32,Lvgl,WiFi模块等。其次,您需要确定网络天气时钟的功能,以及如何实现它们。最后,您需要开发和调试代码,以完成您的项目。 ### 回答2: ESP32一个非常强大的开发板,具有Wi-Fi和蓝牙连接功能。Lvgl是一个开源跨平台的GUI库,可以用于制作各种应用界面。现在,我将用300字中文回答如何使用ESP32和Lvgl来制作一个网络天气时钟。 首先,我们需要搭建ESP32的开发环境。这包括安装Arduino IDE和ESP32的开发库。接下来,我们将安装并配置Lvgl库。此外,我们还需要安装Json库,用于解析天气数据。 然后,我们需要通过Wi-Fi连接到互联网。我们可以使用ESP32的内置Wi-Fi模块来连接到无线网络,并获取天气数据。我们需要预先获取一个天气API的密钥,并根据API文档中的要求获取天气数据。 接下来,我们需要设计和创建界面。我们可以使用Lvgl库中的各种控件来创建时钟和天气显示。可以创建一个时钟控件,并使用时间库获取当前时间。然后,我们可以创建一个文本框来显示天气数据。 最后,我们需要使用Json库解析天气数据,并将其显示在界面上。我们可以使用ESP32的HTTP客户端库来发送API请求,并使用Json库解析和获取所需的天气数据。 在代码编写完成后,我们可以将代码烧录到ESP32开发板中,并通过串口监视器来进行调试和查看输出。 总结起来,使用ESP32和Lvgl来制作一个网络天气时钟需要完成以下步骤:搭建开发环境、连接到Wi-Fi和获取天气数据、创建界面、解析天气数据、编写和烧录代码。通过这个过程,我们可以实现一个功能强大的网络天气时钟。 ### 回答3: 使用ESP32和LVGL编写网络天气时钟是一种将网络天气数据与时钟功能结合的创新方案。ESP32是一款功能强大的物联网开发板,而LVGL是一款开源的图形库,能够提供丰富的用户界面功能。 首先,我们可以通过ESP32连接到互联网,使用WiFi或者以太网连接,以获取实时的天气数据。通过与天气API进行通信,可以获取到当地的天气信息,例如温度、湿度、风速等。 然后,利用LVGL的图形库功能,我们可以在屏幕上创建一个美观的时钟界面,并实时显示当前的时间和日期。可以使用LVGL中的时钟小部件来显示时间,并使用合适的字体和样式来提高用户体验。 此外,我们可以利用LVGL的图表功能来显示天气趋势。通过将天气数据以图表的形式表示出来,用户可以直观地了解未来一段时间的天气变化。 另外,LVGL还提供了按钮、滑块等用户交互控件,我们可以利用这些控件来增加一些额外的功能,例如用户可以通过按钮切换不同城市的天气信息,或者调整屏幕亮度等。 最后,将ESP32和LVGL进行集成,在开发板上运行我们编写的代码,就可以实现一个功能齐全的网络天气时钟。用户可以通过屏幕直观地获得当前的时间和日期,同时还可以获取实时的天气信息,方便用户决策出门及日常生活。这样的天气时钟不仅提供了时钟的基本功能,还能够通过与网络的结合,提供更多的实用功能,使生活更加便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值