• 方案介紹
    • 一、實(shí)現(xiàn)功能
    • 二、硬件準(zhǔn)備
    • 三、CJSON解析天氣預(yù)報(bào)數(shù)據(jù)
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

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

03/15 08:54
2268
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請聯(lián)系.docx

共1個文件

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

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

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

在這里插入圖片描述

二、硬件準(zhǔn)備

1. ESP8266模塊

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

2. STM32微控制器

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

3. OLED顯示屏

OLED是一種非常流行的顯示技術(shù),具有高對比度、低功耗、快速響應(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": "合肥,合肥,安徽,中國",
        "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是一款輕量級的C語言JSON解析器,其全稱是“cJSON”,由Dave Gamble編寫。它簡單易用,可嵌入到C應(yīng)用程序中,既支持JSON字符串的解析,也支持JSON對象的創(chuàng)建及操作。CJSON不依賴于任何其他的庫或組件,使用它只需要引入其頭文件即可。

CJSON的使用方式相對來說比較簡單,需要進(jìn)行以下幾個步驟:

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

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

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

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

  1. 引入CJSON庫文件
#include <cJSON.h>
  1. 解析JSON數(shù)據(jù)并創(chuàng)建cJSON對象
char* json_data = "{"results":[{"location":{"id":"WTEMH46Z5N09","name":"合肥","country":"CN","path":"合肥,合肥,安徽,中國","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);

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

  1. 從cJSON對象中提取數(shù)據(jù)
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;

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

  1. 釋放cJSON對象
cJSON_Delete(root);

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

完整的代碼示例如下:

#include <cJSON.h>
#include <stdio.h>

int main() {
    char* json_data = "{"results":[{"location":{"id":"WTEMH46Z5N09","name":"合肥","country":"CN","path":"合肥,合肥,安徽,中國","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;
}

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

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

下面是ESP8266訪問HTTP接口請求的代碼:

#include <SoftwareSerial.h>

// 定義ESP8266串口對象
SoftwareSerial esp8266(PA10, PA9); // RX, TX

void setup() {
  Serial.begin(9600);

  // 初始化ESP8266串口通信波特率為9600
  esp8266.begin(9600);

  // 發(fā)送AT指令測試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請求
  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);
}

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

  • 更多詳細(xì)資料請聯(lián)系.docx
    下載
意法半導(dǎo)體

意法半導(dǎo)體

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.收起

查看更多

相關(guān)推薦