色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ESP8266獲取天氣預報信息,并使用CJSON解析天氣預報數據

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-04-27 13:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、實現功能

當前文章介紹如何使用ESP8266STM32微控制器,搭配OLED顯示屏,制作一個能夠實時顯示天氣預報的智能設備。將使用心知天氣API來獲取天氣數據,并使用MQTT協議將數據傳遞給STM32控制器,最終在OLED顯示屏上顯示。

心知天氣是一家專業的氣象數據服務提供商,致力于為全球用戶提供高質量、定制化的氣象數據服務。其主要產品包括天氣API、空氣質量API、災害預警API等。用戶可以通過心知天氣的API接口,獲取準確、實時的天氣數據,從而為各種應用場景提供支持,例如智能家居、出行、電商等。心知天氣的數據覆蓋全球200多個國家和地區,每日處理超過10億次API請求,是業內領先的氣象數據服務提供商之一。

二、硬件準備

1. ESP8266模塊

ESP8266是一款WiFi模塊,它具有強大的網絡連接功能,可以輕松地連接到互聯網。將使用ESP8266模塊來獲取天氣數據,并將其發送給STM32控制器。具體來說,我們將使用正點原子ATK-ESP8266模塊,這是一款集成ESP8266芯片的小板子。

2. STM32微控制器

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

3. OLED顯示屏

OLED是一種非常流行的顯示技術,具有高對比度、低功耗、快速響應等優點。將使用0.96英寸128x64像素的OLED顯示屏。

三、CJSON解析天氣預報數據

3.1 接口返回的數據

