Funpack第12期Wio Terminal自动联网的天气预报仪
Funpack第12期Wio Terminal自动联网的天气预报仪完成任务
标签
嵌入式系统
voncg
更新2021-12-21
937

一.实现的功能

我的设计利用到了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()为显示两个附加屏幕

三.功能说明

1

展示首页今天的温度、白天天气、夜晚天气。

2

展示未来三天的天气情况、温度、湿度、风向、降雨量。

3

展示今天的空气质量情况,有空气质量指数AQI、PM2.5浓度、一氧化碳浓度、空气质量情况。

四.感悟

 首先很感谢电子森林,能够提供一个平台,能够在空余时间提高自己开发的能力。我作为一名大二学生,基于之前学习的esp8266的基础,根据任务目标,又更加深入的学习了Arduino开发与物联网的开发,学习到了更多的知识。同时我也期待未来还能够通过电子森林的funpack等活动学习更多的内容。感谢电子森林能够提供这个平台。希望未来电子森林能够有更多好玩有趣的项目。

 

附件下载
funpack.ino
代码
团队介绍
团队成员
voncg
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号