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

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

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

觸摸屏WIFI獲取時(shí)間和天氣預(yù)報(bào)相關(guān)的功能是怎樣實(shí)現(xiàn)的

嵌入式技術(shù)開(kāi)發(fā) ? 來(lái)源:嵌入式技術(shù)開(kāi)發(fā) ? 作者:Mr張工 ? 2022-10-24 08:59 ? 次閱讀

前幾天發(fā)布了開(kāi)源4.3寸觸摸屏的文章,里面有WIFI獲取時(shí)間和天氣預(yù)報(bào)相關(guān)的功能,今天就來(lái)介紹一下這個(gè)功能是怎樣實(shí)現(xiàn)的。

1.底層驅(qū)動(dòng)

首先,硬件上,單片機(jī)通過(guò)串口AT指令訪問(wèn)WIFI模塊(ESP8266)。具體AT指令怎樣寫(xiě),可以參考之前的文章《單片機(jī)裸機(jī)環(huán)境下編寫(xiě)AT指令程序》。上電后,先配置WIFI模塊的工作模式等,用到的AT指令如下:

1. 關(guān)閉回顯

ATE0

2. 設(shè)置為STA模式

AT+CWMODE_DEF=1

3. 設(shè)置WIFI名稱和密碼

AT+CWJAP_DEF=”SSID”,”P(pán)assword”

4. 開(kāi)啟DHCP

AT+CWDHCP_DEF=1,1

5. 設(shè)置為單連接模式

AT+CIPMUX=0

6.設(shè)置為透?jìng)髂J?/strong>

AT+CIPMODE=1

2.獲取網(wǎng)絡(luò)時(shí)間 獲取網(wǎng)絡(luò)時(shí)間的方式有兩種,對(duì)于較新版本的固件,可以直接通過(guò)AT指令來(lái)獲取。(可以通過(guò)AT+GMR指令來(lái)查詢固件的版本。) AT+CIPSNTPTIME? 對(duì)于較老版本的固件,不支持該AT指令,只能通過(guò)自己連接網(wǎng)絡(luò)服務(wù)器來(lái)獲取當(dāng)前時(shí)間。具體需要的AT指令如下:

1.建立TCP鏈接

AT+CIPSTART="TCP","www.beijing-time.org",80

2.打開(kāi)傳透模式

AT+CIPSEND

3.收到‘>’符號(hào)后,隨便發(fā)送個(gè)數(shù)據(jù)

4.等待接收數(shù)據(jù)

接收的數(shù)據(jù)可以先用網(wǎng)絡(luò)調(diào)試助手來(lái)測(cè)試,如下,可以看到,數(shù)據(jù)中包含了當(dāng)前的日期和時(shí)間信息,我們可以先找到字符串中“Data”的位置,再解析后面的數(shù)據(jù)。數(shù)據(jù)格式固定,直接按照字符位置解析就行。

需要注意的是,獲取的這個(gè)時(shí)間是格林威治時(shí)間,與北京時(shí)間相差8個(gè)小時(shí)。

當(dāng)然,也可以通過(guò)連接其它NTP時(shí)間服務(wù)器來(lái)獲取時(shí)間,步驟是類似的。

8f5150ec-5331-11ed-a3b6-dac502259ad0.png

3.獲取天氣預(yù)報(bào) 天氣的獲取就要比時(shí)間稍復(fù)雜一些,網(wǎng)上有很多可以提供天氣預(yù)報(bào)的服務(wù)器,有些可以免費(fèi)使用,一般都需要注冊(cè)一個(gè)賬號(hào),這里以“心知天氣”為例進(jìn)行介紹。步驟如下:

1.注冊(cè)賬號(hào)。

在該網(wǎng)站注冊(cè)一個(gè)賬號(hào):https://www.seniverse.com/。注冊(cè)之后就可以通過(guò)其開(kāi)放的API來(lái)獲取天氣預(yù)報(bào)。有免費(fèi)版和付費(fèi)版,區(qū)別在于訪問(wèn)頻次和獲取的天氣信息內(nèi)容不同。如下:

8f9b6d44-5331-11ed-a3b6-dac502259ad0.png

2.查看私鑰。

在控制臺(tái)查看賬號(hào)的私鑰,這個(gè)在程序中要用。

8fbc5d88-5331-11ed-a3b6-dac502259ad0.png

3.API

有了這個(gè)私鑰,我們就可以通過(guò)API來(lái)獲取天氣預(yù)報(bào)了,相關(guān)的API說(shuō)明可以在這里查詢:

https://seniverse.yuque.com/books/share/f4f9bf1a-d3d9-4a68-8996-950f8c88400e/sl6gvt#d29hl

