0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP8266獲取天氣預(yù)報(bào)信息,并使用CJSON解析天氣預(yù)報(bào)數(shù)據(jù)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-04-27 13:45 ? 次閱讀

一、實(shí)現(xiàn)功能

當(dāng)前文章介紹如何使用ESP8266STM32微控制器,搭配OLED顯示屏,制作一個(gè)能夠?qū)崟r(shí)顯示天氣預(yù)報(bào)的智能設(shè)備。將使用心知天氣API來(lái)獲取天氣數(shù)據(jù),并使用MQTT協(xié)議將數(shù)據(jù)傳遞給STM32控制器,最終在OLED顯示屏上顯示。

心知天氣是一家專(zhuān)業(yè)的氣象數(shù)據(jù)服務(wù)提供商,致力于為全球用戶(hù)提供高質(zhì)量、定制化的氣象數(shù)據(jù)服務(wù)。其主要產(chǎn)品包括天氣API、空氣質(zhì)量API、災(zāi)害預(yù)警API等。用戶(hù)可以通過(guò)心知天氣的API接口,獲取準(zhǔn)確、實(shí)時(shí)的天氣數(shù)據(jù),從而為各種應(yīng)用場(chǎng)景提供支持,例如智能家居、出行、電商等。心知天氣的數(shù)據(jù)覆蓋全球200多個(gè)國(guó)家和地區(qū),每日處理超過(guò)10億次API請(qǐng)求,是業(yè)內(nèi)領(lǐng)先的氣象數(shù)據(jù)服務(wù)提供商之一。

二、硬件準(zhǔn)備

1. ESP8266模塊

ESP8266是一款WiFi模塊,它具有強(qiáng)大的網(wǎng)絡(luò)連接功能,可以輕松地連接到互聯(lián)網(wǎng)。將使用ESP8266模塊來(lái)獲取天氣數(shù)據(jù),并將其發(fā)送給STM32控制器。具體來(lái)說(shuō),我們將使用正點(diǎn)原子ATK-ESP8266模塊,這是一款集成ESP8266芯片的小板子。

2. STM32微控制器

STM32是一款強(qiáng)大的32位微控制器,具有多種接口和功能。將使用STM32F103C8T6控制器,這是一款非常流行的型號(hào),易于獲得且價(jià)格較為合理。

3. OLED顯示屏

OLED是一種非常流行的顯示技術(shù),具有高對(duì)比度、低功耗、快速響應(yīng)等優(yōu)點(diǎn)。將使用0.96英寸128x64像素的OLED顯示屏。

三、CJSON解析天氣預(yù)報(bào)數(shù)據(jù)

3.1 接口返回的數(shù)據(jù)

{
 "results": [
   {
   "location": {
    "id": "WTEMH46Z5N09",
    "name": "合肥",
    "country": "CN",
    "path": "合肥,合肥,安徽,中國(guó)",
    "timezone": "Asia/Shanghai",
    "timezone_offset": "+08:00"
    },
   "now": {
    "text": "陰",
    "code": "9",
    "temperature": "12",
    "feels_like": "18",
    "pressure": "1000",
    "humidity": "89",
    "visibility": "12.0",
    "wind_direction": "西南",
    "wind_direction_degree": "245",
    "wind_speed": "19.0",
    "wind_scale": "3",
    "clouds": "85",
    "dew_point": ""
    },
   "last_update": "2023-04-04T14:20:13+08:00"
   }
  ]
}

3.2 CJSON是什么

CJSON是一款輕量級(jí)的C語(yǔ)言JSON解析器,其全稱(chēng)是“cJSON”,由Dave Gamble編寫(xiě)。它簡(jiǎn)單易用,可嵌入到C應(yīng)用程序中,既支持JSON字符串的解析,也支持JSON對(duì)象的創(chuàng)建及操作。CJSON不依賴(lài)于任何其他的庫(kù)或組件,使用它只需要引入其頭文件即可。

CJSON的使用方式相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,需要進(jìn)行以下幾個(gè)步驟:

1. 在應(yīng)用程序中包含cJSON的頭文件:#include "cJSON.h"。
2. 調(diào)用cJSON_Parse函數(shù),將JSON字符串轉(zhuǎn)換為CJSON對(duì)象。
3. 使用cJSON提供的API函數(shù)對(duì)CJSON對(duì)象進(jìn)行操作,包括讀取、修改、刪除、添加等。
4. 在程序結(jié)束時(shí),記得釋放cJSON對(duì)象的內(nèi)存空間,避免內(nèi)存泄漏。

