前期准备:
登陆心知官网,注册登陆,申请免费版,进入控制台复制私钥
需要的库:
// Libraries
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
ArduinoJson提供的在线助手很好用,帮助生成很多解析代码。https://arduinojson.org/v5/assistant/
ArduinoJson库安装选取5.13.2版本,如果直接选取了最新版编译会出现报错,
error: 'StaticJsonBuffer' was not declared in this scope
因为版本6替换JsonBuffer为JsonDocument,还有一些其他的变革,建议保持5.13.2不变
代码编写
网络连接部分
需要的库:
// Libraries
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
ArduinoJson提供的在线助手很好用,帮助生成很多解析代码。https://arduinojson.org/v5/assistant/
ArduinoJson库安装选取5.13.2版本,如果直接选取了最新版编译会出现报错,
error: 'StaticJsonBuffer' was not declared in this scope
因为版本6替换JsonBuffer为JsonDocument,还有一些其他的变革,建议保持5.13.2不变
逻辑图
模板
// Libraries
#include <ESP8266WiFi.h>
#include <ArduinoJson.h> //使用ArduinoJson库
// WiFi settings
const char* ssid = "***";
const char* password = "***";
// API server
const char* host = "api.seniverse.com";
void setup() {
// Serial
Serial.begin(115200);
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to WIFI");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Connect to API
Serial.print("connecting to XinZhi");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url = "/v3/weather/daily.json?key=your-key&location=shanghai&language=zh-Hans&unit=c&start=0&days=3";
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(100);
// Read all the lines of the reply from server and print them to Serial
String weather_data;
while (client.available()) {
String line = client.readStringUntil('\r');
weather_data += line;
}
client.stop();
Serial.println();
Serial.println("closing connection");
// Process weather_json
Serial.println();
//Serial.println("weather_data: ");
// Serial.println(weather_data);
// Convert to JSON
String json_weather_data;
int jsonIndex;
for (int i = 0; i < weather_data.length(); i++) {
if (weather_data[i] == '{') {
jsonIndex = i;
break;
}
}
// Get JSON data
json_weather_data = weather_data.substring(jsonIndex);
Serial.println();
Serial.println("json_weather_data: ");
Serial.println(json_weather_data);
//利用arduinoJson库解析心知返回的json天气数据
//可以利用 https://arduinojson.org/v5/assistant/ Arduinojson助手生成相关json解析代码 很方便!!!
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 3 * JSON_OBJECT_SIZE(12) + 700;
DynamicJsonBuffer jsonBuffer(capacity);
const char* json = "{\"results\":[{\"location\":{\"id\":\"WTW3SJ5ZBJUY\",\"name\":\"上海\",\"country\":\"CN\",\"path\":\"上海,上海,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"daily\":[{\"date\":\"2019-02-11\",\"text_day\":\"多云\",\"code_day\":\"4\",\"text_night\":\"阴\",\"code_night\":\"9\",\"high\":\"7\",\"low\":\"2\",\"precip\":\"\",\"wind_direction\":\"东北\",\"wind_direction_degree\":\"45\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2019-02-12\",\"text_day\":\"中雨\",\"code_day\":\"14\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"9\",\"low\":\"4\",\"precip\":\"\",\"wind_direction\":\"东\",\"wind_direction_degree\":\"90\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2019-02-13\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"中雨\",\"code_night\":\"14\",\"high\":\"10\",\"low\":\"7\",\"precip\":\"\",\"wind_direction\":\"东北\",\"wind_direction_degree\":\"45\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"}],\"last_update\":\"2019-02-11T08:00:00+08:00\"}]}";
JsonObject& root = jsonBuffer.parseObject(json_weather_data);
JsonObject& results_0 = root["results"][0];
JsonObject& results_0_location = results_0["location"];
const char* results_0_location_id = results_0_location["id"]; // "WTW3SJ5ZBJUY"
const char* results_0_location_name = results_0_location["name"]; // "上海"
const char* results_0_location_country = results_0_location["country"]; // "CN"
const char* results_0_location_path = results_0_location["path"]; // "上海,上海,中国"
const char* results_0_location_timezone = results_0_location["timezone"]; // "Asia/Shanghai"
const char* results_0_location_timezone_offset = results_0_location["timezone_offset"]; // "+08:00"
JsonArray& results_0_daily = results_0["daily"];
JsonObject& results_0_daily_0 = results_0_daily[0];
const char* results_0_daily_0_date = results_0_daily_0["date"]; // "2019-02-11"
const char* results_0_daily_0_text_day = results_0_daily_0["text_day"]; // "多云"
const char* results_0_daily_0_code_day = results_0_daily_0["code_day"]; // "4"
const char* results_0_daily_0_text_night = results_0_daily_0["text_night"]; // "阴"
const char* results_0_daily_0_code_night = results_0_daily_0["code_night"]; // "9"
const char* results_0_daily_0_high = results_0_daily_0["high"]; // "7"
const char* results_0_daily_0_low = results_0_daily_0["low"]; // "2"
const char* results_0_daily_0_precip = results_0_daily_0["precip"]; // ""
const char* results_0_daily_0_wind_direction = results_0_daily_0["wind_direction"]; // "东北"
const char* results_0_daily_0_wind_direction_degree = results_0_daily_0["wind_direction_degree"]; // "45"
const char* results_0_daily_0_wind_speed = results_0_daily_0["wind_speed"]; // "10"
const char* results_0_daily_0_wind_scale = results_0_daily_0["wind_scale"]; // "2"
JsonObject& results_0_daily_1 = results_0_daily[1];
const char* results_0_daily_1_date = results_0_daily_1["date"]; // "2019-02-12"
const char* results_0_daily_1_text_day = results_0_daily_1["text_day"]; // "中雨"
const char* results_0_daily_1_code_day = results_0_daily_1["code_day"]; // "14"
const char* results_0_daily_1_text_night = results_0_daily_1["text_night"]; // "小雨"
const char* results_0_daily_1_code_night = results_0_daily_1["code_night"]; // "13"
const char* results_0_daily_1_high = results_0_daily_1["high"]; // "9"
const char* results_0_daily_1_low = results_0_daily_1["low"]; // "4"
const char* results_0_daily_1_precip = results_0_daily_1["precip"]; // ""
const char* results_0_daily_1_wind_direction = results_0_daily_1["wind_direction"]; // "东"
const char* results_0_daily_1_wind_direction_degree = results_0_daily_1["wind_direction_degree"]; // "90"
const char* results_0_daily_1_wind_speed = results_0_daily_1["wind_speed"]; // "10"
const char* results_0_daily_1_wind_scale = results_0_daily_1["wind_scale"]; // "2"
JsonObject& results_0_daily_2 = results_0_daily[2];
const char* results_0_daily_2_date = results_0_daily_2["date"]; // "2019-02-13"
const char* results_0_daily_2_text_day = results_0_daily_2["text_day"]; // "小雨"
const char* results_0_daily_2_code_day = results_0_daily_2["code_day"]; // "13"
const char* results_0_daily_2_text_night = results_0_daily_2["text_night"]; // "中雨"
const char* results_0_daily_2_code_night = results_0_daily_2["code_night"]; // "14"
const char* results_0_daily_2_high = results_0_daily_2["high"]; // "10"
const char* results_0_daily_2_low = results_0_daily_2["low"]; // "7"
const char* results_0_daily_2_precip = results_0_daily_2["precip"]; // ""
const char* results_0_daily_2_wind_direction = results_0_daily_2["wind_direction"]; // "东北"
const char* results_0_daily_2_wind_direction_degree = results_0_daily_2["wind_direction_degree"]; // "45"
const char* results_0_daily_2_wind_speed = results_0_daily_2["wind_speed"]; // "10"
const char* results_0_daily_2_wind_scale = results_0_daily_2["wind_scale"]; // "2"
const char* results_0_last_update = results_0["last_update"]; // "2019-02-11T08:00:00+08:00"
// Test if parsing succeeds.
if (!root.success()) {
Serial.println("parseObject() failed");
return;
}
// .
Serial.println();
Serial.print("上海今天天气: ");
Serial.println(results_0_daily_0_text_day);
Serial.print("上海明天天气: ");
Serial.println(results_0_daily_1_text_day);
// Wait 5 seconds
delay(5000);
}
将私钥复制到
再填写WiFi账号和密码
编译上传成功,打开串口监视器看能否得到返回数据
网络连接部分测试结束
OLED 屏幕界面编辑
需要的库:
// Libraries
#include <U8g2lib.h>
这是一个非常好用的oled库,使用参考文档如下
U8g2官方文档
鸟哥的玩转u8g2 OLED库,一篇就够
U8g2英文字库
U8g2库图片显示
/**
* 绘制图像
* @param x 左上角坐标x
* @param y 左上角坐标y
* @param w 图形宽度
* @param h 图形高度
* @param bitmap 图形内容
* @Note 关联方法 setBitmapMode
*/
void u8g2_DrawXBM(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)
void u8g2_DrawXBMP(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap)
这里我们要用到这个函数绘制开机连接WiFi动画
测试代码如下
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
const unsigned char wifi_connect[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xFE,0x03,0x00,0xC0,0x01,0x3E,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,
0x00,0x03,0x1E,0x00,0x80,0x01,0x10,0x00,
0x00,0xF8,0x03,0x00,0x00,0x0C,0x0E,0x00,
0x00,0x06,0x0C,0x00,0x00,0x70,0x00,0x00,
0x00,0xD0,0x03,0x00,0x00,0xC0,0x00,0x00,
0x00,0xE0,0x00,0x00,0x00,0x40,0x00,0x00
};
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.clearBuffer(); // 清空显示设备内部缓冲区
u8g2.drawXBMP( 0 , 0 , 32 , 16 , wifi_connect); //32,16为图片尺寸,根据你的图片尺寸修改
u8g2.sendBuffer(); // 显示缓冲区内容
delay(1000);
}
字符显示格式,查找字符集,按下面操作就行
u8g2.setFont(u8g2_font_battery19_tn);
u8g2.setCursor(48+3, 42);
u8g2.print(0);//选第一个
u8g2.sendBuffer();
————————2019-10-10第一次修改—————————————————