先用網(wǎng)絡(luò)調(diào)試助手測(cè)試一下:

8fe42b2e-5331-11ed-a3b6-dac502259ad0.png

可以看到,通過(guò)TCP連接服務(wù)器后,發(fā)送GET請(qǐng)求就可以收到天氣預(yù)報(bào)數(shù)據(jù),接下來(lái)就是解析數(shù)據(jù)了。

4.解析數(shù)據(jù)。

接收的數(shù)據(jù)是JSON格式的字符串,在單片機(jī)中我們可以移植cJSON來(lái)進(jìn)行解析。cJSON是一個(gè)開(kāi)源的C語(yǔ)音解析庫(kù),只有cJSON.c、cJSON.h兩個(gè)文件,直接添加到工程中就可以使用相關(guān)函數(shù)。

程序如下:

void Weather_JSON( )
{  
    char *data;
    cJSON *root;
    cJSON *results;
    cJSON *last_update;
    cJSON *loc_json, *daily_json;
    cJSON *forecast_json;
    char *loc_tmp, *weather_tmp;
    int i = 0;


    data = (char*)(Uart1.RxBuf);//接受到的數(shù)據(jù)
    root = cJSON_Parse(data);
    if(root)
    {
        //printf("JSON格式正確:
%s

",cJSON_Print(root));    //輸出json字符串
        results = cJSON_GetObjectItem(root, "results");
        results = cJSON_GetArrayItem(results,0);
        if(results)
        {
            loc_json = cJSON_GetObjectItem(results, "location");   //得到location鍵對(duì)應(yīng)的值,是一個(gè)對(duì)象


            loc_tmp = cJSON_GetObjectItem(loc_json, "id") -> valuestring;
            //printf("城市ID:%s
",loc_tmp);
            loc_tmp = cJSON_GetObjectItem(loc_json, "name") -> valuestring;
            memset(loc_str,0,20);
            memcpy(loc_str,loc_tmp,strlen(loc_tmp));
          
            loc_tmp = cJSON_GetObjectItem(loc_json, "timezone") -> valuestring;
            //printf("城市時(shí)區(qū):%s

",loc_tmp);


            daily_json = cJSON_GetObjectItem(results, "daily");
            if(daily_json)
            {
                Weather_Dat[0].Flag = 1;
                for(i = 0; i < 3; i++)
                {
                    forecast_json = cJSON_GetArrayItem(daily_json, i);
                    //weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;//日期


                    weather_tmp = cJSON_GetObjectItem(forecast_json, "code_day") -> valuestring;//白天天氣代碼
                    Weather_Dat[i].Weathcode = atoi(weather_tmp);


                    //weather_tmp = cJSON_GetObjectItem(forecast_json, "code_night") -> valuestring;//晚上天氣代碼


                    weather_tmp = cJSON_GetObjectItem(forecast_json, "high") -> valuestring;//最高溫度
                    memset(Weather_Dat[i].HighT,0,4);
                    memcpy(Weather_Dat[i].HighT,weather_tmp,strlen(weather_tmp));


                  
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "low") -> valuestring;//最低溫度
                    memset(Weather_Dat[i].LowT,0,4);
                    memcpy(Weather_Dat[i].LowT,weather_tmp,strlen(weather_tmp));
                  
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_direction") -> valuestring;//風(fēng)向
                    memset(Weather_Dat[i].Wind_Dir,0,10);
                    memcpy(Weather_Dat[i].Wind_Dir,weather_tmp,strlen(weather_tmp));
                  
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_scale") -> valuestring;//風(fēng)力
                    memset(Weather_Dat[i].WindScale,0,4);
                    memcpy(Weather_Dat[i].WindScale,weather_tmp,strlen(weather_tmp));
                  
                    weather_tmp = cJSON_GetObjectItem(forecast_json, "humidity") -> valuestring;//濕度
                    memset(Weather_Dat[i].Humi,0,4);
                    memcpy(Weather_Dat[i].Humi,weather_tmp,strlen(weather_tmp));
                }
            }
            else
            {
                //printf("daily json格式錯(cuò)誤
");
                Weather_Dat[0].Flag = 0;
}


        }
        else
        {
            Weather_Dat[0].Flag = 0;
            //printf("results格式錯(cuò)誤:%s
", cJSON_GetErrorPtr());
        }
    }
    else
    {
        Weather_Dat[0].Flag = 0;
        //printf("JSON格式錯(cuò)誤
");
    }
    cJSON_Delete(root);  
}
解析后,將有用數(shù)據(jù)轉(zhuǎn)換為自己想要的格式存儲(chǔ)在變量中。需要注意的是,cJSON可能占用較大的堆棧,因此堆棧需要設(shè)大一些。

