内容介绍
内容介绍
简介
Wio Terminal的运行速度为 120MHz (最高可达200MHz), 4MB 外部闪存和 192KB RAM。
Wio Terminal自身配有一个2.4英寸 LCD屏幕, 板载IMU(LIS3DHTR),麦克风,蜂鸣器,microSD卡槽,光传感器和940nm红外发射器。 除了这些它还有两个用于Grove生态系统的多功能Grove接口和兼容Raspberry pi的40个GPIO引脚,用于支持更多附加组件。
任务内容
任务二:
制作一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化
实现原理
首先先去心知天气注册一个账号
然后在控制台申请一个免费平台。试用版也行。
然后将密钥复制。
在Arduino里面填入密钥,就可以通过网络获取天气了。
代码
通过代码配置,初始化串口,WiFi,屏幕,定时器,之后连接心知天气的服务器,获取未来3天的温度和空气质量,获得数据后会关闭WiFi。当定时器计数到一定的时间之后,会再一次联网获取数据。
#include <TFT_eSPI.h>
#include "Seeed_FS.h"
#include "RawImage.h"
#include "Free_Fonts.h"
#include <Arduino.h>
#include <rpcWiFi.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <TimerTC3.h>
TFT_eSPI tft;
//心知官网请求地址 // 私钥 免费( ) 开发者(收费):99/年 没钱买
//需要申请开发者平台才能获取空气质量 屏幕大小320*240
//h ttp://api.seniverse.com/v3/weather/daily.json?key=&location=ningbo&language=en&unit=c&start=0&days=3
//h ttp://api.seniverse.com/v3/air/now.json?key=&location=ningbo&language=en&scope=city
const char* ssid = "9500S"; // 连接WiFi名
const char* password = "1234567890."; // 连接WiFi密码
// 将要连接的服务器地址,只能http 不能https
String seniverse_Weather = "http://api.seniverse.com/v3/weather/daily.json?key=&location=ningbo&language=en&unit=c&start=0&days=3";
String seniverse_Air_Quality = "http://api.seniverse.com/v3/air/daily.json?key=&language=zh-Hans&location=ningbo";
String seniverse_Timer = "http://quan.suning.com/getSysTime.do";//这个是苏宁网站提供的网络授时
String One_date;//日期
String One_text_day;//白天天气现象文字
int One_code_day;//白天天气现象代码
String One_text_night;//晚间天气现象文字
int One_code_night;//晚间天气现象代码
String One_high;//当天最高温度
String One_low;//当天最低温度
String One_humidity;//相对湿度,0~100,单位为百分比
String Tow_date;//日期
String Two_text_day;//白天天气现象文字
int Two_code_day;//白天天气现象代码
String Two_text_night;//晚间天气现象文字
int Two_code_night;//晚间天气现象代码
String Two_high;//当天最高温度
String Two_low;//当天最低温度
String Two_humidity;//相对湿度,0~100,单位为百分比
String Three_date;//日期
String Three_text_day;//白天天气现象文字
int Three_code_day;//白天天气现象代码
String Three_text_night;//晚间天气现象文字
int Three_code_night;//晚间天气现象代码
String Three_high;//当天最高温度
String Three_low;//当天最低温度
String Three_humidity;//相对湿度,0~100,单位为百分比
String One_Aqi;//空气质量
String Two_Aqi;//空气质量
String Three_Aqi;//空气质量
int timer_x = 0;
bool isLEDOn = false;
#define One_X 26
#define One_Y 75
#define Two_X 126
#define Two_Y 75
#define Three_X 226
#define Three_Y 75
void Weather(void);
void Air_Quality(void);
void WiFi_Init(void);
void Tft_Lcd(void);
//未来3天天气
void Weather(void)
{
HTTPClient http;
DynamicJsonDocument doc(4096);
http.begin(seniverse_Weather);
int httpCode = http.GET();
if(httpCode > 0)
{
Serial.printf("HTTP Get Code: %d\r\n", httpCode);
if(httpCode == HTTP_CODE_OK)
{
String resBuff = http.getString();
Serial.println(resBuff);
deserializeJson(doc, resBuff); //开始使用Json解析
One_date = doc["results"][0]["daily"][0]["date"].as<String>();
One_text_day = doc["results"][0]["daily"][0]["text_day"].as<String>();
One_code_day = doc["results"][0]["daily"][0]["code_day"].as<int>();
One_text_night = doc["results"][0]["daily"][0]["text_night"].as<String>();
One_code_night = doc["results"][0]["daily"][0]["code_night"].as<int>();
One_high = doc["results"][0]["daily"][0]["high"].as<String>();
One_low = doc["results"][0]["daily"][0]["low"].as<String>();
One_humidity = doc["results"][0]["daily"][0]["humidity"].as<String>();
Serial.println("1");
// String One_text_day_11111 = doc["results"][0]["daily"][0]["text_day"].as<int>();
}
}else
{
Serial.printf("HTTP Get Error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
}
//空气质量
void Air_Quality(void)
{
HTTPClient http1;
DynamicJsonDocument doc(2048);
http1.begin(seniverse_Air_Quality);
int httpCode1 = http1.GET();
Serial.println(httpCode1);
if(httpCode1 > 0)
{
Serial.printf("HTTP Get Code: %d\r\n", httpCode1);
if(httpCode1 == HTTP_CODE_OK)
{
String resBuff1 = http1.getString();
Serial.println(resBuff1);
deserializeJson(doc, resBuff1); //开始使用Json解析
One_Aqi = doc["results"][0]["daily"][0]["aqi"].as<String>();
Two_Aqi = doc["results"][0]["daily"][1]["aqi"].as<String>();
Three_Aqi = doc["results"][0]["daily"][2]["aqi"].as<String>();
// String One_text_day_11111 = doc["results"][0]["daily"][0]["text_day"].as<String>();
}
}else
{
Serial.printf("HTTP Get Error: %s\n", http1.errorToString(httpCode1).c_str());
}
http1.end();
}
void WiFi_Init(void)
{
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.print("Connected to ");
Serial.println(ssid);
}
void Tft_Lcd(void){
int One_text_day_tast = One_code_day;//当天的白天代码
int Two_text_day_tast = Two_code_day;//当天的白天代码
int Three_text_day_tast = Three_code_day;//当天的白天代码
String One_date_tast = One_date;//当天的日期
String One_high_tast = One_high;//当天最高温度
String One_low_tast = One_low;//当天最低温度
String One_humidity_tast = One_humidity;//相对湿度,0~100,单位为百分比
String One_Aqi_tast = One_Aqi;//空气质量
String Two_Aqi_tast = Two_Aqi;//空气质量
String Three_Aqi_tast = Three_Aqi;//空气质量
// Serial.println(One_text_day_tast);
switch(One_text_day_tast){
case 0:drawImage<uint16_t>("Sunny.bmp", One_X, One_Y);break;
case 1:drawImage<uint16_t>("Clear.bmp", One_X, One_Y);break;
case 4:drawImage<uint16_t>("Cloudy.bmp", One_X, One_Y);break;
case 5:drawImage<uint16_t>("SunnyCloudy.bmp", One_X, One_Y);break;
case 6:drawImage<uint16_t>("ClearCloudy.bmp", One_X, One_Y);break;
case 7:drawImage<uint16_t>("SunnyCloudy.bmp", One_X, One_Y);break;
case 8:drawImage<uint16_t>("ClearCloudy.bmp", One_X, One_Y);break;
case 9:drawImage<uint16_t>("Overcast.bmp", One_X, One_Y);break;
case 10:drawImage<uint16_t>("Shower.bmp", One_X, One_Y);break;
case 11:drawImage<uint16_t>("Thundershower.bmp", One_X, One_Y);break;
case 12:drawImage<uint16_t>("ThundershowerwithHail.bmp", One_X, One_Y);break;
case 13:drawImage<uint16_t>("LightRain.bmp", One_X, One_Y);break;
case 14:drawImage<uint16_t>("ModerateRain.bmp", One_X, One_Y);break;
case 15:drawImage<uint16_t>("HeavyRain.bmp", One_X, One_Y);break;
case 16:drawImage<uint16_t>("HeavyRain.bmp", One_X, One_Y);break;
case 17:drawImage<uint16_t>("HeavyStorm.bmp", One_X, One_Y);break;
case 18:drawImage<uint16_t>("HeavyStorm.bmp", One_X, One_Y);break;
case 19:drawImage<uint16_t>("IceRain.bmp", One_X, One_Y);break;
case 20:drawImage<uint16_t>("Sleet.bmp", One_X, One_Y);break;
case 21:drawImage<uint16_t>("SnowFlurry.bmp", One_X, One_Y);break;
case 22:drawImage<uint16_t>("LightSnow.bmp", One_X, One_Y);break;
case 23:drawImage<uint16_t>("ModerateSnow.bmp", One_X, One_Y);break;
case 24:drawImage<uint16_t>("HeavySnow.bmp", One_X, One_Y);break;
case 25:drawImage<uint16_t>("Snowstorm.bmp", One_X, One_Y);break;
}
tft.setTextSize(2);//字体大小
tft.setTextColor(TFT_CYAN); //字体颜色
tft.drawString(One_date_tast,5,37);//One_date_tast
tft.drawString(Tow_date_tast,101,21);//Tow_date_tast
tft.drawString(Three_date_tast,200,37);//Three_date_tast
//温度
// tft.setFreeFont(FS12); //select Free, Serif, 12pt.
tft.setTextColor(TFT_ORANGE); //字体颜色
tft.drawString(One_low_tast,15,200);//One_low_tast
tft.drawString("~",39,200);
tft.drawString(One_high_tast,51,200);//One_high_tast
tft.drawString("'C",75,200);
tft.drawString(Two_low_tast,115,200);
tft.drawString("~",139,200);
tft.drawString(Two_high_tast,151,200);
tft.drawString("'C",175,200);
tft.drawString(Three_low_tast,215,200);
tft.drawString("~",239,200);
tft.drawString(Three_high_tast,251,200);
tft.drawString("'C",275,200);
//空气质量
tft.setTextColor(TFT_GREENYELLOW); //字体颜色
tft.drawString("AQI:",15,176);
tft.drawString(One_Aqi_tast,63,176);
tft.drawString("AQI:",115,176);
tft.drawString(Two_Aqi_tast,163,176);
tft.drawString("AQI:",215,176);
tft.drawString(Three_Aqi_tast,263,176);
//湿度
tft.setTextColor(TFT_BLUE); //字体颜色
tft.drawString("H:",15,152);//One_low_tast
tft.drawString("60",39,152);
tft.drawString("%",63,152);//One_low_tast
tft.drawString("H:",115,152);//One_low_tast
tft.drawString("60",139,152);
tft.drawString("%",163,152);//One_low_tast
tft.drawString("H:",215,152);//One_low_tast
tft.drawString("60",239,152);
tft.drawString("%",263,152);//One_low_tast
}
void timerIsr(){
timer_x++;
if(timer_x == 3600){
timer_x = 0;
Weather();
delay(1000);
Air_Quality();
Tft_Lcd();
}
digitalWrite(13, isLEDOn);
isLEDOn = !isLEDOn;
}
总结
通过本次任务,学会了如何使用该开发板,学习了JSON,学习了Arduino,学习了通过网络获取数据。
软硬件
附件下载
TFT.rar
团队介绍
一个平平无奇的大学生
评论
0 / 100
查看更多
猜你喜欢
Funpack第12期 - Wio Terminal - 天气预报仪使用Wio Terminal制作一个自动联网的天气预报仪,显示温湿度、天气情况、空气质量以及未来三天内的天气变化。
何小强
1471
Funpack12期活动 - 基于Wio Terminal的网络天气预报仪通过Arduino开发一款网络预报仪, 通过wifi访问天气API, 并且将数据显示在显示器上
显示界面主要有两个, 一个开机界面和一个数据的显示界面
caoyi
1138
Wio Terminal 天气预报仪 Funpack第12期上电后自动连接WiFi, 并通过心知天气API, 获取天气数据, 并在屏幕上显示
willcome0
1065