下载 WM IOT SDK2. X, 按照官方的 SDK 文档配置好开发环境, 本项目是基于 VS CODE 环境的开发, 大家可以参考官方的 SDK 关于 VS CODE 环境搭建部分. 如下链接
https: //doc. winnermicro. net/w800/zh_CN/latest/get_started/ide. html
如下链接是本项目的开源地址, 欢迎大家指正, 此仓库包含了 SDK 和应用程序两部分
https: //gitee. com/Bryan_He/w803_lcd_demo. git
代码结构目录:
拉取工程项目代码后, 按官方的 SDK 描述文档, 使用 VS code 打开导入项目, 另外需要导入 menuconfig 文件, 如下是我配置工程后导出的配置文件, 可在 menuconfig 界面导入这个配置
本项目访问的是心知天气的服务器, 服务器端使用的是 HTTPS 协议, 在 menuconfig 中需把 HTTPS 相关的配置勾选上, 不然访问服务器会报错.
如下是报错信息
解决办法如下
天气解析部分代码
int wm_weather_httpc_get (void)
{
wm_http_client_config_t cfg = { 0 };
cfg. method = WM_HTTP_CLIENT_REQUEST_TYPE_GET;
cfg. keep_alive = 1;
cfg. content_type = WM_HTTP_CLIENT_CONTENT_APPLICATION_JSON;
cfg. event_handler = wm_httpc_event_handle;
return wm_httpc_example_send_req (&cfg, "https: //api. seniverse. com/v3/weather/daily. json? key=SUCC86skWZuKkdxCM&location=ip&language=zh-Hans&unit=c&start=0&days=3", NULL, 0) ;
}
extern uint8_t weather_active;
static int cjson_extract_weathe_datas (char *value) {
int i=0;
// 解析 JSON
cJSON *root = cJSON_Parse (value) ;
if (! root) {
printf ("JSON parse error: %s\n", cJSON_GetErrorPtr () ) ;
return 1;
}
// 获取 results 数组
cJSON *results = cJSON_GetObjectItemCaseSensitive (root, "results") ;
if (! cJSON_IsArray (results) ) {
printf ("Results is not an array\n") ;
cJSON_Delete (root) ;
return 1;
}
// 遍历 results 数组
cJSON *result_item;
cJSON_ArrayForEach (result_item, results) {
// 解析 location 信息
cJSON *location = cJSON_GetObjectItemCaseSensitive (result_item, "location") ;
if (location) {
// printf ("城市信息: \n") ;
sprintf (xinzhiWifor. location_id, "%s", cJSON_GetStringValue (cJSON_GetObjectItem (location, "id") ) ) ;
// printf ("ID: %s\n", xinzhiWifor. location_id) ;
// printf ("名称: %s\n", cJSON_GetStringValue (cJSON_GetObjectItem (location, "name") ) ) ;
// printf ("国家: %s\n", cJSON_GetStringValue (cJSON_GetObjectItem (location, "country") ) ) ;
}
// 解析 daily 天气预报数组
cJSON *daily = cJSON_GetObjectItemCaseSensitive (result_item, "daily") ;
if (cJSON_IsArray (daily) ) {
// printf ("\n 天气预报: \n") ;
cJSON *daily_item;
char *end;
uint8_t day_code, night_code;
uint8_t tl, th;
cJSON_ArrayForEach (daily_item, daily) {
day_code = strtol (cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "code_day") ) , &end, 10) ;
night_code = strtol (cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "code_night") ) , &end, 10) ;
tl = strtol (cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "low") ) , &end, 10) ;
th = strtol (cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "high") ) , &end, 10) ;
sprintf (xinzhiWifor. weather_obj[i]. date, "%s", cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "date") ) ) ;
// printf ("code_day: %d\n", day_code) ;
// printf ("日期: %s\n", xinzhiWifor. weather_obj[i]. date) ;
// printf ("白天: %s\n", cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "text_day") ) ) ;
// printf ("温度: %d℃ ~ %d℃\n", tl, th) ;
// printf ("风速: %s 级 (%sm/s) \n",
// cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "wind_scale") ) ,
// cJSON_GetStringValue (cJSON_GetObjectItem (daily_item, "wind_speed") ) ) ;
// printf ("------------------------\n") ;
xinzhiWifor. weather_obj[i]. code_day = day_code;
xinzhiWifor. weather_obj[i]. code_night = night_code;
xinzhiWifor. weather_obj[i]. temp_h = th;
xinzhiWifor. weather_obj[i]. temp_l = tl;
i++;
weather_active=1;
if (i =MAX_WEATHER_DAYS) break;
}
}
// 解析最后更新时间
cJSON *last_update = cJSON_GetObjectItemCaseSensitive (result_item, "last_update") ;
if (cJSON_IsString (last_update) ) {
printf ("\n 最后更新时间: %s\n", last_update- valuestring) ;
}
}
static void wm_httpc_event_handle (wm_http_client_t session, wm_http_client_event_t event, wm_http_client_event_param_t *param,
void *priv)
{
switch (event) {
case WM_HTTP_CLIENT_EVENT_CONNECTED:
wm_log_info ("WM_HTTP_CLIENT_EVENT_CONNECTED") ;
break;
case WM_HTTP_CLIENT_EVENT_DISCONNECTED:
wm_log_info ("WM_HTTP_CLIENT_EVENT_DISCONNECTED") ;
break;
case WM_HTTP_CLIENT_EVENT_HEADER_SENTED:
wm_log_info ("WM_HTTP_CLIENT_EVENT_HEADER_SENTED") ;
wm_log_info ("%s", (char *) (param- data) ) ;
break;
case WM_HTTP_CLIENT_EVENT_RECV_HEADER:
wm_log_info ("WM_HTTP_CLIENT_EVENT_RECV_HEADER") ;
wm_log_info ("%s", (char *) (param- data) ) ;
break;
case WM_HTTP_CLIENT_EVENT_RECV_DATA:
wm_log_info ("WM_HTTP_CLIENT_EVENT_RECV_DATA") ;
wm_log_info ("%s", (char *) (param- data) ) ;
cjson_extract_weathe_datas ( (char *) (param- data) ) ;
break;
case WM_HTTP_CLIENT_EVENT_FINISH:
wm_log_info ("WM_HTTP_CLIENT_EVENT_FINISH") ;
break;
}
return;
}
除了按官方的 TFT 驱动文档外, 还需修改这个文件中的内容 wmdt. py, 不然驱动无法正常加载, 如下链接是我驱动移植过程中遇到的问题点
官方文档: https: //doc. winnermicro. net/w800/zh_CN/latest/component_guides/driver/drv_tft_lcd. html
问题点链接: http: //ask. winnermicro. com/question/1850. html
本驱动还需在 LVGL 的配置项中按如下配置勾选, 不然颜色不对
SquareLine 工程也要做对应的配置, 如下:
具体代码中做了哪些改动, 大家可以拉取代码, 和官方的 SDK 做个对比就知道改动点了
希望本文能够帮助大家在 TFT-LCD 驱动添加时提供一个参考;
另外希望官方尽快完善更新 TFT-LCD 驱动添加部分的文档, 需加入 wmdt. py 文档修改.
如下是我添加 ST7789 成功后的 menuconfig 配置界面, 可以正常选择我加入的 ST7789 驱动: