W801 实现获取天气情况

        看了小安派(AiPi-Eyes 天气站)的源码,感觉用W801也可以实现。

一、部分源码

main.c

#include "wm_include.h"
#include "Lcd_Driver.h"void UserMain(void)
{printf("\n user task \n");Lcd_Init();Lcd_Clear(RED);CreateWeatherTask();
}

 weather.c(该文件需保存为UTF8格式)

#include "Lcd_Driver.h"
#include "wm_include.h"
#include "LCD_calculate.h"
#include "cJSON.h"
#include "ctype.h"#define SSID		"SSID"
#define PASSWORD 	"PASSWORD"#define HTTPURL		"http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=此处需替换为自己的KEY"#define    DEMO_TASK_SIZE      2048
static tls_os_queue_t 	*weather_q = NULL;
static OS_STK 			WeatherTaskStk[DEMO_TASK_SIZE];extern int demo_connect_net(void *, ...);
extern int http_get_demo(void *, ...);/*** @brief** @param weather_data
*/
void cjson_get_weather(char* weather_data)
{cJSON * item = NULL;//cjson对象cJSON* root = cJSON_Parse(weather_data );if (!root) {//printf("Error before: [%s]\n",cJSON_GetErrorPtr());}else{Gui_DrawFont_GBK16(5,95,WHITE,RED,"                           ");item = cJSON_GetObjectItem(root, "city");			//城市Gui_DrawFont_utf8_3bytes_16(5,15,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "cityEn");			//城市英文Gui_DrawFont_utf8_3bytes_16(40,15,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "wea");Gui_DrawFont_utf8_3bytes_16(5,35,WHITE,RED,"天气:");Gui_DrawFont_utf8_3bytes_16(60,35,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "tem");			//温度Gui_DrawFont_utf8_3bytes_16(5,55,WHITE,RED,"温度:");Gui_DrawFont_GBK24(60,55,WHITE,RED,item->valuestring);Gui_DrawFont_utf8_3bytes_16(100,55,WHITE,RED,"℃");item = cJSON_GetObjectItem(root, "win");			//风Gui_DrawFont_utf8_3bytes_16(5,75,WHITE,RED,item->valuestring);item = cJSON_GetObjectItem(root, "air_level");		//空气质量Gui_DrawFont_utf8_3bytes_16(69,75,WHITE,RED,item->valuestring);}cJSON_free(item);cJSON_Delete(root);}void weather_task(void *sdata)
{Gui_DrawFont_GBK16(5,95,WHITE,RED,"Start......                     ");if(demo_connect_net(SSID,PASSWORD)==WM_SUCCESS){Gui_DrawFont_GBK16(5,95,WHITE,RED,"Connected                    ");tls_os_time_delay(3000);http_get_demo(HTTPURL);}for(;;){tls_os_time_delay(100);}	
}void CreateWeatherTask(void)
{tls_os_queue_create(&weather_q, DEMO_QUEUE_SIZE);tls_os_task_create(NULL, NULL,weather_task,NULL,(void *)WeatherTaskStk,          /* task's stack start address */DEMO_TASK_SIZE * sizeof(u32), /* task's stack size, unit:byte */DEMO_TASK_PRIO,0);
}

 Gui_DrawFont_utf8_3bytes_16函数,用来显示3字节UTF8编码的汉字

void Gui_DrawFont_utf8_3bytes_16(unsigned int x, unsigned int y, unsigned int fc, unsigned int bc, char *s)
{unsigned char i,j;unsigned short k,x0;x0=x;while(*s) {	for (k=0;k<sizeof(UTF8_hz16)/sizeof(UTF8_hz16[0]);k++) {if ((UTF8_hz16[k].Index[0]==*s)&&(UTF8_hz16[k].Index[1]==*(s+1))&&(UTF8_hz16[k].Index[2]==*(s+2))){ for(i=0;i<16;i++){for(j=0;j<8;j++) {if(UTF8_hz16[k].Msk[i*2]&(0x80>>j))	Gui_DrawPoint(x+j,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j,y+i,bc);}}for(j=0;j<8;j++) {if(UTF8_hz16[k].Msk[i*2+1]&(0x80>>j))	Gui_DrawPoint(x+j+8,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j+8,y+i,bc);}}}break;}}if(k!=sizeof(UTF8_hz16)/sizeof(UTF8_hz16[0])){s+=3;x+=16;}else		//ASC字符{k=*s;if (k>32) k-=32; else k=0;for(i=0;i<16;i++)for(j=0;j<8;j++) {if(asc16[k*16+i]&(0x80>>j))	Gui_DrawPoint(x+j,y+i,fc);else {if (fc!=bc) Gui_DrawPoint(x+j,y+i,bc);}}s++;x+=8;}}
}

 字模文件(UTF8格式文件)

