本文來源電子發(fā)燒友社區(qū),作者:李元江, 帖子地址:https://bbs.elecfans.com/jishu_2026438_1_1.html
上一次帖子,已經(jīng)通過網(wǎng)絡(luò)獲取天氣數(shù)據(jù),但是還沒顯示到顯示屏上。今天的帖子我寫的是關(guān)于如何取模天氣圖片,并顯示天氣圖標(biāo)和天氣數(shù)據(jù)。
一、ssd1306顯存填充
上一次帖子,已經(jīng)通過網(wǎng)絡(luò)獲取天氣數(shù)據(jù),但是還沒顯示到顯示屏上。今天的帖子我寫的是關(guān)于如何取模天氣圖片,并顯示天氣圖標(biāo)和天氣數(shù)據(jù)。
顯示板使用的OLED驅(qū)動芯片為SSD1306,我們來看看這款芯片的顯存和該顯存填充方式。下面是從SSD1303芯片手冊上的截圖,可以看得出它的顯存是大小為128*64bit的RAM,并且分成為8頁,PAGE0-PAGE7。顯示板像素點(diǎn)大小為128*64,所以一個像素點(diǎn)對應(yīng)RAM中的1bit。

往RAM的某一位寫入1或者0,該位對應(yīng)的像素點(diǎn)就顯示亮點(diǎn)或者不顯示。但是它是按照什么順序?qū)懭霐?shù)據(jù)的。下面也是從芯片手冊上的截圖。

可以看得出RAM填充順序了 ,寫入一個字節(jié)數(shù)據(jù)時,最低位數(shù)據(jù)寫入一頁中最上面那行,最高位寫入一頁中最下面那行。這樣,使用取模軟件取模圖片或者字符時,我們才能知道按照什么順序取模。之后再寫相應(yīng)代碼,按照順序把取模數(shù)據(jù)寫入RAM中。
二、天氣圖標(biāo)取模
首先當(dāng)然是先在網(wǎng)絡(luò)下載我們需要的天氣圖標(biāo),大小看你像顯示多大區(qū)域的圖標(biāo),我的是48*48大小圖標(biāo),在OLED上顯示大小也是48*48。

我使用的是下面這款取模軟件,我覺得圖標(biāo)取模不太好,不知道大家有沒有推薦的。需要根據(jù)SSD1306進(jìn)行取模軟件的設(shè)置。比較重要的是取模方式的選擇,這是跟SSD1306顯示填充順序?qū)?yīng)的,我們需要選擇列行式。其他數(shù)據(jù)點(diǎn)陣選擇48,自定義格式選擇C51。

選擇晴圖標(biāo),生成如下數(shù)組。

