单片机---HLK-W801图形框架LVGL下开发(四)
前文回顧
《單片機(jī)—HLK-W801并口驅(qū)動ST7789》
《單片機(jī)—HLK-W801驅(qū)動觸摸屏》
《單片機(jī)—HLK-W801圖形框架LVGL移植》
《單片機(jī)—HLK-W801圖形框架LVGL下開發(fā)(一)》
《單片機(jī)—HLK-W801圖形框架LVGL下開發(fā)(二)》
《單片機(jī)—HLK-W801圖形框架LVGL下開發(fā)(三)》
2022年3月24日效果,增加了漢化,APP包括溫濕度,計(jì)算器,wifi連接,在wifi連接狀態(tài)下,能夠進(jìn)行NTP時(shí)間同步及查詢天氣。
海凌科w801開發(fā)的單片機(jī)主機(jī)
本章重點(diǎn)
之前的版本,說是在w801下開發(fā),也只是硬件是w801,而軟件依舊用的是w806的代碼框架,原因還是w806的代碼框架邏輯十分清晰,使用起來也簡單明了。
不過經(jīng)過一天的奮戰(zhàn),還是將所有部分都移植到了w801的代碼框架上了,為的就是能上網(wǎng)啊。
真是年輕人為了上網(wǎng),啥都做得出來
最新版本LVGL移植
還是簡單的步驟,將源碼和頭文件放在到工程中,我放在了src下的app中
然后就是編譯,可能會報(bào)一些函數(shù)引用的問題,調(diào)整下頭文件包含的順序即可。別問我為什么調(diào)整一下就可以,這是我多年工作經(jīng)驗(yàn)出來的結(jié)果。
屏幕驅(qū)動
我用的是ST7789的并口屏幕,配合的是SPI的觸摸屏接口。移植部分前面介紹過,是在w806上,在w801上,主要就是一個(gè)寫并口的操作,這個(gè)在demo中并沒有,所以還是通過修改單個(gè)gpio的方式,分析出了寫8080并口的方式。
下面是關(guān)鍵的并口寫入方式。
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); }其他部分繼續(xù)參考《單片機(jī)—HLK-W801并口驅(qū)動ST7789》即可
觸摸屏
這里的移植沒有什么區(qū)別,就是替換一下原來文檔中的GPIO的操作。
繼續(xù)參考《單片機(jī)—HLK-W801驅(qū)動觸摸屏》
Port層代碼
這部分幾乎還是沒有變化,繼續(xù)參考《單片機(jī)—HLK-W801圖形框架LVGL移植》
主頁功能
這里介紹一下我制作的這個(gè)主頁
其實(shí)就是簡單的時(shí)鐘,配合幾個(gè)button,實(shí)現(xiàn)了一個(gè)類似桌面菜單的功能,這里值得學(xué)習(xí)的一點(diǎn),就是關(guān)于win空間的使用,每個(gè)簡單功能,可以理解為一個(gè)app,都是在一個(gè)win上面實(shí)現(xiàn)了,在點(diǎn)擊一個(gè)button的時(shí)候,會先關(guān)閉桌面,釋放桌面的資源,包括定時(shí)任務(wù),然后啟用一個(gè)新的win來繪制所有的app內(nèi)容。退出的時(shí)候,也是類似,釋放所有資源,然后再重新繪制桌面。
這樣才能在單片機(jī)這種資源比較少的設(shè)備上創(chuàng)建這種多個(gè)app的桌面。
資源緊張,就得省著用啊
WIFI聯(lián)網(wǎng)
這里才是移植到w801上的最重要的目的。首先繪制了一個(gè)頁面用來填寫ssid和密碼
這個(gè)空間在官方的例子中就能找到。
然后再點(diǎn)擊確認(rèn)的時(shí)候,調(diào)用官方wifidemo的接口就可以聯(lián)網(wǎng),并且稍微做個(gè)小彈窗,就知道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功能
前面的版本時(shí)間是手動設(shè)置,我們有了wifi,那自然是更希望聯(lián)網(wǎng)對時(shí)了。界面就很簡單,一個(gè)button就可以。
點(diǎn)擊的時(shí)候,參考demo中的ntp操作,并且設(shè)置到實(shí)時(shí)時(shí)鐘rtc中,就完成了
核心操作函數(shù)。
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); }天氣預(yù)報(bào)
這里就是簡單的自動調(diào)用web的客戶端程序,參考demo,訪問一個(gè)天氣預(yù)報(bào)的接口,需要是http的,然后解析一下返回的數(shù)據(jù)即可。
我這里返回的數(shù)據(jù)是json格式,只取了天氣那一項(xiàng),然后顯示到界面上就可以。
簡陋是簡陋了點(diǎn),不過道理就是這樣
注意事項(xiàng)
聯(lián)網(wǎng)與不聯(lián)網(wǎng),可以通過記錄在全局變量中,控制桌面不同的app出現(xiàn),當(dāng)wifi不連接的時(shí)候,我這里只顯示本地的日期和時(shí)間設(shè)置,不顯示NTP與天氣預(yù)報(bào)
當(dāng)網(wǎng)絡(luò)連接之后,才顯示聯(lián)網(wǎng)的設(shè)置,并且不再顯示本地設(shè)置時(shí)間和日期
并且在設(shè)置的操作之后,盡量要添加msg box來提示操作結(jié)果。
另外。這個(gè)w801的資源也比較緊張,之前還能放張老師的照片,現(xiàn)在只能黑屏當(dāng)背景了
介紹硬件
這個(gè)單片機(jī)的主機(jī),其實(shí)就是一塊HLK W801的主板,加了一個(gè)觸摸顯示屏做的,被我焊接了一下,因?yàn)槎虐罹€實(shí)在是太容易掉了,反正也沒別的屏幕了,然后加了一個(gè)DHT11模塊,就被我塞到一個(gè)牙線盒子里了,
感興趣的可以自己做一個(gè)。
代碼下載
雖然是提供《代碼下載地址》,
不過按照前面的步驟,還是自己一步一步搞一下更有成就感。因?yàn)殛P(guān)鍵的點(diǎn)基本都說清楚了。
最重要一點(diǎn),畢竟下載還要花錢。
結(jié)束語
今天還是分享一些暖心的事情,畢竟生活還是煩心的事多,需要些溫暖。
我跟我夫人說,我是一個(gè)沒有遠(yuǎn)慮的人,如果眼前沒有近憂,我就會覺得生活很快樂。小孩子也是這樣,如果不是正在挨批評,他也永遠(yuǎn)都是快樂的。
總結(jié)
以上是生活随笔為你收集整理的单片机---HLK-W801图形框架LVGL下开发(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 47. 模型加载
- 下一篇: 测试工程师六大能力模型