用StickC查看国外疫情数据-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1354|回复: 1

用StickC查看国外疫情数据

[复制链接]
发表于 2020-4-17 14:13 | 显示全部楼层 |阅读模式
通过HTTP请求获取数据,对返回网页内容进行字符串查找和截取操作,实现数据的提取,将最终结果显示到屏幕上。
IMG_4710.JPG
[mw_shl_code=arduino,true]#include <M5StickC.h>
#include <Arduino.h>
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>  
#include <ArduinoHttpClient.h>
/*____Wifi _____________________*/
#define WIFI_SSID "M5-5G"       // Enter your SSID here
#define WIFI_PASS "Office@888888"    // Enter your WiFi password here
const int NetworkTimeout = 30*1000; //网络超时时间
const int NetworkDelay = 2000;
double vbat = 0.0;
int discharge, charge;
double temp = 0.0;
double bat_p = 0.0;
double bat_p2 = 0.0;
int status = WL_IDLE_STATUS;
int infected=0;
int recovered=0;
int deaths=0;


WiFiClientSecure client;
HttpClient http(client,"www.worldometers.info", 443);
uint8_t bat_3[] =
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
  0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0xff,
  0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xdb, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xdb,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
};

uint8_t bat_2[] =
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
  0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0xff,
  0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xdb, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xdb,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
};

uint8_t bat_1[] =
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
  0x00, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0xff,
  0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
  0x00, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xdb,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
};



void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  M5.begin();
  M5.Lcd.setRotation(3);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(20, 25);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.printf("Connecting");
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    M5.Lcd.setCursor(20, 40);
    M5.Lcd.setTextSize(1);
    M5.Lcd.print("Please Wait...");
    delay(500);
  }
  M5.Lcd.setCursor(15, 25);
  M5.Lcd.setTextSize(2);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.println("Connected");
  IPAddress ip = WiFi.localIP();
  M5.Lcd.setCursor(0, 25);
  M5.Lcd.setTextSize(2);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.println(ip);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 25);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.setTextSize(2);
  M5.Lcd.println("Data Fetching");
  
}

void loop() {
check_country("India");
delay(2000);
check_country("Kuwait");
delay(2000);  
check_country("Saudi-Arabia");
delay(2000);
check_country("Qatar");
delay(2000);
check_country("US");
delay(2000);
check_country("Italy");
delay(2000);
check_country("China");
delay(2000);
check_country("Spain");
delay(2000);
  
}


void draw_country_screen(String sCountry){
  M5.Lcd.fillScreen(BLACK);
  battery_status();
  M5.Lcd.setRotation(3);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(ORANGE);
  M5.Lcd.setCursor(0, 15);
  M5.Lcd.print(sCountry + ":");

  // infected
  M5.Lcd.setTextColor(BLUE);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(10, 35);
  M5.Lcd.printf("Infected: %02d ",infected);
  //Serial.print("Infected:");
  //Serial.print(infected);

  // recovered
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(10, 50);
  M5.Lcd.printf("Recovered: %02d ",recovered);
  //Serial.print("Recovered:");
  //Serial.print(Recovered);


  // deaths
  M5.Lcd.setTextColor(RED);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(10, 65);
  M5.Lcd.printf("Deaths: %02d ",deaths);
  //Serial.print("Deaths:");
  //Serial.print(deaths);
      
}