#ifndef __FONTUTF8_H__
#define __FONTUTF8_H__struct typFNT_UrlCode
{unsigned char Index[3];	char Msk[32];
};
//阴码、逐行、顺向
const struct typFNT_UrlCode UTF8_hz16[] = {"城",0x20,0x28,0x20,0x24,0x20,0x20,0x27,0xFE,0x24,0x20,0xFC,0x20,0x24,0x24,0x27,0xA4,0x24,0xA4,0x24,0xA8,0x24,0xA8,0x3C,0x90,0xE6,0x92,0x49,0x2A,0x08,0x46,0x10,0x82,/*"城",0*/
"市",0x02,0x00,0x01,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x28,0x21,0x10,0x01,0x00,0x01,0x00,/*"市",1*/
"京",0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x45,0x04,0x02,0x00,/*"京",1*/}
#endif

在wm_sdk_w80x_20211115\demo\wm_http_demo.c中http_snd_req函数,增加一行:cjson_get_weather(Buffer);用于处理返回的json信息。


u32 http_snd_req(HTTPParameters ClientParams, HTTP_VERB verb, char *pSndData, u8 parseXmlJson)
{int                   nRetCode;u32                   nSize, nTotal = 0;char                 *Buffer = NULL;HTTP_SESSION_HANDLE   pHTTP;u32                   nSndDataLen ;do{Buffer = (char *)tls_mem_alloc(HTTP_CLIENT_BUFFER_SIZE);if(Buffer == NULL){return HTTP_CLIENT_ERROR_NO_MEMORY;}memset(Buffer, 0, HTTP_CLIENT_BUFFER_SIZE);printf("HTTP Client v1.0\r\n");nSndDataLen = (pSndData == NULL ? 0 : strlen(pSndData));// Open the HTTP request handlepHTTP = HTTPClientOpenRequest(0);if(!pHTTP){nRetCode =  HTTP_CLIENT_ERROR_INVALID_HANDLE;break;}// Set the VerbnRetCode = HTTPClientSetVerb(pHTTP, verb);if(nRetCode != HTTP_CLIENT_SUCCESS){break;}
#if TLS_CONFIG_HTTP_CLIENT_AUTH// Set authenticationif(ClientParams.AuthType != AuthSchemaNone){if((nRetCode = HTTPClientSetAuth(pHTTP, ClientParams.AuthType, NULL)) != HTTP_CLIENT_SUCCESS){break;}// Set authenticationif((nRetCode = HTTPClientSetCredentials(pHTTP, ClientParams.UserName, ClientParams.Password)) != HTTP_CLIENT_SUCCESS){break;}}
#endif //TLS_CONFIG_HTTP_CLIENT_AUTH
#if TLS_CONFIG_HTTP_CLIENT_PROXY// Use Proxy serverif(ClientParams.UseProxy == TRUE){if((nRetCode = HTTPClientSetProxy(pHTTP, ClientParams.ProxyHost, ClientParams.ProxyPort, NULL, NULL)) != HTTP_CLIENT_SUCCESS){break;}}
#endif //TLS_CONFIG_HTTP_CLIENT_PROXYif((nRetCode = HTTPClientSendRequest(pHTTP, ClientParams.Uri, pSndData, nSndDataLen, verb == VerbPost || verb == VerbPut, 0, 0)) != HTTP_CLIENT_SUCCESS){break;}// Retrieve the the headers and analyze themif((nRetCode = HTTPClientRecvResponse(pHTTP, 30)) != HTTP_CLIENT_SUCCESS){break;}printf("Start to receive data from remote server...\r\n");// Get the data until we get an error or end of stream codewhile(nRetCode == HTTP_CLIENT_SUCCESS || nRetCode != HTTP_CLIENT_EOS){// Set the size of our buffernSize = HTTP_CLIENT_BUFFER_SIZE;// Get the datanRetCode = HTTPClientReadData(pHTTP, Buffer, nSize, 300, &nSize);if(nRetCode != HTTP_CLIENT_SUCCESS && nRetCode != HTTP_CLIENT_EOS)break;cjson_get_weather(Buffer);        //增加了这一句nTotal += nSize;}}while(0);   // Run only oncetls_mem_free(Buffer);if(pHTTP)HTTPClientCloseRequest(&pHTTP);if(ClientParams.Verbose == TRUE){printf("\n\nHTTP Client terminated %d (got %d b)\n\n", nRetCode, nTotal);}return nRetCode;
}

二、说明 

1、W801的SDK中DEMO程序有2个函数可以直接用:

extern int demo_connect_net(void *, ...);    //用于连上wifi
extern int http_get_demo(void *, ...);       //用于打开网页获得数据

本质也是lwip。

2、W801的实时操作系统底层还是freertos,只是SDK对freertos进行了封装。。

3、SDK中自带了cjson,但是版本太低,最好替换为最新的。

4、一般显示汉字的部分都是GB2312编码,但是从yiketianqi.com/获取的json格式是UTF8的,所以修改了所有相关函数、字模为UTF8编码。

5、程序修改自SDK 的DEMO,还在整理中。

6、程序烧写及调试信息:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL主从复制(五):读写分离

一主多从架构主要应用场景&#xff1a;读写分离。读写分离的主要目标是分摊主库的压力。 读写分离架构 读写分离架构一 架构一结构图&#xff1a; 这种结构模式下&#xff0c;一般会把数据库的连接信息放在客户端的连接层&#xff0c;由客户端主动做负载均衡。也就是说由客户…

RabbitMQ 消息队列安装及入门

市面常见消息队列中间件对比 技术名称吞吐量 /IO/并发时效性&#xff08;类似延迟&#xff09;消息到达时间可用性可靠性优势应用场景activemq万级高高高简单易学中小型企业、项目rabbitmq万级极高&#xff08;微秒&#xff09;高极高生态好&#xff08;基本什么语言都支持&am…

为什么MySQL推荐使用utf8mb4代替utf8?

前言 在MySQL数据库的世界里&#xff0c;字符集的选择直接影响着数据的存储和检索方式&#xff0c;尤其是对于多语言支持至关重要的应用而言。近年来&#xff0c;utf8mb4字符集逐渐成为MySQL中存储Unicode字符的标准选择&#xff0c;逐步取代了传统的utf8字符集。本文将详细探…

leetcode124 二叉树中的最大路径和-dp

题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解题感悟 提示的太明显了

redis核心面试题二(实战优化)

文章目录 10. redis配置mysql实战优化[重要]11. redis之缓存击穿、缓存穿透、缓存雪崩12. redis实现分布式session 10. redis配置mysql实战优化[重要] // 最初实现OverrideTransactionalpublic Product createProduct(Product product) {productRepo.saveAndFlush(product);je…

MQTT 5.0 报文解析 05:DISCONNECT

欢迎阅读 MQTT 5.0 报文系列 的第五篇文章。在上一篇中&#xff0c;我们已经介绍了 MQTT 5.0 的 PINGREQ 和 PINGRESP 报文。现在&#xff0c;我们将介绍下一个控制报文&#xff1a;DISCONNECT。 在 MQTT 中&#xff0c;客户端和服务端可以在断开网络连接前向对端发送一个 DIS…

手把手教你搭建一个花店小程序商城

如果你是一位花店店主&#xff0c;想要为你的生意搭建一个精美的小程序商城&#xff0c;以下是你将遵循的五个步骤。 步骤1&#xff1a;登录乔拓云平台进入后台 首先&#xff0c;你需要登录乔拓云平台的后台管理页面。你可以在电脑或移动设备上的浏览器中输入乔拓云的官方网站…

2024.5.26 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、Motivation 5、naive Lite-HRNet 6、Lite-HRNet 7、实验 深度学习 解读SAM(Segment Anything Model) 1、SAM Task 2、SAM Model 2.1、Patch Embedding 2.2、Positiona Embedding 2.3、Transformer …

移动端适配:vw适配方案

vw (Viewport Width) 是一种长度单位&#xff0c;代表视口宽度的百分比。1vw 等于视口宽度的1%。在网页设计和前端开发中&#xff0c;vw 单位常用于实现响应式设计和屏幕适配&#xff0c;尤其是针对不同尺寸和分辨率的移动设备。 为什么使用vw适配&#xff1f; 响应式: 使用v…

互联网医院开发:引领智慧医疗新时代

随着科技的迅猛发展和互联网的普及&#xff0c;传统医疗模式正在迎来一场深刻的变革。互联网医院的崛起&#xff0c;打破了时间和空间的限制&#xff0c;为患者和医疗机构带来了更加便捷、高效、安全的医疗服务体验。本文将从技术角度深入探讨互联网医院的开发&#xff0c;包括…

【openpcdet中yaml文件的DATA_AUGMENTOR学习】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、代码二、详细解释DISABLE_AUG_LISTAUG_CONFIG_LIST1. gt_sampling2. random_world_flip3. random_world_rotation4. random_world_scaling 总结 前言 提示…

多线程(八)

一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…

Pod容器资源限制和探针

目录 一、资源限制 1.Pod和容器的资源请求和限制 2.CPU 资源单位 案例一 案例二 二、健康检查&#xff0c;又称为探针&#xff08;Probe&#xff09; 1.探针的三种规则 2.Probe支持三种检查方法 3.探测获得的三种结果 案例一&#xff1a;exec 案例二&#xff1a;htt…

OneMO同行 心级服务:中移物联OneMO模组助力客户终端寒冷环境下的稳定运行

中移物联OneMO模组以客户为中心&#xff0c;基于中国移动心级服务要求&#xff0c;开展“OneMO同行 心级服务 标定一流”高标服务主题活动&#xff0c;升级“服务内容““服务方式”和“服务意识”&#xff0c;为行业客户提供全新的服务体验。 近日&#xff0c;某车载监控设备…

Hive语法学习总结

Hive SQL语法学习总结 hive参数库操作1.创建库2.具体案例3.库的其他操作 表和库的路径演示表的操作创建表插入数据 hive参数 一 hive常用交互命令hive -e sql语句hive -f sql文件 //文件中是sql语句二 参数的设置方式一&#xff1a;在客户端中设置参数(当次有效)set 参数名参…

ACM实训第十七天

Is It A Tree? 问题 考试时应该做不出来&#xff0c;果断放弃 树是一种众所周知的数据结构&#xff0c;它要么是空的(null, void, nothing)&#xff0c;要么是一个或的集合满足以下属性的节点之间有向边连接的节点较多。 •只有一个节点&#xff0c;称为根节点&#xff0c;它…

【Crypto】摩丝

文章目录 一、摩斯解题感悟 一、摩斯 很明显莫尔斯密码 iloveyou还挺浪漫 小小flag&#xff0c;拿下 解题感悟 莫尔斯密码这种题还是比较明显的

【董晓算法】竞赛常用知识之图论3(最近公共祖先)

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列&#xff08;还没学完&#xff09; 【董晓算法】动态规划之线性DP问题-CSDN博客 【董晓算法】动态规划之背包DP问题&#xff…

智能锁千千万,谁是你的NO.1,亲身实测凯迪仕传奇大师K70旗舰新品

智能锁千千万&#xff0c;谁是你的NO.1。欢迎来到智哪儿评测室&#xff0c;这次我们为大家带来了凯迪仕传奇大师K70系列的一款重磅新品。 在科技的浪潮中&#xff0c;家居安全领域正经历着前所未有的变革。智能锁越来越成为家的安全守护神&#xff0c;以及智能生活的得力助手。…