单片机---HLK-W801图形框架LVGL下开发(四)
前文回顧
《單片機—HLK-W801并口驅動ST7789》
《單片機—HLK-W801驅動觸摸屏》
《單片機—HLK-W801圖形框架LVGL移植》
《單片機—HLK-W801圖形框架LVGL下開發(一)》
《單片機—HLK-W801圖形框架LVGL下開發(二)》
《單片機—HLK-W801圖形框架LVGL下開發(三)》
2022年3月24日效果,增加了漢化,APP包括溫濕度,計算器,wifi連接,在wifi連接狀態下,能夠進行NTP時間同步及查詢天氣。
海凌科w801開發的單片機主機
本章重點
之前的版本,說是在w801下開發,也只是硬件是w801,而軟件依舊用的是w806的代碼框架,原因還是w806的代碼框架邏輯十分清晰,使用起來也簡單明了。
不過經過一天的奮戰,還是將所有部分都移植到了w801的代碼框架上了,為的就是能上網啊。
真是年輕人為了上網,啥都做得出來
最新版本LVGL移植
還是簡單的步驟,將源碼和頭文件放在到工程中,我放在了src下的app中
然后就是編譯,可能會報一些函數引用的問題,調整下頭文件包含的順序即可。別問我為什么調整一下就可以,這是我多年工作經驗出來的結果。
屏幕驅動
我用的是ST7789的并口屏幕,配合的是SPI的觸摸屏接口。移植部分前面介紹過,是在w806上,在w801上,主要就是一個寫并口的操作,這個在demo中并沒有,所以還是通過修改單個gpio的方式,分析出了寫8080并口的方式。
下面是關鍵的并口寫入方式。
void P_WRITE_B0_B15(uint16_t data ) {u32 cpu_sr = 0;u32 reg;u32 reg_en;u32 setval=0;cpu_sr = tls_os_set_critical();reg_en = tls_reg_read32(HR_GPIO_DATA_EN + TLS_IO_AB_OFFSET);tls_reg_write32(HR_GPIO_DATA_EN + TLS_IO_AB_OFFSET, reg_en | P_DATA_PIN);reg = tls_reg_read32(HR_GPIO_DATA + TLS_IO_AB_OFFSET);setval=reg&0xFFFF0000;tls_reg_write32(HR_GPIO_DATA + TLS_IO_AB_OFFSET, setval | data);tls_reg_write32(HR_GPIO_DATA_EN + TLS_IO_AB_OFFSET, reg_en);tls_os_release_critical(cpu_sr); }其他部分繼續參考《單片機—HLK-W801并口驅動ST7789》即可
觸摸屏
這里的移植沒有什么區別,就是替換一下原來文檔中的GPIO的操作。
繼續參考《單片機—HLK-W801驅動觸摸屏》
Port層代碼
這部分幾乎還是沒有變化,繼續參考《單片機—HLK-W801圖形框架LVGL移植》
主頁功能
這里介紹一下我制作的這個主頁
其實就是簡單的時鐘,配合幾個button,實現了一個類似桌面菜單的功能,這里值得學習的一點,就是關于win空間的使用,每個簡單功能,可以理解為一個app,都是在一個win上面實現了,在點擊一個button的時候,會先關閉桌面,釋放桌面的資源,包括定時任務,然后啟用一個新的win來繪制所有的app內容。退出的時候,也是類似,釋放所有資源,然后再重新繪制桌面。
這樣才能在單片機這種資源比較少的設備上創建這種多個app的桌面。
資源緊張,就得省著用啊
WIFI聯網
這里才是移植到w801上的最重要的目的。首先繪制了一個頁面用來填寫ssid和密碼
這個空間在官方的例子中就能找到。
然后再點擊確認的時候,調用官方wifidemo的接口就可以聯網,并且稍微做個小彈窗,就知道wifi是否連接成功了。
下面是核心代碼。
static void con_net_status_changed_event(u8 status ) {switch(status){case NETIF_WIFI_JOIN_SUCCESS:{mbox1 = lv_msgbox_create(NULL, "", "WIFI JOIN SUCCESS", NULL, true);lv_obj_center(mbox1);wifi_on=true;}break;case NETIF_WIFI_JOIN_FAILED:{mbox1 = lv_msgbox_create(NULL, "", "WIFI JOIN FAILED", NULL, true);lv_obj_center(mbox1);wifi_on=false;}break;case NETIF_WIFI_DISCONNECTED:{mbox1 = lv_msgbox_create(NULL, "", "WIFI DISCONNECTED", NULL, true);lv_obj_center(mbox1);wifi_on=false;}break;case NETIF_IP_NET_UP:{struct tls_ethif *tmpethif = tls_netif_get_ethif();ip_addr_t *ip=&tmpethif->ip_addr;sprintf(wifi_ip,"%d.%d.%d.%d", ip4_addr1(ip_2_ip4(ip)),ip4_addr2(ip_2_ip4(ip)), ip4_addr3(ip_2_ip4(ip)), ip4_addr4(ip_2_ip4(ip))); printf("wifi_ip:%s\n",wifi_ip); #if TLS_CONFIG_IPV6print_ipaddr(&tmpethif->ip6_addr[0]);print_ipaddr(&tmpethif->ip6_addr[1]);print_ipaddr(&tmpethif->ip6_addr[2]); #endif}break;default://printf("UNKONWN STATE:%d\n", status);break;} }int demo_connect_net(char *ssid, char *pwd) {struct tls_param_ip *ip_param = NULL;u8 wireless_protocol = 0;if (!ssid){return WM_FAILED;}printf("ssid:%s\n", ssid);printf("password:%s\n", pwd);tls_wifi_disconnect();tls_param_get(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, TRUE);if (TLS_PARAM_IEEE80211_INFRA != wireless_protocol){tls_wifi_softap_destroy();wireless_protocol = TLS_PARAM_IEEE80211_INFRA;tls_param_set(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, FALSE);}tls_wifi_set_oneshot_flag(0);ip_param = tls_mem_alloc(sizeof(struct tls_param_ip));if (ip_param){tls_param_get(TLS_PARAM_ID_IP, ip_param, FALSE);ip_param->dhcp_enable = TRUE;tls_param_set(TLS_PARAM_ID_IP, ip_param, FALSE);tls_mem_free(ip_param);}tls_netif_add_status_event(con_net_status_changed_event);tls_wifi_connect((u8 *)ssid, strlen(ssid), (u8 *)pwd, strlen(pwd));printf("\nplease wait connect net......\n");return WM_SUCCESS; }NTP功能
前面的版本時間是手動設置,我們有了wifi,那自然是更希望聯網對時了。界面就很簡單,一個button就可以。
點擊的時候,參考demo中的ntp操作,并且設置到實時時鐘rtc中,就完成了
核心操作函數。
static void ntp_process(lv_event_t * e) {lv_obj_t * mbox1=NULL;char resultntp[128]={0};unsigned int t; struct tm *tblock;t = tls_ntp_client();tblock = localtime((const time_t *)&t); //switch to local timetblock->tm_mon+=1;tls_set_rtc(tblock);sprintf(resultntp,"time:%d.%d.%d %02d:%02d:%02d",tblock->tm_year,tblock->tm_mon,tblock->tm_mday,tblock->tm_hour,tblock->tm_min,tblock->tm_sec);mbox1 = lv_msgbox_create(NULL, "", resultntp, NULL, true);lv_obj_center(mbox1); }天氣預報
這里就是簡單的自動調用web的客戶端程序,參考demo,訪問一個天氣預報的接口,需要是http的,然后解析一下返回的數據即可。
我這里返回的數據是json格式,只取了天氣那一項,然后顯示到界面上就可以。
簡陋是簡陋了點,不過道理就是這樣
注意事項
聯網與不聯網,可以通過記錄在全局變量中,控制桌面不同的app出現,當wifi不連接的時候,我這里只顯示本地的日期和時間設置,不顯示NTP與天氣預報
當網絡連接之后,才顯示聯網的設置,并且不再顯示本地設置時間和日期
并且在設置的操作之后,盡量要添加msg box來提示操作結果。
另外。這個w801的資源也比較緊張,之前還能放張老師的照片,現在只能黑屏當背景了
介紹硬件
這個單片機的主機,其實就是一塊HLK W801的主板,加了一個觸摸顯示屏做的,被我焊接了一下,因為杜邦線實在是太容易掉了,反正也沒別的屏幕了,然后加了一個DHT11模塊,就被我塞到一個牙線盒子里了,
感興趣的可以自己做一個。
代碼下載
雖然是提供《代碼下載地址》,
不過按照前面的步驟,還是自己一步一步搞一下更有成就感。因為關鍵的點基本都說清楚了。
最重要一點,畢竟下載還要花錢。
結束語
今天還是分享一些暖心的事情,畢竟生活還是煩心的事多,需要些溫暖。
我跟我夫人說,我是一個沒有遠慮的人,如果眼前沒有近憂,我就會覺得生活很快樂。小孩子也是這樣,如果不是正在挨批評,他也永遠都是快樂的。
總結
以上是生活随笔為你收集整理的单片机---HLK-W801图形框架LVGL下开发(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 47. 模型加载
- 下一篇: 测试工程师六大能力模型