ESP32实现网络获取天气,以及大盘指数的实时信息,并在屏幕上显示
要求:在每天的上午9点到下午3点在屏幕上显示大盘指数的实时数据,比如创业板指数。在其他时间段显示当前天气信息
要求分析
要获取天气和大盘指数信息,就需要利用API接口,通过Http获取到天气和大盘指数的Json文件,并通过对Json文件解析,提取出其中的信息并显示出来。
要实现在不同的时间段显示不同的内容,就需要获取相应的时间的信息。
实现方法
可以利用Http服务,通过Api接口得到天气和大盘指数的Json文件。然后对Json文件解析并提取出需要的内容。所以这里需要用到Http的使用方法以及Json文件的解析方法。
在上面获取的Json 文件信息中会包含对应是时间信息,因为对时间的精度要求不需很高(天气每30秒访问一次,股市每10分钟访问一次),所以只需要将其中时间信息提取出来就可以直接利用。
实现过程
1、通过ESP32实现获取天气信息(需在专门的天气网站上申请API接口的Key),并将信息显示在0.96显示屏上
2、在此基础上,通过ESP32获取股市创业板指数信息并显示
3、要实现在不同时间段显示不同的内容,我们会发现在获取天气和股市指数信息返回的Json文件中都会包含时间信息,因此可以利用这里时间信息。本程序中,因为免费的股市创业板指数API接口每天访问的次数是较少的,于是每次都通过天气Json文件中的时间进行判断。
Arduino 代码
#include <Arduino.h>
#include <U8g2lib.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <WiFi.h>
#include <HTTPClient.h>
//WiFi ssid和密码
const char* id="LAPTOP-PMC1QACL 4629"; //定义两个字符串指针常量
const char* psw="5%26u02E";
char* dweathero;
char* ttpc;
char* dretimet;
char* kong="kong";
String ApiInformation;
//显示设置
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 22, /* data=*/ 21, /* reset=*/ U8X8_PIN_NONE); // SDA:21 scl:22
//网页接入api
String API_KEY ="f260151a0b5b63f534904c31951f86c9";//从高德地图开放平台获取API接口
String city = "420111";
String API_KEY2 ="4163cfc4a59b220bc3";//从麦蕊智数上获取开放的API接口
String zs = "sz399006";//创业板指数代码
//获取天气json
String HTTPRequestApi(){
HTTPClient http;
String url = "https://restapi.amap.com/v3/weather/weatherInfo?key="+
API_KEY+"&city="+city+"&extensions=base";
http.begin(url);
int httpCode = http.GET();
String payload = http.getString();
http.end();
return payload;
}
//获取json
String HTTPRequestguApi(){
HTTPClient http;
String url = "http://api1.mairui.club/zs/sssj/"+zs+"/"+API_KEY2;
http.begin(url);
int httpCode = http.GET();
String payload = http.getString();
http.end();
return payload;
}
//解析股市Json
char* ApiJSONAnalysispc(String json){
DynamicJsonDocument doc(500);
DeserializationError error = deserializeJson(doc, json);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return kong;
}
const char* pc = doc["pc"]; // "-0.99"
char* cpc =const_cast<char *>(pc);
return cpc;
}
//获取数据
char* ApiJSONAnalysiso(String json1){
DynamicJsonDocument doc(500);
deserializeJson(doc, json1);
const char* o = doc["o"]; // "2180.71"
char* co =const_cast<char *>(o);
return co;
}
char* ApiJSONAnalysist(String json1){
DynamicJsonDocument doc(500);
deserializeJson(doc, json1);
const char* t = doc["t"]; // "2023-07-20 15:29:05"
char* ct =const_cast<char *>(t);
return ct;
}
void drawDemo(char* o,char* pc,char* t) {
// On Demo
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy15_t_gb2312);
u8g2.setCursor(10,20);
u8g2.print("指数:"+String(o));
u8g2.setCursor(10,45);
u8g2.print("涨幅:"+String(pc));
u8g2.setCursor(10,63);
u8g2.print(String(t));
u8g2.sendBuffer();
}
void drawDe(String xianshi) {
// On Demo
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy15_t_gb2312);
u8g2.setCursor(100,40);
u8g2.print(xianshi);
u8g2.sendBuffer();
}
//获取显示天气数据
char* ApiJSONAnalysisW(String json){
DynamicJsonDocument doc(768);
deserializeJson(doc, json);
JsonObject lives_0 = doc["lives"][0];
const char* weather =lives_0["weather"]; // 天气
char* w =const_cast<char *>(weather);
return w;
}
char* ApiJSONAnalysisR(String json){
DynamicJsonDocument doc(768);
deserializeJson(doc, json);
JsonObject lives_0 = doc["lives"][0];
const char* reporttime = lives_0["reporttime"]; // "2023-06-22 21:32:22"
char* w =const_cast<char *>(reporttime);
return w;
}
void drawTRDemo(char* weather,char* time) {
// On Demo
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_wqy15_t_gb2312);
u8g2.setCursor(10,20);
u8g2.print("洪山区天气: "+String(weather));
u8g2.setCursor(10,64);
u8g2.print(String(time));
u8g2.sendBuffer();
}
void setup(void) {
Serial.begin(115200);
//汉字显示初始化
u8g2.begin();
u8g2.enableUTF8Print();
//WiFi连接
WiFi.begin(id,psw);
while(WiFi.status()!=WL_CONNECTED){ //未连接上
delay(500);
Serial.println("正在连接...");
}
Serial.println("连接成功!"); //连接上
}
void loop(void)
{
ApiInformation=HTTPRequestApi();
dweathero=ApiJSONAnalysisW(ApiInformation);
dretimet=ApiJSONAnalysisR(ApiInformation);
Serial.println("天气数据已获得");
int a=(int(dretimet[11])-48)*10+int(dretimet[12])-48;
Serial.println(a);
if ((a>=9)&&(a<15)){
while(1){
Serial.println("进入股市指数获取");
delay(300);
ApiInformation = HTTPRequestguApi();
delay(300);
Serial.println(ApiInformation);
ttpc = ApiJSONAnalysispc(ApiInformation);
dweathero = ApiJSONAnalysiso(ApiInformation);
dretimet = ApiJSONAnalysist(ApiInformation);
Serial.println("获取到联网数据");
while (ttpc=="kong"){
delay(300);
ApiInformation = HTTPRequestguApi();
delay(300);
Serial.println("重新连网");
ttpc = ApiJSONAnalysispc(ApiInformation);
dweathero = ApiJSONAnalysiso(ApiInformation);
dretimet = ApiJSONAnalysist(ApiInformation);
}
drawDemo(dweathero,ttpc,dretimet);
Serial.println("数据显示");
Serial.println(String(dretimet[11]));
delay(600000);
ApiInformation=HTTPRequestApi();
dretimet=ApiJSONAnalysisR(ApiInformation);
Serial.println(ApiInformation);
int b=(int(dretimet[11])-48)*10+int(dretimet[12])-48;
if ((b>=15)){
break;
}
}
Serial.println("离开股市指数显示");
}
ApiInformation=HTTPRequestApi();
dweathero=ApiJSONAnalysisW(ApiInformation);
dretimet=ApiJSONAnalysisR(ApiInformation);
drawTRDemo(dweathero,dretimet);
delay(30000);
}
实现效果
当前天气显示:
股市指数显示