久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5684|回復: 3
打印 上一主題 下一主題
收起左側

戰艦V3通過ESP8266獲得網絡天氣

[復制鏈接]
跳轉到指定樓層
樓主
ID:137406 發表于 2017-11-27 16:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
之前用8266和機智云成功通信了, 但是一直不知道8266是怎么設置聯網,因為這個是下載的機智云的固件。后來就尋思著做了這個網絡天氣的。網上幾乎沒有人用STM32做天氣的,基本上都是用arduino或者直接用esp8266+oled。

一、
硬件:戰艦V3 + ESP8266 + 2.8寸屏
軟件:1、esp8266的配置
         2、連接天氣的服務器,get API數據
         3、cjson的移植與解析
         4、UTF8轉GBK轉碼,這個網上很少例程
         5、圖標的取模

   首先配置esp8266為透傳模式


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

while(atk_8266_send_cmd("AT","OK",20))//¼ì2éWIFIÄ£¿éêÇ·ñÔúÏß
        {
                atk_8266_quit_trans();//íË3öí¸′«
                atk_8266_send_cmd("AT+CIPMODE=0","OK",200);  //1رÕí¸′«Ä£ê½        
                Show_Str(40,55,200,16,"Î′¼ì2aμ½Ä£¿é!!!",16,0);
                delay_ms(800);
                LCD_Fill(40,55,200,55+16,WHITE);
                Show_Str(40,55,200,16,"3¢êÔᬽóÄ£¿é...",16,0);
        }
        while(atk_8266_send_cmd("ATE0","OK",20));//1رջØÏÔ
        atk_8266_send_cmd("AT+CWMODE=1","OK",50);                //éèÖÃWIFI STAÄ£ê½
        atk_8266_send_cmd("AT+RST","OK",20);                //DHCP·tÎñÆ÷1رÕ(½öAPÄ£ê½óDD§)
        delay_ms(1000);         //Ñóê±3Sμè′yÖØÆô3é1|
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        //éèÖÃᬽóμ½μÄWIFIíøÂçÃû3Æ/¼óÃü·½ê½/ÃüÂë,Õa¼¸¸ö2ÎêyDèòa¸ù¾YÄú×Ô¼oμÄ·óéÆ÷éèÖýøDDDT¸Ä!!
        atk_8266_send_cmd("AT+CIPMUX=0","OK",20);   //0£oμ¥ᬽó£¬1£o¶àᬽó
        sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//éèÖÃÎTÏß2Îêy:ssid,ÃüÂë
        while(atk_8266_send_cmd(p,"WIFI GOT IP",300));                                        //ᬽóÄ¿±ê·óéÆ÷,2¢Çò»ñμÃIP





然后連接天氣服務器,get API


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM);    //ÅäÖÃÄ¿±êTCP·tÎñÆ÷
        res = atk_8266_send_cmd(p,"OK",200);//ᬽóμ½Ä¿±êTCP·tÎñÆ÷
        if(res==1)
        {
                myfree(SRAMIN,p);
                return 1;
        }
        delay_ms(300);
        atk_8266_send_cmd("AT+CIPMODE=1","OK",100);      //′«êäÄ£ê½Îa£oí¸′«        
        atk_8266_get_wanip(ipbuf);//»ñè¡WAN IP
        sprintf((char*)p,"IPμØÖ·:%s ¶Ë¿ú:%s",ipbuf,(u8*)WEATHER_PORTNUM);