總結(jié)一下,獲取天氣預(yù)報(bào)的步驟如下:

1.注冊(cè)賬號(hào)。

2.獲取私鑰。

3.連接服務(wù)器。

AT+CIPSTART="TCP”,” api.seniverse.com”,80

4..打開(kāi)傳透模式。

AT+CIPSEND

5..收到‘>’符號(hào)后,發(fā)送GET請(qǐng)求

GET https://api.seniverse.com/v3/weather/daily.json?key=your_key&location=ip&language=zh-Hans&unit=c&start=0&days=3

6.等待接收數(shù)據(jù),并解析。

以上就是單片機(jī)通過(guò)AT指令訪問(wèn)WIFI模塊獲取網(wǎng)絡(luò)時(shí)間和天氣預(yù)報(bào)的方法,需要注意的是上述所有指令后面別忘了加回車換行符。






審核編輯:劉清

聲明:本文內(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)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6037

    文章

    44569

    瀏覽量

    636152
  • 觸摸屏
    +關(guān)注

    關(guān)注

    42

    文章

    2309

    瀏覽量

    116331
  • wifi模塊
    +關(guān)注

    關(guān)注

    60

    文章

    380

    瀏覽量

    73540
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    45105

原文標(biāo)題:?jiǎn)纹瑱C(jī)通過(guò)WIFI模塊(ESP8266)獲取網(wǎng)絡(luò)時(shí)間與天氣預(yù)報(bào)

文章出處:【微信號(hào):嵌入式技術(shù)開(kāi)發(fā),微信公眾號(hào):嵌入式技術(shù)開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    怎樣去設(shè)計(jì)一種基于rt-thread帶有顯示時(shí)間天氣預(yù)報(bào)功能的桌面小盒子

    摘要這個(gè)桌面小盒子是之前的東西,一直放著沒(méi)有整理好。最近有空了就把他整理整理。小盒子主要用來(lái)顯示時(shí)間天氣預(yù)報(bào),功能比較簡(jiǎn)單,其實(shí)還有很多可以玩的,懶得弄,所以就把最簡(jiǎn)單的整理出來(lái)。軟件
    發(fā)表于 03-31 14:46

    基于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

    【Banana PI Leaf S3開(kāi)發(fā)板試用體驗(yàn)】基于Banana PI Leaf S3的天氣預(yù)報(bào)系統(tǒng)

    request獲取本地天氣預(yù)報(bào),然后再解析返回的JSON,實(shí)現(xiàn)幾個(gè)關(guān)鍵詞的內(nèi)容在OLED上 的顯示。至于HTTPS與HTTP的選擇,當(dāng)然是越簡(jiǎn)單越好了,找了個(gè)HTTP的天氣網(wǎng)站(ht
    發(fā)表于 10-17 20:06

    【國(guó)民技術(shù)N32項(xiàng)目移植】5.項(xiàng)目提交-天氣顯示及預(yù)報(bào)系統(tǒng)介紹以及演示

    SPI+DAM驅(qū)動(dòng)觸摸LCD(ST7789+XPT2046)4.天氣顯示及預(yù)報(bào)系統(tǒng)之ESP8266聯(lián)網(wǎng)以及獲取天氣
    發(fā)表于 02-22 19:53

    Android智能手機(jī)天氣預(yù)報(bào)系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)

    Android智能手機(jī)天氣預(yù)報(bào)系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)
    發(fā)表于 01-14 11:22 ?22次下載

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

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

    基于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)目成本低廉,主要
    的頭像 發(fā)表于 12-07 11:09 ?5471次閱讀

    基于天氣預(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)源分享

    基于SWM32單片機(jī)+LVGL的4.3寸觸摸屏設(shè)計(jì)

    Uart1通過(guò)AT 指令訪問(wèn)WIFI模塊,連接WIFI后,訪問(wèn)心知天氣,獲取當(dāng)?shù)氐?b class='flag-5'>天氣預(yù)報(bào);訪問(wèn)時(shí)間
    的頭像 發(fā)表于 11-22 17:34 ?2032次閱讀

    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>小矮人

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

    當(dāng)前文章介紹如何使用ESP8266和STM32微控制器,搭配OLED顯示,制作一個(gè)能夠?qū)崟r(shí)顯示天氣預(yù)報(bào)的智能設(shè)備。將使用心知天氣API來(lái)獲取天氣
    的頭像 發(fā)表于 04-27 13:45 ?2338次閱讀

    天氣預(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)目

    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 ?407次閱讀
    AWTK 開(kāi)源串口<b class='flag-5'>屏</b>開(kāi)發(fā)(11) - <b class='flag-5'>天氣預(yù)報(bào)</b>