CJSON的解析速度相對(duì)較快,占用的內(nèi)存開(kāi)銷(xiāo)也比較小,因此非常適用于資源有限的嵌入式系統(tǒng)中使用。

3.3 解析數(shù)據(jù)

使用CJSON解析上述JSON數(shù)據(jù)非常簡(jiǎn)單,只需要按照以下步驟操作:

  1. 引入CJSON庫(kù)文件
cCopy Code#include 
  1. 解析JSON數(shù)據(jù)并創(chuàng)建cJSON對(duì)象
cCopy Codechar* json_data = "{"results":[{"location":{"id":"WTEMH46Z5N09","name":"合肥","country":"CN","path":"合肥,合肥,安徽,中國(guó)","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"陰","code":"9","temperature":"12","feels_like":"18","pressure":"1000","humidity":"89","visibility":"12.0","wind_direction":"西南","wind_direction_degree":"245","wind_speed":"19.0","wind_scale":"3","clouds":"85","dew_point":""},"last_update":"2023-04-04T14:20:13+08:00"}]}";
cJSON* root = cJSON_Parse(json_data);

在這個(gè)代碼片段中,我們首先定義了一個(gè)字符串類(lèi)型的變量json_data,用于存儲(chǔ)上述JSON數(shù)據(jù)。然后,我們調(diào)用cJSON_Parse()函數(shù)來(lái)解析JSON數(shù)據(jù),并將解析結(jié)果保存在root指針?biāo)赶虻腸JSON對(duì)象中。

  1. 從cJSON對(duì)象中提取數(shù)據(jù)
cCopy CodecJSON* location = cJSON_GetObjectItem(root, "location");
char* city = cJSON_GetObjectItem(location, "name")->valuestring;
cJSON* now = cJSON_GetObjectItem(root, "now");
int temperature = cJSON_GetObjectItem(now, "temperature")->valueint;
char* text = cJSON_GetObjectItem(now, "text")->valuestring;

在這個(gè)代碼片段中,我們使用cJSON_GetObjectItem()函數(shù)從root指針?biāo)赶虻腸JSON對(duì)象中提取一個(gè)名為location的JSON對(duì)象,并從該JSON對(duì)象中獲取名為name的字符串類(lèi)型變量。類(lèi)似地,我們也可以從root指針?biāo)赶虻腸JSON對(duì)象中提取名為now的JSON對(duì)象,并從該JSON對(duì)象中獲取名為temperaturetext的整型和字符串類(lèi)型變量。

  1. 釋放cJSON對(duì)象
cCopy CodecJSON_Delete(root);

最后,我們需要釋放之前創(chuàng)建的cJSON對(duì)象,以釋放內(nèi)存空間。

完整的代碼示例如下:

cCopy Code#include 
#include 
?
int main() {
  char* json_data = "{"results":[{"location":{"id":"WTEMH46Z5N09","name":"合肥","country":"CN","path":"合肥,合肥,安徽,中國(guó)","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"陰","code":"9","temperature":"12","feels_like":"18","pressure":"1000","humidity":"89","visibility":"12.0","wind_direction":"西南","wind_direction_degree":"245","wind_speed":"19.0","wind_scale":"3","clouds":"85","dew_point":""},"last_update":"2023-04-04T14:20:13+08:00"}]}";
  cJSON* root = cJSON_Parse(json_data);
?
  cJSON* location = cJSON_GetObjectItem(root, "location");
  char* city = cJSON_GetObjectItem(location, "name")->valuestring;
  cJSON* now = cJSON_GetObjectItem(root, "now");
  int temperature = cJSON_GetObjectItem(now, "temperature")->valueint;
  char* text = cJSON_GetObjectItem(now, "text")->valuestring;
?
  printf("City: %sn", city);
  printf("Temperature: %dn", temperature);
  printf("Weather: %sn", text);
?
  cJSON_Delete(root);
?
  return 0;
}

在這個(gè)代碼示例中,使用了cJSON_Parse()cJSON_GetObjectItem()、cJSON_Delete()等函數(shù)來(lái)解析和處理JSON數(shù)據(jù)。

3.4 獲取數(shù)據(jù)

下面是ESP8266訪(fǎng)問(wèn)HTTP接口請(qǐng)求的代碼:

