内容介绍
内容介绍
一.实现的功能
我的设计利用到了Wio Terminal自带的lcd显示屏幕、WiFi模块、三轴加速度计。
首先我利用其wifi模块接入手机热点,通过联网接入到心知天气中,通过向心知天气发送HTTP请求,将接收回来的json格式数据利用ArduinoJson库中的函数进行解析,定义全局变量保存数值,然后利用wio terminal自带的lcd库函数将数值设计屏幕,显示数值。
首先主界面显示的是今天的平均温度,白天天气,夜晚天气。
我们按下按键A进入第一个界面。显示未来三天的温度、天气、湿度、降雨量、风向。
我们按下按键B进入第二个界面。显示今天天气的空气质量,有今天空气的空气质量指数(AQI)、PM2.5颗粒物1小时平均值、一氧化碳1小时平均值、空气质量类别。
二.代码功能解释
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#include"LIS3DHTR.h"
#include"Free_Fonts.h"
#include"TFT_eSPI.h"
TFT_eSPI tft;
LIS3DHTR<TwoWire> lis;
float accelerator_readings[3];
const char* ssid = "baba"; // 连接WiFi名(此处使用taichi-maker为示例)
// 请将您需要连接的WiFi名填入引号中
const char* password = "hanwei123"; // 连接WiFi密码(此处使用12345678为示例)
// 请将您需要连接的WiFi密码填入引号中
const char* host = "api.seniverse.com"; // 将要连接的服务器地址
const int httpPort = 80; // 将要连接的服务器端口
//全局变量
static int tem;
static String dw,nw,date;
static String d0,d1,d2;
static int t0,t1,t2;
static String w0,w1,w2;
static int wa0,wa1,wa2;
static int h0,h1,h2;
static int r0,r1,r2;
static int api0,pm25_0,co0;
static String quality0;
// 心知天气HTTP请求所需信息
String reqUserKey = "StXgZQO4avUFYxivA"; // 私钥
String reqUserKey1 = "S8y1RE9GIzjkH9W8F"; // 私钥
String reqLocation = "Wuhu"; // 城市
String reqUnit = "c"; // 摄氏/华氏
这是基础头文件和利用到的一些全局变量值,配置基础的内容。
void setup(){
pinMode(WIO_KEY_A, INPUT_PULLUP);
pinMode(WIO_KEY_B, INPUT_PULLUP);
lis.begin(Wire1);
lis.setOutputDataRate(LIS3DHTR_DATARATE_25HZ);
lis.setFullScaleRange(LIS3DHTR_RANGE_2G);
float x_raw = lis.getAccelerationX();
float y_raw = lis.getAccelerationY();
float z_raw = lis.getAccelerationZ();
accelerator_readings[0] = x_raw; //store x-axis readings
accelerator_readings[1] = y_raw; //store y-axis readings
accelerator_readings[2] = z_raw; //store z-axis readings
Serial.begin(9600);
Serial.println("");
// 连接WiFi
connectWiFi();
}
初始化按键A、B,初始化加速度计,初始化串口。
void loop(){
int i=0;
// 建立心知天气API当前天气请求资源地址
String reqRes1 = "/v3/weather/daily.json?key=" + reqUserKey +
+ "&location=" + reqLocation + "&language=en&unit=" +
reqUnit + "&start=0&days=3";
String reqRes2 = "/v3/air/daily.json?key=" + reqUserKey1 +
+ "&language=en" +"&location=" + reqLocation;
// 向心知天气服务器服务器请求信息并对信息进行解析
httpRequest1(reqRes1);
if(i<=50){
httpRequest2(reqRes2);
i++;
}
//按键换页函数
if (digitalRead(WIO_KEY_A) == LOW) {
p2lcd();
Serial.println("A Key pressed");
delay(10000);
}
if (digitalRead(WIO_KEY_B) == LOW) {
p3lcd();
Serial.println("B Key pressed");
delay(10000);
}
pwmlcd();
}
循环里建立需要连接的两个资源地址,接受天气情况与空气质量。
按键检测,检测按键是否按下,进行换页。pwmlcd()显示首界面.
void connectWiFi(){
tft.begin();
tft.setRotation(3);
tft.fillScreen(TFT_BLACK);
tft.setFreeFont(FMB12);
tft.setCursor((320 - tft.textWidth("Connecting to Wi-Fi.."))/2, 120);
tft.print("Connecting to Wi-Fi..");
WiFi.begin(ssid, password); // 启动网络连接
Serial.print("Connecting to "); // 串口监视器输出网络连接信息
Serial.print(ssid); Serial.println(" ..."); // 告知用户NodeMCU正在尝试WiFi连接
int i = 0; // 这一段程序语句用于检查WiFi是否连接成功
while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED
Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
} // 同时NodeMCU将通过串口监视器输出连接时长读秒。
// 这个读秒是通过变量i每隔一秒自加1来实现的。
Serial.println(""); // WiFi连接成功后
Serial.println("Connection established!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
tft.fillScreen(TFT_BLACK);
tft.setCursor((320 - tft.textWidth("Connected!"))/2, 120);
tft.print("Connected!");
}
连接WiFi
void httpRequest1(String reqRes){
WiFiClient client;
String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + // 建立http请求信息
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n";
if (client.connect(host, 80)){
client.print(httpRequest); // 向服务器发送http请求信息
String status_response = client.readStringUntil('\n'); // 获取并显示服务器响应状态行
if(client.find("\r\n\r\n")); // 使用find跳过HTTP响应头
parseInfo1(client); // 利用ArduinoJson库解析心知天气响应信息
}
else {
Serial.println(" connection failed!");
}
client.stop(); //断开客户端与服务器连接工作
}
void httpRequest2(String reqRes){
WiFiClient client;
String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + // 建立http请求信息
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n";
if (client.connect(host, 80)){
client.print(httpRequest); // 向服务器发送http请求信息
String status_response = client.readStringUntil('\n'); // 获取并显示服务器响应状态行
if(client.find("\r\n\r\n")); // 使用find跳过HTTP响应头
parseInfo2(client); // 利用ArduinoJson库解析心知天气响应信息
}
else {
Serial.println(" connection failed!");
}
client.stop(); //断开客户端与服务器连接工作
}
向心知天气服务器服务器请求信息并对信息进行解析
void parseInfo1(WiFiClient client)
void parseInfo2(WiFiClient client)
是利用ArduinoJson库解析心知天气响应信息
void pwmlcd()首页显示,根据加速度计来亮屏
void p2lcd(),void p3lcd()为显示两个附加屏幕
三.功能说明
展示首页今天的温度、白天天气、夜晚天气。
展示未来三天的天气情况、温度、湿度、风向、降雨量。
展示今天的空气质量情况,有空气质量指数AQI、PM2.5浓度、一氧化碳浓度、空气质量情况。
四.感悟
首先很感谢电子森林,能够提供一个平台,能够在空余时间提高自己开发的能力。我作为一名大二学生,基于之前学习的esp8266的基础,根据任务目标,又更加深入的学习了Arduino开发与物联网的开发,学习到了更多的知识。同时我也期待未来还能够通过电子森林的funpack等活动学习更多的内容。感谢电子森林能够提供这个平台。希望未来电子森林能够有更多好玩有趣的项目。
附件下载
funpack.ino
代码
团队介绍
团队成员
voncg
评论
0 / 100
查看更多
猜你喜欢
Funpack第12期-Wio Terminal-自动联网的天气预报仪_LVGLFunpack第12期-Wio Terminal-自动联网的天气预报仪_LVGL
奈奎斯特不稳定
1577
Funpack第12期-使用wio terminal制作一个自动联网的天气预报仪使用wio terminal制作一个自动联网的天气预报仪,在设计界面显示温湿度、天气情况、空气质量以及未来三天内的天气变化。
MMA
1099
【Funpack第12期】基于Wio Terminal的自动联网天气预报仪基于Wio Terminal的自动联网天气预报仪,基于Arduino IDE及VSCode开发,可以连接WiFi后通过HTTP获取和风天气提供的天气API数据,通过JSON解析,并显示在LCD上,以及一些杂七杂八的实用功能。
葉SiR
1098