Funpack第十二期-Wio Terminal天气预报仪
基于Seeed Wio Terminal的天气预报仪,可以显示温湿度、天气情况、空气质量以及未来三天内的天气变化
标签
嵌入式系统
显示
氢化脱氯次氯酸
更新2022-01-05
747

1 Wio Terminal平台介绍

Wio Terminal 是基于SAMD51的微控制器,具有 Realtek RTL8720DN 支持的无线连接,与Arduino和MicroPython兼容。它的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。它同时支持蓝牙和Wi-Fi,为物联网项目提供了骨架。Wio Terminal自身配有 a 2.4” LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和红外发射器(IR 940nm)。 最重要的是它还有两个用于Grove生态系统 的多功能Grove端口和40个Raspberry pi兼容的GPIO引脚,用于支持更多附加组件。

FjT7serkpZZAFMS3Te3GUE-CcXcK

2 任务及实现方案

2.1 本期任务

任务二:制作一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化。

2.2 功能展示

开机后,wio terminal自动连接wifi,屏幕显示当前的天气状况、温度、湿度、空气质量等信息;按下右下角的按钮后,切换至天气预报模式,显示未来三天的天气状况、最高温度和最低温度。

Fi7Ki4nh2_fpB3I2wgaGbN8aqEPC

Fq78PrI-kLN5E7wcLHzvGzxDgQpm

3 实现过程

3.1 WiFi连接

WiFi部分使用了Seeed提供的rpcWiFi库,首先需要配置wifi的ssid和password:

const char* ssid = "ssid";//请使用你自己的WIFI
const char* password = "password";//请使用你自己的WIFI密码

随后在setup函数中调用ConnectWiFi函数连接WiFi:

// 连接WiFi
void ConnectWiFi(){
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to ");
  Serial.print(ssid);

  int i = 0;
  while (WiFi.status() != WL_CONNECTED && (i < 10)) {
    delay(1000);
    Serial.print('.');
    i++;
  }
  if (i == 10) { // 10s失败
    Serial.println("WiFi Connection Failed");
    display_wifi_failed();
  } else { // 成功
    Serial.println("");
    Serial.println("WiFi Connection Successful!");
    Serial.print("IP address:    ");
    Serial.println(WiFi.localIP());
  }
}

3.2 天气数据获取

本项目中天气数据的来源是和风天气,并使用Arduino获取和风天气第三方库(https://github.com/Ldufan/ESP8266_Heweather)对天气数据进行处理。使用该库后可以免去复杂的json信息提取过程,将天气信息的获取简化为以下4步:

第一步:建立weatherNow、WeatherForecast、AirQuality对象。

WeatherForecast WeatherForecast;
WeatherNow weatherNow;
AirQuality AirQuality;

第二步:配置请求信息,包括证书、APIKey(和风天气网站申请)、地点、单位和语言。

String UserKey = "your_key";   // 私钥 https://dev.heweather.com/docs/start/get-api-key
String Location = "101220101"; // 城市代码 https://github.com/heweather/LocationList,表中的 Location_ID
String Unit = "m";             // 公制-m/英制-i
String Lang = "en";            // 语言 英文-en/中文-zh
WeatherForecast.config(qweather_root_ca, UserKey, Location, Unit,  Lang);
weatherNow.config(qweather_root_ca, UserKey, Location, Unit, Lang);
AirQuality.config(qweather_root_ca, UserKey, Location, Unit, Lang);

第三步:获取天气更新。

weatherNow.get()
AirQuality.get()
WeatherForecast.get()

第四步:提取天气信息(以weatherNow为例)。

weatherNow.getServerCode();    // 获取API状态码   
weatherNow.getLastUpdate();    // 获取服务器更新天气信息时间
weatherNow.getTemp();          // 获取实况温度
weatherNow.getFeelLike();      // 获取实况体感温度
weatherNow.getIcon();          // 获取当前天气图标代码
weatherNow.getWeatherText();   // 获取实况天气状况的文字描述
weatherNow.getWindDir();       // 获取实况风向
weatherNow.getWindScale();     // 获取实况风力等级
weatherNow.getHumidity();      // 获取实况相对湿度百分比数值
weatherNow.getPrecip();        // 获取实况降水量,毫米

3.3 天气信息显示

LCD显示部分我使用了seeed的TFT_eSPI库,该库包含了显示字符串、图片、线条等功能,并且可以设置颜色和字体。

以显示空气质量为例,首先调用setCursor方法设置光标位置,再设置字体和字体颜色,最后调用tft的print或者println方法显示内容。

void display_air_quality(int aqi, int xpos, int ypos)
{
  tft.setCursor(xpos, ypos);
  tft.setFreeFont(CF_OL24);
  tft.setTextColor(TFT_BLACK);
  tft.print(F("AQI: "));
  tft.println(aqi);        // 实时空气质量指数
}

此外,屏幕上还可以显示天气的图标。首先需要下载和风天气的天气图标(https://github.com/qwd/Icons/tree/main/icons),将图标转换为bmp格式并进行处理并储存到SD卡中(处理教程:https://wiki.seeedstudio.com/Wio-Terminal-LCD-Loading-Image)。

Wio Terminal得到天气信息后,可以调用weatherNow.getIcon()获得图标编号,根据图标编号在SD卡中找到对应的图片即可进行显示(其中drawImage函数需要添加#include"RawImage.h"):

void display_icon(int icon_num, int xpos, int ypos)
{
  char buffer[30];
  sprintf(buffer, "bmp/rgb332/%d.bmp", icon_num);
  drawImage<uint8_t>(buffer, xpos, ypos);
}

4 心得体会

本次活动是Funpack的最后一期,在为期一年多的Funpack活动中,我不仅感受到了“玩板子”的快乐,还掌握了许多知识与开发技巧,在“踩坑“中不断进步。最后非常感谢硬禾学堂和得捷电子能提供这样一个平台,也期待未来能有更多这样的活动!

附件下载
WeatherForecast.zip
程序代码
icon.zip
天气图标
团队介绍
团队成员
氢化脱氯次氯酸
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号