#include 
?
// 定義ESP8266串口對(duì)象
SoftwareSerial esp8266(PA10, PA9); // RX, TX
?
void setup() {
 Serial.begin(9600);
?
 // 初始化ESP8266串口通信波特率為9600
 esp8266.begin(9600);
?
 // 發(fā)送AT指令測(cè)試ESP8266是否正常工作
 esp8266.println("AT");
 delay(500);
 if (esp8266.find("OK")) {
  Serial.println("ESP8266 is working properly.");
  } else {
  Serial.println("ESP8266 is not working properly.");
  }
}
?
void loop() {
 // 向ESP8266發(fā)送HTTP請(qǐng)求
 esp8266.println("AT+CIPSTART="TCP","api.seniverse.com",80");
 if (esp8266.find("OK")) {
  Serial.println("TCP connection established.");
  } else {
  Serial.println("TCP connection failed.");
  }
?
 String url = "/v3/weather/now.json?key=your_API_KEY&location=your_LOCATION";
 String request = "GET " + url + " HTTP/1.1rn" +
          "Host: api.seniverse.comrn" +
          "User-Agent: STM32/1.0rn" +
          "Connection: closernrn";
 int length = request.length();
 String cmd = "AT+CIPSEND=" + String(length);
 esp8266.println(cmd);
 if (esp8266.find(">")) {
  Serial.println("Sending HTTP request...");
  esp8266.print(request);
  } else {
  Serial.println("Failed to send HTTP request.");
  }
?
 // 接收HTTP響應(yīng)
 while (esp8266.available()) {
  String response = esp8266.readStringUntil('n');
  Serial.println(response);
  }
?
 // 關(guān)閉TCP連接
 esp8266.println("AT+CIPCLOSE");
 delay(1000);
}