void check_country(String sCountry) {
  int err =0;
  int readcounter = 0;
  int read_value_step = 0;
  String s1 = "";
  String s2 = "";
  
  err = http.get("/coronavirus/country/" + sCountry +"/"); //请求路径地址
  if (err == 0)
  {
    //Serial.println("Requesting ok");

    err = http.responseStatusCode(); //返回状态码
    if (err >= 0)
    {
   
      unsigned long timeoutStart = millis();   //超时起始时间
      char c;
      while ( (http.connected() || http.available()) &&     //如果连接正常数据读取完毕并且没有超时
             (!http.endOfBodyReached()) &&
             ((millis() - timeoutStart) < NetworkTimeout) )
      {
          if (http.available())  // 读取接收字符进行拼接
          {
              c = http.read();
              s2 = s2 + c;
              if (readcounter < 300) {  //每次读取300个字符
                readcounter++;
              } else {                  
                readcounter = 0;
                String tempString = "";
                tempString.concat(s1);
                tempString.concat(s2);
                // check infected first
                if (read_value_step == 0) {     //查找"Coronavirus Cases:"                          
                  int place = tempString.indexOf("Coronavirus Cases:");
                  if ((place != -1) && (place < 350)) {   //如果找到"Coronavirus Cases:"
                    read_value_step = 1;
                    s2 = tempString.substring(place + 15);  //在此位置+15个字符进行截取
                    tempString = s2.substring(s2.indexOf("#aaa") + 6);  //从#aaa后面的第6个字符开始进行截取
                    s1 = tempString.substring(0, (tempString.indexOf("</")));  //提取</前的字符
                    s1.remove(s1.indexOf(","),1);   //去掉","
                    //Serial.print("Coronavirus Cases: ");
                    //Serial.println(s1);
                    infected = s1.toInt(); //将字符转为数字
                  }
                  
                }
                // check deaths               
                if (read_value_step == 1) {
                  int place = tempString.indexOf("Deaths:");
                  if ((place != -1) && (place < 350)) {
                    read_value_step = 2;
                    s2 = tempString.substring(place + 15);
                    tempString = s2.substring(s2.indexOf("<span>") + 6);
                    s1 = tempString.substring(0, (tempString.indexOf("</")));
                    s1.remove(s1.indexOf(","),1);  
                    //Serial.print("Deaths: ");
                    //Serial.println(s1);
                    deaths = s1.toInt();
                  }
                }               
                // check recovered               
                if (read_value_step == 2) {
                  int place = tempString.indexOf("Recovered:");
                  if ((place != -1) && (place < 350)) {                  
                    s2 = tempString.substring(place + 15);
                    tempString = s2.substring(s2.indexOf("<span>") + 6);
                    s1 = tempString.substring(0, (tempString.indexOf("</")));
                    s1.remove(s1.indexOf(","),1);  
                    //Serial.print("Recovered: ");
                    //Serial.println(s1);
                    recovered = s1.toInt();
                    draw_country_screen(sCountry);
                    http.stop();
                    return;
                  }
                }               
      
                s1 = s2;
                s2 = "";
              }              
              
              timeoutStart = millis();
          }
          else
          {
              delay(NetworkDelay);
          }
      }
    }
    else
    {   
      //Serial.print("Getting response failed: ");
      //Serial.println(err);
    }
  }
  else
  {
    //Serial.print("Connect failed: ");
    //Serial.println(err);
  }
  http.stop();
  
}


void printWiFiStatus() {
  // print the SSID of the network you're attached to:
  //Serial.print("SSID: ");
  //Serial.println(WiFi.SSID());

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  //Serial.print("IP Address: ");
  //Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  //Serial.print("signal strength (RSSI):");
  //Serial.print(rssi);
  //Serial.println(" dBm");
}
void battery_status()
{
  vbat = M5.Axp.GetVbatData() * 1.1 / 1000;
  discharge = M5.Axp.GetIdischargeData() / 2;
  if (vbat >= 4)
  {
    M5.Lcd.pushImage(145, 1, 14, 8, bat_3);
  }
  else if (vbat >= 3.7)
  {
    M5.Lcd.pushImage(145, 1, 14, 8, bat_2);
  }
  else if (vbat < 3.7)
  {
    M5.Lcd.pushImage(145, 1, 14, 8, bat_1);
  }
  else
  {}
  // M5.Lcd.setTextColor(TFT_YELLOW);
  // M5.Lcd.setCursor(140, 12);
  // M5.Lcd.setTextSize(1);
  // M5.Lcd.println(discharge);
}[/mw_shl_code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 10:03 , Processed in 0.081757 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表