實驗介紹
本章主要介紹首頁信息屏的實現,作為第一頁,首頁信息實現了類手機的界面,其中包含了豐富的內容。 1)產品名稱 2) 版本信息 3) 系統狀態,系統時間,WIFI連接,藍牙連接。 4) IP地址
顯示效果
界面顯示效果如下:
本章包含的內容非常多,通過本章的學習,可以學到多個知識點,比如OLED的驅動顯示,ADC獲取電量信息,Wi-Fi連接狀態獲取等等。
涉及知識點
ADC的配置以及使用
OLED的使用
Wi-Fi配網
系統時鐘獲?。∟TP網絡對時)
開發環境準備
硬件
開發用電腦一臺
HAAS EDU K1 開發板一塊
USB2TypeC 數據線一根
軟件
開發環境的搭建請參考《AliOS Things集成開發環境使用說明之搭建開發環境》,其中詳細的介紹了AliOS Things 3.3的IDE集成開發環境的搭建流程。
本案例的代碼下載請參考《AliOS Things集成開發環境使用說明之創建工程》,
> 選擇解決方案:“HaaS EDU K1教育開發案例合集”
> 選擇開發板:haaseduk1 board configure
-- 編譯固件可參考《AliOS Things集成開發環境使用說明之編譯固件》。
-- 燒錄固件可參考《AliOS Things集成開發環境使用說明之燒錄固件》。
代碼編譯、燒錄
參考 @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;
}
顯示部分
代碼位于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)。 典型的模擬數字轉換器將模擬信號轉換為表示一定比例電壓值的數字信號。然而,有一些模擬數字轉換器并非純的電子設備,例如旋轉編碼器,也可以被視為模擬數字轉換器。
硬件設計
原理圖如下:
軟件設計
驅動初始化
在 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;
返回電量等級
實際電壓值為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都要被占用。
系統時鐘獲?。⊿NTP網絡對時)
在界面左上角顯示的就是當前的系統時間,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);