在這個(gè)示例代碼中,初始化了ESP8266串口對(duì)象,并通過(guò)發(fā)送AT指令測(cè)試ESP8266是否正常工作。然后,在loop()函數(shù)中,向ESP8266發(fā)送一個(gè)HTTP請(qǐng)求,包括請(qǐng)求頭和請(qǐng)求體。發(fā)送完畢后,等待ESP8266返回HTTP響應(yīng)并將其打印出來(lái)。最后,關(guān)閉TCP連接并等待一秒鐘,然后重復(fù)上述步驟。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7334

    瀏覽量

    150093
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628319
  • STM32
    +關(guān)注

    關(guān)注

    2257

    文章

    10828

    瀏覽量

    352447
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1461

    瀏覽量

    61489
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    959

    瀏覽量

    44542
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ESP8266應(yīng)用案例 基于STM32核心板獲取網(wǎng)絡(luò)天氣數(shù)據(jù)

    ESP8266 WIFI模塊自帶TCP/IP網(wǎng)絡(luò)協(xié)議棧,通過(guò)AT指令集完成網(wǎng)絡(luò)模式配置。知心天氣采用精準(zhǔn)數(shù)據(jù)源授權(quán)預(yù)報(bào)信息,可查看全國(guó)各地的實(shí)時(shí)天氣
    的頭像 發(fā)表于 05-27 09:16 ?7079次閱讀
    <b class='flag-5'>ESP8266</b>應(yīng)用案例 基于STM32核心板<b class='flag-5'>獲取</b>網(wǎng)絡(luò)<b class='flag-5'>天氣數(shù)據(jù)</b>

    labview天氣預(yù)報(bào)

    `用labview寫(xiě)的天氣預(yù)報(bào),信息比較多,懶得分析,你們各取所需吧!`
    發(fā)表于 07-28 14:49

    基于ESP32 WiFi連接天氣預(yù)報(bào)機(jī)的設(shè)計(jì)方案

    描述WeatherBot - 3D 打印天氣預(yù)報(bào)劇院 | ESP32 和 OpenWeatherMap如何 3D 打印/激光切割帶有 E-ink 顯示屏的 ESP32 WiFi 連接天氣預(yù)報(bào)
    發(fā)表于 06-30 06:49

    由MQTT進(jìn)行的天氣預(yù)報(bào)ESPWatch 遠(yuǎn)程控制本地儀器

    ESPWatch基于ESP-12 WIFI模塊。它從Internet服務(wù)器獲取幾天的日期/時(shí)間和天氣預(yù)報(bào)。
    的頭像 發(fā)表于 06-13 09:44 ?3616次閱讀

    人工智能將應(yīng)用于日常的天氣預(yù)報(bào)

    天氣預(yù)報(bào)和人工智能有著天然耦合的關(guān)系。天氣預(yù)報(bào)需要大量的、多種多樣的資料,人工智能天生就是處理大數(shù)據(jù)的工具;現(xiàn)有資料的時(shí)空數(shù)據(jù)密度不夠,人工智能具有對(duì)不完全不確定
    發(fā)表于 07-29 10:01 ?1814次閱讀

    基于STM32 ESP8266的WIFI TFT自動(dòng)校時(shí)天氣預(yù)報(bào)設(shè)計(jì)

    本設(shè)計(jì)使用stm32作為主控,采用esp8266作為網(wǎng)絡(luò)接入模組,可實(shí)現(xiàn)自動(dòng)校準(zhǔn)時(shí)間以及獲取天氣信息等功能! 該項(xiàng)目成本低廉,主要功能為自動(dòng)校時(shí)與
    的頭像 發(fā)表于 12-07 11:09 ?5066次閱讀

    基于天氣預(yù)報(bào)的自動(dòng)灌溉系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《基于天氣預(yù)報(bào)的自動(dòng)灌溉系統(tǒng).zip》資料免費(fèi)下載
    發(fā)表于 10-31 14:47 ?2次下載
    基于<b class='flag-5'>天氣預(yù)報(bào)</b>的自動(dòng)灌溉系統(tǒng)

    Zambreti天氣預(yù)報(bào)器開(kāi)源分享

    電子發(fā)燒友網(wǎng)站提供《Zambreti天氣預(yù)報(bào)器開(kāi)源分享.zip》資料免費(fèi)下載
    發(fā)表于 11-01 14:30 ?0次下載
    Zambreti<b class='flag-5'>天氣預(yù)報(bào)</b>器開(kāi)源分享

    基于ESP8266天氣預(yù)報(bào)顯示模塊

    方案介紹該設(shè)備將:在啟動(dòng)時(shí)連接到 WiFi 并進(jìn)行查詢(xún)。每 1.5 秒在 LCD 上顯示和循環(huán) 6 天的天氣預(yù)報(bào)數(shù)據(jù)。如果您想更新天氣數(shù)據(jù),請(qǐng)按下按鈕重置設(shè)備或拔下/重新插入。
    發(fā)表于 12-08 15:54 ?0次下載

    使用ESP32進(jìn)行溫度、濕度和天氣預(yù)報(bào)

    電子發(fā)燒友網(wǎng)站提供《使用ESP32進(jìn)行溫度、濕度和天氣預(yù)報(bào).zip》資料免費(fèi)下載
    發(fā)表于 12-22 16:46 ?4次下載
    使用<b class='flag-5'>ESP</b>32進(jìn)行溫度、濕度和<b class='flag-5'>天氣預(yù)報(bào)</b>

    基于ESP8266-01的天氣預(yù)報(bào)

    電子發(fā)燒友網(wǎng)站提供《基于ESP8266-01的天氣預(yù)報(bào).zip》資料免費(fèi)下載
    發(fā)表于 01-31 14:36 ?5次下載
    基于<b class='flag-5'>ESP8266</b>-01的<b class='flag-5'>天氣預(yù)報(bào)</b>

    Arduino天氣預(yù)報(bào)小矮人

    電子發(fā)燒友網(wǎng)站提供《Arduino天氣預(yù)報(bào)小矮人.zip》資料免費(fèi)下載
    發(fā)表于 02-08 16:09 ?0次下載
    Arduino<b class='flag-5'>天氣預(yù)報(bào)</b>小矮人

    天氣預(yù)報(bào)顯示開(kāi)源項(xiàng)目

    電子發(fā)燒友網(wǎng)站提供《天氣預(yù)報(bào)顯示開(kāi)源項(xiàng)目.zip》資料免費(fèi)下載
    發(fā)表于 06-14 10:47 ?0次下載
    <b class='flag-5'>天氣預(yù)報(bào)</b>顯示開(kāi)源項(xiàng)目

    DIY簡(jiǎn)單的天氣預(yù)報(bào)裝置

    電子發(fā)燒友網(wǎng)站提供《DIY簡(jiǎn)單的天氣預(yù)報(bào)裝置.zip》資料免費(fèi)下載
    發(fā)表于 07-03 10:16 ?0次下載
    DIY簡(jiǎn)單的<b class='flag-5'>天氣預(yù)報(bào)</b>裝置

    AWTK 開(kāi)源串口屏開(kāi)發(fā)(11) - 天氣預(yù)報(bào)

    AWTK串口屏內(nèi)置了XML/JSON/INI等各種數(shù)據(jù)文件的模型,支持用HTTP/HTTPS從網(wǎng)絡(luò)獲取數(shù)據(jù)。不用編寫(xiě)一行代碼,即可實(shí)現(xiàn)天氣預(yù)報(bào)
    的頭像 發(fā)表于 03-05 08:24 ?277次閱讀
    AWTK 開(kāi)源串口屏開(kāi)發(fā)(11) - <b class='flag-5'>天氣預(yù)報(bào)</b>