上面的小花就是太陽圖標(biāo),是有點(diǎn)丑,先湊合用吧。
二、軟件設(shè)計(jì)
1、顯示天氣圖標(biāo)
我們已經(jīng)按照SSD1306顯存填充順序,取模好圖片數(shù)據(jù),接下來按照順序把數(shù)據(jù)寫入RAM就行了,代碼如下。
- typedef enum
- {
- QINGLOGO =0,
- YINGLOGO,
- DUOYULOGO,
- YULOGO,
- LEIYULOGO,
- XUELOGO,
- }WEATHER_TYPE;
- void OLED_ShowWeather(uint8_t x,uint8_t y,WEATHER_TYPE type)
- {
- unsigned char (*temp)[48];
- //if(type ==qinglogo )
- //temp=Qing48;
- switch(type)
- {
- case QINGLOGO: temp=Qing48;break;
- case YINGLOGO: temp=Yin48;break;
- case YULOGO: temp=Yu48;break;
- case LEIYULOGO:temp=LeiYu48;break;
- case DUOYULOGO:temp=DuoYun48;break;
- case XUELOGO: temp=Xue48;break;
- default :
- temp=Qing48;
- break;
- }
- //OledSetPosition(x,y);
- for(uint8_t i=0;i<6;i++){
- OledSetPosition(x,y+i);
- for(uint8_t j = 0;j<48;j++){
- WriteData(temp[i][j]);
- }
- }
- }
OLED顯示板上的兩個按鍵,主要用于界面切換、獲取實(shí)時時間、天氣數(shù)據(jù)。增加了按鍵任務(wù),主要進(jìn)行這兩個按鍵的處理。右邊按鍵,按下后可以切換界面,現(xiàn)在設(shè)置有四個界面。在時間顯示界面按下左鍵,會獲取實(shí)時時間。在天氣顯示界面,按下左鍵會獲取實(shí)時天氣。
- #include
- #include
- #include
- #include "ohos_init.h"
- #include "cmsis_os2.h"
- #include "wifiiot_gpio.h"
- #include "wifiiot_gpio_ex.h"
- #include "wifiiot_pwm.h"
- #include "wifiiot_adc.h"
- ?
- #include "oled_ssd1306.h"
- ?
- #defineanalog_KEY_CHAN_NAME WIFI_IOT_ADC_CHANNEL_2
- ?
- typedef enum{
- TIMESCREEN=0,
- NOWSCREEN,
- TOSCREEN,
- ATOSCREEN,
- } SCREEN_STATUS;
- extern SCREEN_STATUS Now_Screen ;
- extern SCREEN_STATUS Last_Screen ;
- ?
- typedef enum{
- GET_NORMAL =0 ,
- GET_PROPRESS,
- GET_SUC,
- GET_FAIL,
- }GET_STATUS;
- ?
- GET_STATUS Get_Status = GET_NORMAL;
- GET_STATUS Last_Get_Status = GET_NORMAL;
- ?
- extern void getNtpTime(void);
- extern bool getWeather(void);
- ?
- static float ConvertToVoltage(unsigned short data)
- {
- return (float)data * 1.8 * 4 / 4096; /* adc code equals: voltage/4/1.8*4096*/
- }
- ?
- static void KeyTask(void *arg)
- {
- (void)arg;
- unsigned short data = 0;
- ?
- GpioInit();
- static bool keyflag = false;
- while(1)
- {
- AdcRead(ANALOG_KEY_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0);
- float voltage = ConvertToVoltage(data);
- ?
- if((voltage>0.45 && voltage<0.65)&&(!keyflag))
- {
- keyflag = true;
- //OledShowString(16,7,"Sync time...",1);
- //getNtpTime();
- //OledFillScreen(0);
- switch (Now_Screen){
- case TIMESCREEN:
- //OledShowString(16,7,"Sync time...",1);
- Get_Status = GET_PROPRESS;
- getNtpTime();
- //OledFillScreen(0);
- Get_Status = GET_SUC;
- break;
- case NOWSCREEN:
- //OledShowString(0,7,"Get Weather...",1);
- Get_Status = GET_PROPRESS;
- if(getWeather())
- //OledFillScreen(0);
- Get_Status = GET_SUC;
- else
- {
- //OledShowString(0,7,"Get fail...",1);
- Get_Status = GET_FAIL;
- }
- break;
- case TOSCREEN:
- Get_Status = GET_PROPRESS;
- if(getWeather())
- Get_Status = GET_SUC;
- else
- {
- Get_Status = GET_FAIL;
- }
- break;
- case ATOSCREEN:
- Get_Status = GET_PROPRESS;
- if(getWeather())
- Get_Status = GET_SUC;
- else
- {
- Get_Status = GET_FAIL;
- }
- break;
- ?
- default:
- break;
- }
- }
- else if((voltage>0.9 && voltage<1)&&(!keyflag))
- {
- keyflag = true;
- Now_Screen ++;
- if(Now_Screen > ATOSCREEN)
- {
- Now_Screen = TIMESCREEN;
- }
- }
- ?
- if((!(voltage>0.45 && voltage<0.65)) && (!(voltage>0.9 && voltage<1))) {
- keyflag = false;
- }
- ?
- usleep(300000);
- }
- }
- ?
- static void KeyTaskHandle(void)
- {
- osThreadAttr_t attr;
- attr.name = "KeyTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = 4096;
- attr.priority = osPriorityNormal+2;
- ?
- if (osThreadNew(KeyTask, NULL, &attr) == NULL) {
- printf("[KeyTaskHandle] Falied to create KeyTask!n");
- }
- }
- APP_FEATURE_INIT(KeyTaskHandle);
修改oled_demo.c內(nèi)容。增加頁面切換,獲取時間、天氣數(shù)據(jù)情況提示,顯示天氣數(shù)據(jù)和天氣圖標(biāo)。
- typedef enum{
- TIMESCREEN=0,
- NOWSCREEN,
- TOSCREEN,
- ATOSCREEN,
- } SCREEN_STATUS;
- SCREEN_STATUS Now_Screen = TIMESCREEN;
- SCREEN_STATUS Last_Screen = TIMESCREEN;
- ?
- typedef enum{
- GET_NORMAL =0 ,
- GET_PROPRESS,
- GET_SUC,
- GET_FAIL,
- }GET_STATUS;
- extern GET_STATUS Get_Status ;
- extern GET_STATUS Last_Get_Status ;
- ?
- static uint8_t i=0;
- ?
- static void TimeScreenDisp(void)
- {
- //OledShow
- rtc_time_t mData;
- OLED_ShowCHinese(0,3,0);//溫
- OLED_ShowCHinese(16,3,2);//度
- OledShowChar(32,3,':',2);
- sprintf((char *)TimeStr,"%02d",
- (uint32_t)temperature);
- OledShowString(40,3,(char *)TimeStr,2);
- OLED_ShowCHinese(64,3,1);//濕
- OLED_ShowCHinese(80,3,2);//度
- OledShowChar(96,3,':',2);
- sprintf((char *)TimeStr,"%02d",
- (uint32_t)humidity);
- OledShowString(104,3,(char *)TimeStr,2);
- covUnixTimeStp2Beijing(timedata, &mData);
- sprintf((char *)TimeStr,"%04d-%02d-%02d",
- mData.ui8Year, mData.ui8Month, mData.ui8DayOfMonth);
- OledShowString(24,0,(char *)TimeStr,1);
- sprintf((char *)TimeStr,"%02d:%02d:%02d",
- mData.ui8Hour,mData.ui8Minute,mData.ui8Second);
- OledShowString(32,1,(char *)TimeStr,1);
- ?
- if(Get_Status != Last_Get_Status)
- {
- Last_Get_Status = Get_Status;
- switch ( Get_Status)
- {
- case GET_NORMAL:
- break;
- case GET_PROPRESS:
- OledShowString(16,7,"Sync time...",1);
- break;
- case GET_SUC:
- OledClearString(16,7,"Sync time...",1);
- OledShowString(16,7,"Sync Suc...",1);
- break;
- case GET_FAIL:
- OledClearString(16,7,"Sync time...",1);
- OledShowString(16,7,"Sync fail...",1);
- break;
- default:
- break;
- }
- }
- }
- ?
- static void DispWeather(uint8_t x, uint8_t y ,uint8_t code){
- switch(code)
- {
- case 0:
- case 1:
- case 2:
- case 3:
- OLED_ShowWeather(x,y,QINGLOGO);
- break;
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- OLED_ShowWeather(x,y,DUOYULOGO);
- break;
- case 9:
- case 10:
- OLED_ShowWeather(x,y,YINGLOGO);
- break;
- case 11:
- case 12:
- ?
- OLED_ShowWeather(x,y,LEIYULOGO);
- break;
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- case 18:
- case 19:
- OLED_ShowWeather(x,y,YULOGO);
- break;
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- OLED_ShowWeather(x,y,XUELOGO);
- break;
- case 30:
- //OLED_ShowWeather(x,y,YULOGO);
- //break;
- default:
- OLED_ShowWeather(x,y,QINGLOGO);
- break;
- }
- ?
- }
- ?
- extern weather weatherValue;
- static voidWeatherDisp(SCREEN_STATUS Screen){
- switch (Screen)
- {
- case NOWSCREEN:
- DispWeather(5, 1 ,weatherValue.nowcode);
- OLED_ShowCHinese(56,0,9);//今
- OLED_ShowCHinese(72,0,12);//天
- sprintf((char *)DispStr,"%02d",
- (uint32_t)weatherValue.nowtemp);
- OledShowString(60,5,(char *)DispStr,2);
- OLED_ShowCHinese(76,5,13);//天
- sprintf((char *)DispStr,"%02d/%02d",
- (uint32_t)weatherValue.low[Screen-1],(uint32_t)weatherValue.high[Screen-1]);
- OledShowString(60,3,(char *)DispStr,2);
- sprintf((char *)DispStr,"%d%%",
- (uint32_t)weatherValue.humi[Screen-1]);
- OledShowString(100,5,(char *)DispStr,2);
- break;
- case TOSCREEN:
- DispWeather(5, 1 ,weatherValue.code[Screen-1]);
- OLED_ShowCHinese(56,0,10);//明
- OLED_ShowCHinese(72,0,12);//天
- sprintf((char *)DispStr,"%02d/%02d",
- (uint32_t)weatherValue.low[Screen-1],(uint32_t)weatherValue.high[Screen-1]);
- OledShowString(60,3,(char *)DispStr,2);
- sprintf((char *)DispStr,"%d%%",
- (uint32_t)weatherValue.humi[Screen-1]);
- OledShowString(70,5,(char *)DispStr,2);
- break;
- case ATOSCREEN:
- DispWeather(5, 1 ,weatherValue.code[Screen-1]);
- OLED_ShowCHinese(56,0,11);//后
- OLED_ShowCHinese(72,0,12);//天
- sprintf((char *)DispStr,"%02d/%02d",
- (uint32_t)weatherValue.low[Screen-1],(uint32_t)weatherValue.high[Screen-1]);
- OledShowString(60,3,(char *)DispStr,2);
- sprintf((char *)DispStr,"%d%%",
- (uint32_t)weatherValue.humi[Screen-1]);
- OledShowString(70,5,(char *)DispStr,2);
- break;
- default:
- break;
- }
- if(Get_Status != Last_Get_Status)
- {
- Last_Get_Status = Get_Status;
- switch ( Get_Status)
- {
- case GET_NORMAL:
- break;
- case GET_PROPRESS:
- OledShowString(0,7,"Get Weather...",1);
- break;
- case GET_SUC:
- OledClearString(0,7,"Get Weather...",1);
- OledShowString(0,7,"Get Suc...",1);
- i=0;
- break;
- case GET_FAIL:
- OledClearString(0,7,"Get Weather...",1);
- OledShowString(0,7,"Get fail...",1);
- i=0;
- break;
- default:
- break;
- }
- }
- }
- static void OledTask(void *arg)
- {
- (void)arg;
- GpioInit();
- OledInit();
- OledFillScreen(0x00);
- while (1) {
- if(Now_Screen != Last_Screen)
- {
- Last_Screen = Now_Screen;
- OledFillScreen(0);
- Get_Status = GET_NORMAL;
- Last_Get_Status = GET_NORMAL;
- i=0;
- }
- ?
- if((Get_Status == GET_FAIL) ||(Get_Status == GET_SUC))
- {
- i++;
- if(i > 20)
- {
- Get_Status = GET_NORMAL;
- i=0;
- ?
- switch(Now_Screen){
- case TIMESCREEN:
- OledClearString(16,7,"Sync time...",1);
- break;
- case NOWSCREEN:
- case TOSCREEN:
- ?
- case ATOSCREEN:
- printf("clear oled i = %dn",i);
- OledClearString(0,7,"Get Weather...",1);
- break;
- default :
- break;
- ?
- }
- }
- }
- ?
- switch (Now_Screen){
- ?
- case TIMESCREEN:
- TimeScreenDisp();
- break;
- ?
- case NOWSCREEN:
- WeatherDisp(NOWSCREEN);
- break;
- ?
- case TOSCREEN:
- WeatherDisp(TOSCREEN);
- break;
- ?
- case ATOSCREEN:
- WeatherDisp(ATOSCREEN);
- break;
- ?
- default:
- break;
- }
- usleep(100000);
- }
- }
現(xiàn)在時間調(diào)整是通過每一秒時間戳加1,再把時間戳轉(zhuǎn)化為北京時間,到達(dá)時間的更新。為了減少任務(wù)中因?yàn)槠渌瘮?shù)存在,增加時間誤差,所以單獨(dú)創(chuàng)建一個任務(wù)來進(jìn)行時間戳的調(diào)整。
- #include
- #include
- #include
- ?
- #include "ohos_init.h"
- #include "cmsis_os2.h"
- uint32_t timedata=1608362368;
- ?
- static void RtcTask(void *arg)
- {
- (void)arg;
- while(1)
- {
- timedata++;
- sleep(1);
- }
- }
- ?
- static void RtcTaskHandle(void)
- {
- osThreadAttr_t attr;
- attr.name = "RtcTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = 512;
- attr.priority = osPriorityNormal;
- ?
- if (osThreadNew(RtcTask, NULL, &attr) == NULL) {
- printf("[RtcTaskHandle] Falied to create KeyTask!n");
- }
- }
- APP_FEATURE_INIT(RtcTaskHandle);
5、修改BUILD.gn
修改OLED文件夾下的BUILD.gn文件,sources中加入keytask.c
按下右邊按鍵,可以切換界面,有四個界面,分別為時間顯示界面,今天、明天、后天天氣顯示界面。在時間顯示界面按下左鍵,會獲取實(shí)時時間,在天氣顯示界面,按下左鍵會獲取實(shí)時天氣,并且顯示天氣獲取情況提示。
?
?
?
?
四、總結(jié)
這一篇先寫到這里,下一篇是關(guān)于通過一個公網(wǎng)的中轉(zhuǎn)服務(wù)器,進(jìn)行wifiiot和手機(jī)之間的遠(yuǎn)程數(shù)據(jù)傳輸。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
wi-fi
+關(guān)注
關(guān)注
15文章
2424瀏覽量
129566 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2153瀏覽量
36055 -
HiSpark
+關(guān)注
關(guān)注
1文章
156瀏覽量
7757
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
技術(shù)資訊 I Wi-Fi 模塊設(shè)計(jì)
本文要點(diǎn)Wi-Fi模塊設(shè)計(jì)旨在打造一套緊湊且高效的硬件和軟件解決方案,使設(shè)備能夠通過Wi-Fi網(wǎng)絡(luò)實(shí)現(xiàn)通信。Wi-Fi模塊設(shè)計(jì)是一個復(fù)雜的過程,要求研發(fā)人員兼具硬件與軟件工程方面的專業(yè)知識
Wi-Fi:無線連接的全球通用語
一、什么是Wi-Fi?Wi-Fi是Wi-Fi聯(lián)盟制造商的商標(biāo)認(rèn)證,是基于IEEE 802.11標(biāo)準(zhǔn)的無線局域網(wǎng)技術(shù)。它允許電子設(shè)備在特定范圍內(nèi)無線接入網(wǎng)絡(luò),實(shí)現(xiàn)高速數(shù)據(jù)交換與互聯(lián)網(wǎng)訪問,已成為
發(fā)表于 01-07 09:49
Nordic發(fā)布nRF7002 EBII 開發(fā)板, 支持Wi-Fi 6, 解鎖nRF54L新玩法
了 Wi-Fi 6 功能,幫助開發(fā)人員創(chuàng)建高性能、高能效的Wi-Fi 6 物聯(lián)網(wǎng)解決方案。
基于 Nordic 的 nRF7002 Wi-Fi 協(xié)同 IC,nRF7002 EBII幫助 采用
發(fā)表于 12-10 11:58
Wi-Fi模塊選型指南 | 低功耗藍(lán)牙/Wi-Fi 6模塊推薦 | 物聯(lián)網(wǎng)設(shè)備集成攻略
物聯(lián)網(wǎng)的快速發(fā)展,Wi-Fi技術(shù)的成熟的情況下,越來越多的場景需要用到Wi-Fi來無線傳輸數(shù)據(jù),尤其是移動設(shè)備中,怎么再設(shè)備中選擇合適的Wi-Fi模塊呢?下面我們來介紹下Wi-Fi模塊
淺談Wi-Fi 6E與Wi-Fi 7的關(guān)鍵器件——BAW濾波器新技術(shù)
作者: Qorvo 亞太區(qū)無線連接事業(yè)部高級行銷經(jīng)理林健富 ? 2020年1月,Wi-Fi聯(lián)盟正式宣布開放6GHz頻段(5925MHz-7125MHz),并將其命名為Wi-Fi 6E。2020年4月
發(fā)表于 09-19 18:29
?2137次閱讀
基于 SSID 的 Wi-Fi 定位:與其他定位服務(wù)的性能比較
隨著 nRF7000 Wi-Fi 協(xié)同 IC 的推出,我們現(xiàn)在可以提供具有 Wi-Fi、蜂窩物聯(lián)網(wǎng)和 GNSS 功能的完整硅到云定位解決方案。nRF7000 針對 Wi-Fi 網(wǎng)絡(luò)掃描進(jìn)行了優(yōu)化
發(fā)表于 08-31 21:01
LitePoint Wi-Fi測試軟件減輕客戶設(shè)計(jì)負(fù)擔(dān)
自Wi-Fi 7于一年多前獲得Wi-Fi聯(lián)盟認(rèn)證以來,作為最新一代通信技術(shù),Wi-Fi正逐步成為用戶實(shí)現(xiàn)無所不在無線連接的新選擇。隨著每一代Wi-Fi信號復(fù)雜性的提升,建議將硬件測試納
有沒有什么修復(fù)方法可以確保 AP 模式下的 Wi-Fi 和 BLE 連接同時正常工作?
我正在使用 CYBSYSKIT DEV 01 套件。我嘗試在 AP 模式下打開 Wi-Fi 并宣傳 BLE。我可以宣傳 SoftAP 和 BLE。但是,我無法從中央設(shè)備連接到 BLE。它可以立即連接并斷開連接。有沒有什么修復(fù)方法可以確保 AP 模式下的
發(fā)表于 07-17 06:13
科普|公司的Wi-Fi,為什么這么慢?
大家在公司上班,經(jīng)常會使用到Wi-Fi。最近這幾年,隨著時代的發(fā)展,高清視頻會議等大帶寬網(wǎng)絡(luò)應(yīng)用越來越普遍。而公司的網(wǎng)絡(luò),卻非常不給力,頻繁卡頓,嚴(yán)重影響使用體驗(yàn)。哪怕IT的同事已經(jīng)把網(wǎng)絡(luò)優(yōu)化得很
Wi-Fi 8:開啟極高可靠性 (UHR) 連接的新紀(jì)元——1
Wi-Fi Alliance 所發(fā)布的統(tǒng)計(jì)資料顯示(如圖1所示),截至2024年,Wi-Fi 所貢獻(xiàn)的:
? 經(jīng)濟(jì)產(chǎn)值為 4.3萬億美元
? 帶有Wi-Fi功能的設(shè)備年度出貨為41億臺
發(fā)表于 06-13 11:09
Wi-Fi HaLow如何突破傳統(tǒng)Wi-Fi性能瓶頸?
視頻推薦在萬物互聯(lián)的時代,傳統(tǒng)Wi-Fi在覆蓋范圍、功耗、連接數(shù)上漸顯不足。而Wi-FiHaLow的誕生,正在用黑科技打破傳統(tǒng)Wi-Fi的性能瓶頸!今天,我們一起來探究Wi-FiHaL
基于 Wi-Fi 的定位服務(wù)
以下捕獲使用 location_wifi_get 函數(shù)請求 Wi-Fi 定位服務(wù)。該事件的總功耗為 125.85mC,日志顯示精確度為 30.0m。
Got location:
method
發(fā)表于 04-17 15:16
nRF Cloud Wi-Fi 定位服務(wù)
、Predictive-GPS、Single-Cell、Multi-Cell 和 Wi-Fi 定位。通過利用 nRF Cloud 的優(yōu)化定位算法,基于 Nordic SoC 和 模組的產(chǎn)品可在定位用例
發(fā)表于 04-17 15:07
Wi-Fi 定位服務(wù)
Wi-Fi 是一種著名的無線網(wǎng)絡(luò)技術(shù),用于設(shè)備的局域網(wǎng)和互聯(lián)網(wǎng)接入。Wi-Fi 通過 Wi-Fi 網(wǎng)絡(luò)為家庭、辦公室和學(xué)校等環(huán)境提供便捷的無線互聯(lián)網(wǎng)接入服務(wù)。
Wi-Fi 定位是一種
發(fā)表于 04-17 15:01
【HarmonyOS HiSpark Wi-Fi IoT 套件試用連載】八:天氣顯示
評論