實驗介紹
本章主要介紹首頁資訊屏的實作,作為第一頁,首頁資訊實作了類手機的界面,其中包含了豐富的内容。
1)産品名稱
2) 版本資訊
3) 系統狀态,系統時間,WIFI連接配接,藍牙連接配接。
4) IP位址
顯示效果
界面顯示效果如下:

本章包含的内容非常多,通過本章的學習,可以學到多個知識點,比如OLED的驅動顯示,ADC擷取電量資訊,Wi-Fi連接配接狀态擷取等等。
涉及知識點
- ADC的配置以及使用
- OLED的使用
- Wi-Fi配網
- 系統時鐘擷取(NTP網絡對時)
開發環境準備
硬體
開發用電腦一台
HAAS EDU K1 開發闆一塊
USB2TypeC 資料線一根
- 1
- 2
- 3
軟體
AliOS Things開發環境搭建
開發環境的搭建請參考 @ref HaaS_EDU_K1_Quick_Start (搭建開發環境章節),其中詳細的介紹了AliOS Things 3.3的IDE內建開發環境的搭建流程。
HaaS EDU K1 DEMO 代碼下載下傳
HaaS EDU K1 DEMO 的代碼下載下傳請參考 @ref HaaS_EDU_K1_Quick_Start (建立工程章節),其中,
選擇解決方案: 基于教育開發闆的示例
選擇開發闆: haaseduk1 board configure
代碼編譯、燒錄
參考 @ref HaaS_EDU_K1_Quick_Start (3.1 編譯工程章節),點選 ✅ 即可完成編譯固件。
參考 @ref HaaS_EDU_K1_Quick_Start (3.2 燒錄鏡像章節),點選 "⚡️" 即可完成燒錄固件。
各實驗介紹
OLED開發與顯示
OLED背景介紹
OLED,即有機發光二極管(Organic Light-Emitting Diode),又稱為有機電雷射顯示(Organic Electroluminesence Display,OELD)。OLED由于同時具備自發光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面闆、使用溫度範圍廣、構造及制程較簡單等優異之特性,被認為是下一代的平面顯示器新興應用技術。
LCD都需要背光,而OLED不需要,因為它是自發光的。這樣同樣的顯示,OLED效果要來得好一些。以目前的技術,OLED的尺寸還難以大型化,但是分辨率确可以做到很高。
硬體設計
在本實驗中,OLED作為一個小闆固定在前面闆上,中間通過排線與主機闆相連。
本實驗采用的OLED屏有以下特點:
1)子產品為單色顯示、黑底白字
2)顯示尺寸為1.3寸
3)高分辨率,該子產品的分辨率為132*64
4)硬體接口采用SPI總線接口
闆載OLED原理圖:
軟體設計
關于OLED的詳細原理介紹以及使用,請參考第三章OLED部分。這裡主要介紹如何使用,從原理圖的得知,OLED連接配接的主機闆的SPI0,采用的是4線SPI模式。
初始化
首先初始化SPI0,這個可以在總入口函數中找到:
solutions/eduk1_demo/app_start.c
sh1106_init();
sh1106_init 初始化包含了SPI0的初始化以及GPIO初始化。
uint8_t sh1106_init(void)
{
uint8_t err_code;
err_code = hardware_init();
if (err_code != 0) {
return err_code;
}
command_list();
return err_code;
}
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
顯示部分
代碼位于solutions/eduk1_demo/k1_apps/homepage/homepage.c
以顯示版本資訊為例:
OLED_Clear(); // 清屏函數
OLED_Show_String(40, (12 + 4) * 1, "HaaS EDU", 12, 1); / 将字元串填入顯示緩存
snprintf(image_version, 21, "VER: %s", BUILD_VERSION); // 格式化字元串
OLED_Show_String(33, (12 + 4) * 2, image_version, 12, 1); // 将格式化後的字元串-
//版本資訊填入緩存
OLED_Refresh_GRAM(); // 重新整理顯存到螢幕上
ADC操作與電量擷取
背景介紹
ADC即模拟數字轉換器(英語:Analog-to-digital converter)是用于将模拟形式的連續信号轉換為數字形式的離散信号的一類裝置。與之相對的裝置成為數字模拟轉換器(DAC)。
典型的模拟數字轉換器将模拟信号轉換為表示一定比例電壓值的數字信号。然而,有一些模拟數字轉換器并非純的電子裝置,例如旋轉編碼器,也可以被視為模拟數字轉換器。
原理圖如下:
電壓檢測主要需要注意如下幾點:
1、電壓檢測使用的是MCU的GADC1通道。
2、帶USB供電時,檢測點電壓恒定為為4.85.2V之間,切換為電池供電時(斷掉USB供電),電壓浮動在3.65V4.2V之間,此時電量标志才會有變化。
3、因為GADC量程有限,電壓檢測采用分頻,如原理圖所示,ADC實測值約為VOLT的1/3,加上ADC内阻的損耗,實際比值為3.208。
驅動初始化
在 AliOS Things 3.3中,對ADC的操作才用了VFS的方式,開發者隻需要open相應的device裝置,通過提供的到的IOCTL接口,完成start、get,stop等一系列動作。
// open相應的adc裝置
snprintf(name, sizeof(name), "/dev/adc%d", index);
fd = open(name, 0);
// start adc 裝置
if (fd >= 0) {
ret = ioctl(fd, IOC_ADC_START, sampling_cycle);
usleep(1000);
adc_arg.value = 0;
adc_arg.timeout = 500000; // in unit of us
擷取電壓值
1、讀取十次,
2、去掉最大最小值,然後取平均。
for (int32_t i = 0; i < 10; i++) {
ret = ioctl(fd, IOC_ADC_GET_VALUE, (unsigned long)&adc_arg);
test_sum += adc_arg.value;
/* the min sampling voltage */
if (test_min >= adc_arg.value) {
test_min = adc_arg.value;
}
/* the max sampling voltage */
if (test_max <= adc_arg.value) {
test_max = adc_arg.value;
usleep(1000);
ret = ioctl(fd, IOC_ADC_STOP, 0);
close(fd);
test_avrg = (test_sum - test_min - test_max) >> 3;
LOGD(EDU_TAG, "the samping volage is:%dmv\n", test_avrg);
test_avrg *= 3.208;
*volage = test_avrg;
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
傳回電量等級
實際電壓值為ADC*3.208,然後根據這個值傳回不同的level,主要分為五檔,分别是0%,25%,50
%,75%,100%。
if (test_avrg > 4100)
{
*level = 4;
else if ((test_avrg > 3980) && (test_avrg < 4100))
*level = 3;
else if ((test_avrg > 3850) && (test_avrg < 3980))
*level = 2;
else if ((test_avrg > 3700) && (test_avrg < 3850))
*level = 1;
else if (test_avrg < 3700)
*level = 0;
看到代碼很多人可能會有疑問,為什麼4100毫伏到4200毫伏代表100%,4100毫伏到3980毫伏代表75%,并不是一個線性的值。其實原因很簡單,锂電池的電池放電曲線不是一個線性的。
顯示圖示
顯示不同單色電池圖示代碼如下:
if (0 == get_battery(&battery_level))
//printf("get_battery success %d\n", battery_level);
OLED_Icon_Draw(110, 0, &icon_battery_20_12[battery_level], 0);
系統Wi-Fi以及網絡對時
Wi-Fi
Wi-Fi這個名詞想必大家都不陌生,就是聯網的代名詞。簡單來說Wi-Fi(WirelessFidelity)是一種網絡傳輸标準,與藍牙技術一樣,它同屬于短距離無線技術。随着網絡的應用普及,它給人們帶來極大的友善,也是以得到了廣泛應用,Wi-Fi讓我們随時随地、的上網成為可能。
經常在路由器的包裝中看到802.11b/g/n 2.4Ghz這類字樣,那麼這個是什麼來的?這個是無線網絡通信的标準,IEEE 802.11是現今無線區域網路通用的标準,它是由電氣和電子工程師協會(IEEE)所定義的。後面的這些字尾是協定疊代的版本号。
2.4GHz頻段
- 802.11b/g/n中桂東 Wi-Fi無線電可以在2.4 GHz頻帶中傳輸,共有14個可用信道,工作頻率範圍是2.402GHz - 2.483Ghz。中國可用13個信道(1-13)。每相鄰的2個信道之間的頻寬就是5Mhz。如果使用信道1,頻寬為20Mhz,則信道2,3,4,5都被占用。
- 每個信道的帶寬為22MHz,不過有效帶寬隻有20MHz,為了減少相鄰信道的幹擾,兩側預留1MHz的帶寬邊界。
- 隻有三個頻道(1、6和11)不共享頻率空間。
5GHz頻段
- 802.11a/n/ac中規定Wi-Fi無線電可以在5GHz頻帶中傳輸,共有25個可用信道。中心頻率範圍5.150GHz-5.850GMz,中國可以使用的信道有低信道36,40, 44, 48, 52, 56, 60, 64, 高信道149,153,157, 161, 165。信道之間沒有重疊。
- 每個頻寬為20MHz,如果使用信道149,當要用80Mhz時,則153,157,161都要被占用。
系統時鐘擷取(SNTP網絡對時)
在界面左上角顯示的就是目前的系統時間,HaaS EDU K1本身沒有帶RTC晶片,是以不能自動儲存時間。
那麼如何擷取準确的時間呢?這裡就需要用到SNTP協定,SNTP是基于NTP協定的。
SNTP協定
簡單網絡時間協定(Simple Network Time Protocol),由NTP改編而來,主要用來同步網際網路中的計算機時鐘。在 RFC2030 中定義。
SNTP協定采用用戶端/伺服器的工作方式,可以采用單點傳播(點對點)或者廣播(一點對多點)模式操作。SNTP伺服器通過接收GPS信号或自帶的原子鐘作為系統的時間基準。單點傳播模式下,SNTP用戶端能夠通過定期通路SNTP伺服器獲得準确的時間資訊,用于調整用戶端自身所在系統的時間,達到同步時間的目的。廣播模式下,SNTP伺服器周期性地發送消息給指定的IP單點傳播位址或者IP多點傳播位址。SNTP用戶端通過監聽這些位址來獲得時間資訊。
本實驗所用到的Wi-Fiy硬體子產品已經包含在MCU之中,不需要額外提供。
Wi-Fi子產品
AliOS Things中關于Wi-Fi部分也已經封裝成了netmgr元件,eduk1_demo的package.yaml已經預設包含。
depends:
- netmgr: dev_aos
代碼位于solutions/eduk1_demo/app_start.c
event_service_init(NULL);
netmgr_service_init(NULL);
event_subscribe(EVENT_NETMGR_DHCP_SUCCESS, wifi_event_cb, NULL);
event_service_init(NULL), event_service 初始化。
netmgr_service_init netmgr服務初始化,主要包含CLI的注冊,WIFi裝置建立,相關信号量以及task的初始化,Wi-Fi硬體初始化等。
event_subscribe(EVENT_NETMGR_DHCP_SUCCESS, wifi_event_cb, NULL);這裡則是注冊了wifi_event的回調函數。
使用Wi-Fi
目前可以通過代碼配置或者指令行的形式配置将WI-FI名稱(SSID)以及密碼配置到EDU中。
填入SSID以及密碼
netmgr -t wifi -c haas-open 12345678
手動儲存ssid和password到檔案系統中。
netmgr -t wifi -b 1
重新開機之後,手動重新連接配接。
netmgr -t wifi -a 1
網絡對時(SNTP)
edu在連接配接網絡之後,就會自動擷取網絡對時。并更新到本地時鐘。
此時如果需要擷取系統時間,直接調用系統函數clock_gettime即可。
struct tm *info;
struct timespec tv;
/* 擷取 GMT 時間 */
clock_gettime(CLOCK_REALTIME, &tv);
info = gmtime(&tv);
snprintf(tmp, 21, "%2d:%02d", (info->tm_hour + 8) % 24, info->tm_min);
OLED_Show_String(0, 12 * 0, tmp, 12, 1);
開發者支援
HaaS官方:
https://haas.iot.aliyun.com/HaaS技術社群:
https://blog.csdn.net/HaaSTech開發者釘釘群和公衆号見下圖,開發者釘釘群每天都有技術支援同學值班。
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-d7a94ec6ab.css" rel="stylesheet">
<link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-49037e4d27.css" rel="stylesheet">
</div>