由于要做一個天氣時鐘,天氣資料肯定要通過互聯網獲得,其中涉及到時鐘的部分也用互聯網去解決省掉一個ds1302時鐘模塊,并可以測驗 學習api獲取并決議的效果,
但是在學習程序中大量的百度搜索資料發現都是按照博主自己的情況寫沒有適合我的,因此將這次學習情況記錄下來,經供參考,
硬體:ESP8266-12f
開發板:ESP8266 D1 mini
開發環境:arduino IDE
基礎硬體配置不做分享,百度一大把,關鍵詞:“如何在arduino上開發esp8266”,
軟體部分:1.測驗wifi拉取功能,從示例中拉取BasicHttpClient例程,

WiFiMulti.addAP("SSID", "PASSWORD"); //修改wifi賬號密碼
if (http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html"))
//將其中雙引號部分替換成自己的api的網址
//如http://quan.suning.com/getSysTime.do,蘇寧時間api
上傳后即可打開串口獲得資料,一般情況會獲得如下資訊,
{"sysTime2":"2021-08-17 13:52:49","sysTime1":"20210817135249"}
即代表單片機成功從網路上獲取到資訊,
2.決議資料
通過arduino庫安裝器,安裝arduinoJson庫(不會裝的百度“如何安裝arduinoJson庫”),拉取例程

char json[] =
"{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
//此為要決議的Json格式資料,
這邊有個坑,直接將api獲得資料替換到里面發現編譯錯誤,如{"sysTime2":"2021-08-17 13:52:49","sysTime1":"20210817135249"},猜測是多個雙引號發生了識別錯誤,因此這個庫函式的作者在每個”之前加了\,
const char* sensor = doc["sensor"];
long time = doc["time"];
double latitude = doc["data"][0];
double longitude = doc["data"][1];
//這是決議中最重要的部分,
/*JSON格式一般為
* {
* "XXXXX1":"xxxxxxx1",
* "XXXXX2":"xxxxxxx2",
* "XXXXX3":"xxxxxxx3",
* "XXXXX4":"xxxxxxx4",
* }
(重要)* 決議需要xxxxxxx1資料的話,僅需const char* value = doc["XXXXX1"];
* 變數value中就存放著xxxxxxx1
*
*/
3.api資訊獲取程式疊加Json決議程式
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
ESP8266WiFiMulti WiFiMulti; //ESP8266WiFiMulti 庫函式實體化 可以允許簡寫WiFiMulti.xxx
void setup(void) {
Serial.begin(115200);
//wifi初始化
WiFi.mode(WIFI_STA);
WiFiMulti.addAP("kidscoding", "kidscoding123");
}
void loop() {
·
if ((WiFiMulti.run() == WL_CONNECTED)) {//無線連接中...
WiFiClient client; //初始化客戶端
HTTPClient http; //HTTPClient庫函式實體化 可以允許簡寫http.xxx
if (http.begin(client, "http://quan.suning.com/getSysTime.do")) {
http.GET(); //拉取網站資訊
String payload = http.getString(); //拉取成字串
StaticJsonDocument<200> doc; //json格式決議設定字串長度
deserializeJson(doc, payload);//json格式決議設定
const char* sysTime1 = doc["sysTime1"];
/*JSON格式一般為
* {
* "XXXXX1":"xxxxxxx1",
* "XXXXX2":"xxxxxxx2",
* "XXXXX3":"xxxxxxx3",
* "XXXXX4":"xxxxxxx4",
* }
* 決議需要xxxxxxx1資料的話,僅需const char* value = doc["XXXXX1"];
* 變數value中就存放著xxxxxxx1
*
*/
Serial.println(sysTime1);
http.end();
}
delay(1000);
}
}
正常上傳的話就可以獲取當前時間資訊,不過是一串的,還需要一個個分開,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294788.html
標籤:其他