{
 "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應用程序中,既支持JSON字符串的解析,也支持JSON對象的創建及操作。CJSON不依賴于任何其他的庫或組件,使用它只需要引入其頭文件即可。

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

1. 在應用程序中包含cJSON的頭文件:#include "cJSON.h"。
2. 調用cJSON_Parse函數,將JSON字符串轉換為CJSON對象。
3. 使用cJSON提供的API函數對CJSON對象進行操作,包括讀取、修改、刪除、添加等。
4. 在程序結束時,記得釋放cJSON對象的內存空間,避免內存泄漏。

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

3.3 解析數據

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

  1. 引入CJSON庫文件
cCopy Code#include 
  1. 解析JSON數據并創建cJSON對象
cCopy Codechar* 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數據。然后,我們調用cJSON_Parse()函數來解析JSON數據,并將解析結果保存在root指針所指向的cJSON對象中。

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

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

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

最后,我們需要釋放之前創建的cJSON對象,以釋放內存空間。

完整的代碼示例如下:

cCopy Code#include 
#include 
?
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()等函數來解析和處理JSON數據。

3.4 獲取數據

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

#include 
?
// 定義ESP8266串口對象
SoftwareSerial esp8266(PA10, PA9); // RX, TX
?
void setup() {
 Serial.begin(9600);
?
 // 初始化ESP8266串口通信波特率為9600
 esp8266.begin(9600);
?
 // 發送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發送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響應
 while (esp8266.available()) {
  String response = esp8266.readStringUntil('n');
  Serial.println(response);
  }
?
 // 關閉TCP連接
 esp8266.println("AT+CIPCLOSE");
 delay(1000);
}

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

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7945

    瀏覽量

    154723
  • 單片機
    +關注

    關注

    6067

    文章

    44973

    瀏覽量

    649974
  • STM32
    +關注

    關注

    2293

    文章

    11031

    瀏覽量

    364402
  • API
    API
    +關注

    關注

    2

    文章

    1599

    瀏覽量

    63955
  • ESP8266
    +關注

    關注

    51

    文章

    965

    瀏覽量

    47357
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【RA-Eco-RA4M2開發板評測】RA4M2 + ESP8266獲取城市天氣預報(一)

    很高興收到瑞薩電子的RA4M2開發板,有幸成為了幸運觀眾,本期就來使用瑞薩的RA4M2開發板通過串口連接WIFI模塊ESP8266,獲取天氣預報數據信息。
    發表于 05-02 14:28

    【RA-Eco-RA4M2開發板評測】RA4M2 + ESP8266獲取城市天氣預報(二)使用串口助手獲取天氣+破解任意類型AT指令

    https://bbs.elecfans.com/jishu_2487602_1_1.html 前一篇帖子中我已經實現了完整的RA4M2配合ESP8266獲取城市天氣預報信息數據,可以
    發表于 05-04 10:07

    labview天氣預報

    `用labview寫的天氣預報,信息比較多,懶得分析,你們各取所需吧!`
    發表于 07-28 14:49

    基于ESP32 WiFi連接天氣預報機的設計方案

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

    由MQTT進行的天氣預報ESPWatch 遠程控制本地儀器

    ESPWatch基于ESP-12 WIFI模塊。它從Internet服務器獲取幾天的日期/時間和天氣預報
    的頭像 發表于 06-13 09:44 ?3986次閱讀

    基于STM32 ESP8266的WIFI TFT自動校時天氣預報設計

    本設計使用stm32作為主控,采用esp8266作為網絡接入模組,可實現自動校準時間以及獲取天氣信息等功能! 該項目成本低廉,主要功能為自動校時與
    的頭像 發表于 12-07 11:09 ?6069次閱讀

    基于天氣預報的自動灌溉系統

    電子發燒友網站提供《基于天氣預報的自動灌溉系統.zip》資料免費下載
    發表于 10-31 14:47 ?2次下載
    基于<b class='flag-5'>天氣預報</b>的自動灌溉系統

    Zambreti天氣預報器開源分享

    電子發燒友網站提供《Zambreti天氣預報器開源分享.zip》資料免費下載
    發表于 11-01 14:30 ?0次下載
    Zambreti<b class='flag-5'>天氣預報</b>器開源分享

    基于ESP8266天氣預報顯示模塊

    方案介紹該設備將:在啟動時連接到 WiFi 并進行查詢。每 1.5 秒在 LCD 上顯示和循環 6 天的天氣預報數據。如果您想更新天氣數據,請按下按鈕重置設備或拔下/重新插入。
    發表于 12-08 15:54 ?0次下載

    使用ESP32進行溫度、濕度和天氣預報

    電子發燒友網站提供《使用ESP32進行溫度、濕度和天氣預報.zip》資料免費下載
    發表于 12-22 16:46 ?6次下載
    使用<b class='flag-5'>ESP</b>32進行溫度、濕度和<b class='flag-5'>天氣預報</b>

    基于ESP8266-01的天氣預報

    電子發燒友網站提供《基于ESP8266-01的天氣預報.zip》資料免費下載
    發表于 01-31 14:36 ?5次下載
    基于<b class='flag-5'>ESP8266</b>-01的<b class='flag-5'>天氣預報</b>

    Arduino天氣預報小矮人

    電子發燒友網站提供《Arduino天氣預報小矮人.zip》資料免費下載
    發表于 02-08 16:09 ?0次下載
    Arduino<b class='flag-5'>天氣預報</b>小矮人

    天氣預報顯示開源項目

    電子發燒友網站提供《天氣預報顯示開源項目.zip》資料免費下載
    發表于 06-14 10:47 ?0次下載
    <b class='flag-5'>天氣預報</b>顯示開源項目

    DIY簡單的天氣預報裝置

    電子發燒友網站提供《DIY簡單的天氣預報裝置.zip》資料免費下載
    發表于 07-03 10:16 ?0次下載
    DIY簡單的<b class='flag-5'>天氣預報</b>裝置

    AWTK 開源串口屏開發(11) - 天氣預報

    AWTK串口屏內置了XML/JSON/INI等各種數據文件的模型,支持用HTTP/HTTPS從網絡獲取數據。不用編寫一行代碼,即可實現天氣預報
    的頭像 發表于 03-05 08:24 ?664次閱讀
    AWTK 開源串口屏開發(11) - <b class='flag-5'>天氣預報</b>
    主站蜘蛛池模板: 欧美一区二区三区激情视频 | 亚洲成人黄色片 | 国产精品无码麻豆放荡AV | 久久天堂视频 | 久久亚洲精品AV无码四区 | 与子敌伦刺激对白亂輪亂性 | AV一区AV久久AV无码 | 爱穿丝袜的麻麻3d漫画acg | 麻豆蜜桃国语精品无码视频 | 午夜dj免费中文字幕 | 91免费永久在线地址 | 97视频在线观看视频最新 | 艺术片 快播| 中文字幕在线不卡日本v二区 | 久久久久久久久女黄 | 久久AV喷吹AV高潮欧美 | 囯产精品一品二区三区 | 亚洲国产成人99精品激情在线 | 少妇无码太爽了视频在线播放 | 后入内射国产一区二区 | 快插我我好湿啊公交车上做 | 国产亚洲精品久久久久苍井松 | 视频一区二区中文字幕 | 亚洲福利电影一区二区? | 免费毛片在线视频 | 69人体阴展网 | 国产成人免费片在线观看 | 天天躁日日躁狠狠躁AV麻豆 | 甜宠溺H宝贝嗯撞PLAY啊 | 97视频在线免费播放 | 在线播放日韩欧美亚洲日本 | 戳女人屁股流水羞羞漫画 | 国产久爱青草视频在线观看 | 欧美日韩第一区 | 99免费在线 | 熟女啪啪白浆嗷嗷叫 | 被窝国产理论一二三影院 | 色多多深夜福利免费观看 | 99国产精品免费视频 | 欧美日韩另类在线观看视频 | 国产产一区二区三区久久毛片国语 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品