//        Show_Str(30,65,200,12,p,12,0);                                //ÏÔê¾IPμØÖ·oí¶Ë¿ú        
        USART3_RX_STA=0;
        atk_8266_send_cmd("AT+CIPSEND","OK",100);         //¿aê¼í¸′«
        printf("start trans...\r\n");

        u3_printf("GET [color=rgb(0, 130, 0) !important][url=https://api.seniverse.com/]https://api.seniverse.com[/url]);







然后再解析這個API返回的數據,并予以顯示。

二、
1.目前免費的API有很多,我比較喜歡“心知天氣”( https://www.seniverse.com/ )和 “和風天氣”(http://www.heweather.com/  )。
  大家可以到這兩個網站去注冊,選擇你們喜歡的天氣API。心知天氣的免費API返回的數據表少,功能較少。而和風天氣的免費API則返回的比較詳細。
  我這里選擇心知天氣,然后大家可以去看看心知天氣的文檔,里面有詳細的數據結構(cjson數據)。
2.移植和解析cjson。
  這個東西很簡單,我也是第一次移植,不過看了一篇教程就會了。推薦大家看下這兩篇文章就可以了。
  http://blog.csdn.net/xukai871105/article/details/32346797    這個講cjson的格式講的蠻好的
  http://blog.csdn.net/lintax/article/details/50993958     這個講cjson的使用
  https://sourceforge.net/projects/cjson/          這個網站是下載cjson的

  移植cjson,注意兩點,一個是cjson占用堆比較大,大約3K,這個坑我就遇到了,使用默認的堆大小不能運行,于是我把堆改成了4K。




  第二點就是 要為 cjson 配置malloc ,打開cjson.c,修改下面幾處。修改成原子的mymalloc,由于原子的mymalloc有個選擇SRAMIN的參數,所以我又封裝了下,弄了個my_malloc。
  



3.連接天氣服務器,然后get 天氣的api。
   這里卡了好半天,一開始用網口調試助手連上了服務器,然后get那個API鏈接的時候,一直不成功,原來是要在這個鏈接后面加兩個回車,這個得感謝壇友  svwydh


4.解析天氣數據
  用cjson庫來解析天氣數據,這里有個問題就是獲得的天氣數據的格式都是  utf8 的,無法直接顯示在屏上,需要轉碼成GBK的,而原子哥的漢字例程就是gbk的。
  utf8轉gbk這個網上也比較少,問了很多網友,有人說用查表法,于是又去找,僥幸找到了一個類似的,然后修改了下,居然可以用。


5.圖標的制作
  首先自己去選一套漂亮的天氣圖標,我剛才推薦的那兩個網站里已經為大家準備了圖標,可自行下載。
  然后用戰艦光盤里那個Image2lcd的軟件,選擇輸出灰度為單色,這樣取模以后的數據最小。打開你的天氣圖標,然后點保存,就可以保存為一個數組的c文件,將這個
  數組添加到你的工程里去。


大體上的難點和知識點就是上面這些。

上幾張效果圖。一張彩色的,一張白色的,大家覺得哪個好看點。


接下來傳個演示視頻由于視頻不能播放,先放個鏈接:http://v.youku.com/v_show/id_XMz ... qq-pf-to=pcqq.group


如果大家感興趣,將會上傳源碼。
@svwydh 感謝


  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"                           
  5. #include "lcd.h"  
  6. #include "key.h"     
  7. #include "malloc.h"
  8. #include "sdio_sdcard.h"  
  9. #include "w25qxx.h"   
  10. #include "ff.h"  
  11. #include "exfuns.h"   
  12. #include "text.h"       
  13. #include "touch.h"               
  14. #include "usart3.h"
  15. #include "wifista.h"
  16. #include "weather.h"
  17. #include "cJSON.h"
  18. #include "picture.h"
  19. #include "rtc.h"

  20. //static void create_complex(void);
  21. void show_weather(void);
  22. void show_time(void);

  23. int main(void)
  24. {         
  25.         u8 key,fontok=0;
  26.         u16 t=0;
  27.         u8 min;         
  28.         u8 hour;
  29.         u8 constate=0;        //連接狀態
  30.         delay_init();                     //延時函數初始化          
  31.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
  32.         uart_init(115200);                 //串口初始化為115200
  33.        
  34.         LED_Init();                                          //初始化與LED連接的硬件接口
  35.         KEY_Init();                                        //初始化按鍵
  36.         LCD_Init();                                           //初始化LCD   
  37.         RTC_Init();
  38.         W25QXX_Init();                                //初始化W25Q128
  39.         tp_dev.init();                                //初始化觸摸屏
  40.         usart3_init(115200);                //初始化串口3
  41.         my_mem_init(SRAMIN);                //初始化內部內存池
  42.         exfuns_init();                                //為fatfs相關變量申請內存  
  43.         f_mount(fs[0],"0:",1);                 //掛載SD卡
  44.         f_mount(fs[1],"1:",1);                 //掛載FLASH.
  45.         key=KEY_Scan(0);  
  46.         if(key==KEY0_PRES&&((tp_dev.touchtype&0X80)==0))//強制校準
  47.         {
  48.                 LCD_Clear(WHITE);                //清屏0
  49.                 TP_Adjust();                          //屏幕校準
  50.                 TP_Save_Adjdata();          
  51.                 LCD_Clear(WHITE);                //清屏
  52.         }
  53.         fontok=font_init();                        //檢查字庫是否OK
  54.         if(fontok||key==KEY1_PRES)        //需要更新字庫                                 
  55.         {
  56.                 LCD_Clear(WHITE);                //清屏
  57.                 POINT_COLOR=WHITE;                //設置字體為紅色                                
  58.                 LCD_ShowString(60,50,200,16,16,"ALIENTEK STM32");
  59.                 while(SD_Init())                //檢測SD卡
  60.                 {
  61.                         LCD_ShowString(60,70,200,16,16,"SD Card Failed!");
  62.                         delay_ms(200);
  63.                         LCD_Fill(60,70,200+60,70+16,WHITE);
  64.                         delay_ms(200);                    
  65.                 }                                                                                                                     
  66.                 LCD_ShowString(60,70,200,16,16,"SD Card OK");
  67.                 LCD_ShowString(60,90,200,16,16,"Font Updating...");
  68.                 key=update_font(20,110,16,"0:");//從SD卡更新
  69.                 while(key)//更新失敗               
  70.                 {                                           
  71.                         LCD_ShowString(60,110,200,16,16,"Font Update Failed!");
  72.                         delay_ms(200);
  73.                         LCD_Fill(20,110,200+20,110+16,WHITE);
  74.                         delay_ms(200);                       
  75.                 }                   
  76.                 LCD_ShowString(60,110,200,16,16,"Font Update Success!");
  77.                 delay_ms(1500);       
  78.                 LCD_Clear(WHITE);//清屏               
  79.         }
  80.        
  81. //        create_complex();
  82.         delay_ms(200);
  83.         LED0 = 0;
  84.         show_weather();
  85.         atk_8266_wifista_config();
  86.         printf("wifi init ok!");
  87.         POINT_COLOR = WHITE;
  88.         delay_ms(1000);
  89.         get_current_weather();
  90.         delay_ms(200);
  91.         get_3days_weather();
  92.         min = calendar.min;
  93.         hour = calendar.hour;
  94.         while(1)
  95.         {
  96.                 key = KEY_Scan(0);
  97.                 if(key==KEY0_PRES)
  98.                 {
  99.                         get_current_weather();                       
  100.                 }
  101.                 else if(key==KEY1_PRES)
  102.                 {
  103.                         get_3days_weather();
  104.                 }
  105.                 else if(key==KEY2_PRES)
  106.                 {
  107.                         get_beijing_time();
  108.                 }
  109.                 delay_ms(10);
  110.                 t++;
  111.                 if(t==1000)
  112.                 {
  113.                         constate=atk_8266_consta_check();//得到連接狀態         
  114.                         t=0;
  115.                 }
  116.                 else if((t%100)==0)
  117.                 {
  118.                         LED1 = !LED1;
  119.                         show_time();
  120.                 }
  121.                
  122.                 if(min!=calendar.min)
  123.                 {
  124.                         get_current_weather();                               
  125.                         min = calendar.min;
  126.                 }
  127.                 if(hour!=calendar.hour)
  128.                 {
  129.                         get_3days_weather();
  130.                         hour = calendar.hour;
  131.                 }

  132.                 atk_8266_at_response(1);
  133.         }
  134. }

  135. //void create_complex(void) {  
  136. //        cJSON *root, *rows, *row;  
  137. //        char *out;  
  138. //        int i = 0;  
  139. //               
  140. //        char *title[3] = { "樹莓派學習筆記-索引博文",  
  141. //        "樹莓派學習筆記-GPIO功能學習",  
  142. //        "物聯網學習筆記-索引博文"};  
  143. //        char *url[3] = { "http://blog.csdn.net/xukai871105/article/details/23115627",  
  144. //        "http://blog.csdn.net/xukai871105/article/details/12684617",  
  145. //        "http://blog.csdn.net/xukai871105/article/details/23366187"};  
  146. //               
  147. //        root = cJSON_CreateObject(); // 創建根
  148. //        cJSON_AddNumberToObject(root, "total", 3);  
  149. //               
  150. //        // 在object加入array  
  151. //        cJSON_AddItemToObject(root, "rows", rows = cJSON_CreateArray());  
  152. //               
  153. //        for(i = 0; i < 3; i++) {  
  154. //        // 在array加入object  
  155. //        cJSON_AddItemToArray(rows, row = cJSON_CreateObject());  
  156. //        cJSON_AddItemToObject(row, "title", cJSON_CreateString(title[i]));  
  157. //        cJSON_AddItemToObject(row, "url", cJSON_CreateString(url[i]));  
  158. //        }  
  159. //               
  160. //        // 打印并釋放  
  161. //        out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); my_free(out);  
  162. //}  


  163. void show_weather(void)
  164. {
  165.         u8 res;
  166.         file = mymalloc(SRAMIN,sizeof(FIL));
  167.         res=f_open(file,(const TCHAR*)APP_ASCII_5427,FA_READ);//打開文件
  168.         if(res==FR_OK)
  169.         {
  170.                 asc2_5427 = mymalloc(SRAMIN,file->fsize);
  171.                 if(asc2_5427 != NULL)
  172.                 {
  173.                         res = f_read(file,asc2_5427,file->fsize,&br);
  174.                 }
  175.                 f_close(file);
  176.         }
  177.         LCD_Clear(BLACK);
  178.         POINT_COLOR = WHITE;
  179.         BACK_COLOR = BLACK;
  180.         Show_Str(0,0,lcddev.width,lcddev.height,"中國",16,0);
  181.         LCD_ShowString(160,0,lcddev.width,lcddev.height,16,"0000-00-00");
  182.         LCD_ShowString(255,0,lcddev.width,lcddev.height,16,"00:00:00");
  183. //        POINT_COLOR = RED;
  184.         LCD_Draw_Picture(30,5,130,105,(u8 *)gImage_sunny);
  185.         gui_show_num(140,22,2,WHITE,54,0,0x80);
  186. //        POINT_COLOR = WHITE;
  187.         Show_Str(200,25,lcddev.width,lcddev.height,"°",24,0);
  188. //        POINT_COLOR = GBLUE;
  189.         Show_Str(220,25,lcddev.width,lcddev.height,"晴天",16,0);
  190.         Show_Str(220,45,lcddev.width,lcddev.height,"北風",16,0);
  191.         Show_Str(220,65,lcddev.width,lcddev.height,"0級",16,0);
  192.         Show_Str(220,85,lcddev.width,lcddev.height,"風速  0Km/h",16,0);
  193. //        POINT_COLOR = WHITE;
  194.         LCD_DrawLine(0,105,lcddev.width,105);
  195.         LCD_DrawLine(105,130,105,220);
  196.         LCD_DrawLine(215,130,215,220);
  197.         LCD_Draw_Picture(0,140,100,240,(u8 *)gImage_sunny);
  198.         LCD_Draw_Picture(110,140,210,240,(u8 *)gImage_sunny);
  199.         LCD_Draw_Picture(220,140,320,240,(u8 *)gImage_sunny);
  200. //        POINT_COLOR = YELLOW;
  201.         Show_Str(30,117,lcddev.width,lcddev.height,"今天",12,0);

  202.         LCD_ShowString(30,130,lcddev.width,lcddev.height,12,"00/00");
  203. //        POINT_COLOR = GREEN;
  204.         Show_Str(140,117,lcddev.width,lcddev.height,"明天",12,0);

  205.         LCD_ShowString(140,130,lcddev.width,lcddev.height,12,"00/00");
  206. //        POINT_COLOR = MAGENTA;
  207.         Show_Str(250,117,lcddev.width,lcddev.height,"后天",12,0);       

  208.         LCD_ShowString(250,130,lcddev.width,lcddev.height,12,"00/00");
  209.        
  210.         myfree(SRAMIN,file);
  211.         myfree(SRAMIN,asc2_5427);
  212. }


  213. void show_time(void)
  214. {
  215.         LCD_ShowNum(160,0,calendar.w_year,4,16);
  216.         LCD_ShowxNum(200,0,calendar.w_month,2,16,0x80);
  217.         LCD_ShowxNum(224,0,calendar.w_date,2,16,0x80);       
  218.         LCD_ShowxNum(255,0,calendar.hour,2,16,0x80);
  219.         LCD_ShowxNum(279,0,calendar.min,2,16,0x80);       
  220.         LCD_ShowxNum(303,0,calendar.sec,2,16,0x80);       
  221. }












復制代碼


以下是源碼,喜歡的可自行下載。 ESP8266獲取網絡天氣適配戰艦V3.zip

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:339500 發表于 2018-11-12 19:04 | 只看該作者
我想用51單片機實現顯示天氣功能,不知道怎么實現第三步,就這個天氣服務器怎么連接,假設我用python語言自己寫了一個服務器,我已經把天氣信息寫在服務器里該怎么連接怎么把數據弄給51單片機是個問題
3.連接天氣服務器,然后get 天氣的api。
   這里卡了好半天,一開始用網口調試助手連上了服務器
回復

使用道具 舉報

板凳
ID:192650 發表于 2019-8-22 08:51 | 只看該作者
qq23230233 發表于 2018-11-12 19:04
我想用51單片機實現顯示天氣功能,不知道怎么實現第三步,就這個天氣服務器怎么連接,假設我用python語言自 ...

使用WiFi模塊連接你服務器獲取數據
回復

使用道具 舉報

地板
ID:184978 發表于 2022-4-16 13:04 | 只看該作者
為什么下載不了呢?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片入口 | 日韩字幕一区 | 激情欧美日韩一区二区 | 99久久日韩精品免费热麻豆美女 | 欧美精品在线免费观看 | 日韩精品av一区二区三区 | 亚洲欧洲在线视频 | 日韩精品在线看 | 国产精品高潮呻吟久久 | 久久国内精品 | 欧美亚洲第一区 | 最新国产精品视频 | 午夜羞羞 | 亚洲免费人成在线视频观看 | 国产一区二区三区久久久久久久久 | www.色婷婷 | 色伊人网 | 91精品国产92 | 日本午夜视频 | 伊人超碰 | 成人欧美一区二区三区白人 | 亚洲精品高清视频在线观看 | 欧美一级三级 | 亚洲一区二区三区国产 | 不卡一二三区 | 成人精品视频在线观看 | 亚洲一区二区综合 | 91精品国产综合久久精品 | 黄色一级电影免费观看 | 国产精品免费av | 99国产视频 | 成年人黄色一级片 | 国内精品久久精品 | 久久久久久亚洲国产精品 | 一区二区三区小视频 | 亚洲欧美在线一区 | 欧美精品久久久久 | 黄色片在线看 | 日本三级日产三级国产三级 | 伊人网伊人 | 成人精品一区二区三区 |