国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件試用連載】五、顯示板的使用

開發板試用精選 ? 來源:開發板試用 ? 作者:電子發燒友論壇 ? 2022-11-03 15:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文來源電子發燒友社區,作者:李元江, 帖子地址:https://bbs.elecfans.com/jishu_2021769_1_1.html

今天來寫一篇關于使用顯示板的帖子。主要完成溫濕度傳感器數據采集,把采集到的數據顯示到OELD顯示屏,顯示時鐘

一、硬件介紹
通過查看環境監測板的原理圖,發現該板子主要有兩個種資源:12864OLED顯示屏,兩個模擬按鍵。兩個模擬按鍵分別按下時,因為電阻分壓,在SWITCH端的電壓都一樣,根據測量這個SWITCH端電壓值,可以讀取到按鍵的狀態。
231013j4hs7zostiooj0dp.png
其中OLED兼容兩種通信接口SPI和I2C,這里我選擇使用I2C。
231012eezf84xijr846he6.png


它們使用主控的GPIO口分別為:AHT20溫濕度傳感器SDA --》 GPIO13 可復用為I2C0_SDASCL --》 GPIO14 可復用為I2C0_SCL模擬按鍵ADC --》 GPIO05 可復用為ADC2
二、軟件設計

1、新建文件
在wifi-iot/app目錄下,新建OLED文件夾,存放與顯示板和環境監測板相關的代碼。所含文件如下所示。
231013be3l9pi3o0m2ifil.png
其中aht20.c、aht20.h、envrionment_demo.c。是從上一篇帖子移植過來的,主要跟環境監測板有關。oled_demo.c 、oled_fonts.h 、 oled_ssd1306.h 、oled_ssd1306.c從許思維老師例程中移植過來。timeconv.c timeconv.h與時間轉換有關。
2、timeconv.c
該c文件主要跟時間戳轉換有關,在這個例程中,每一秒時間戳數值加1,然后再把時間戳轉換為北京時間即可到的時間戳對應的北京時間。
  1. #include "timeconv.h"
  2. #include
  3. #include
  4. ?
  5. static uint8_t month_day[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年
  6. static uint8_t Leap_month_day[12]={31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //閏年
  7. const uint16_t dayPerYear[4] = {365, 365, 365, 366};
  8. // 判斷是否是閏年
  9. // year: 需要判斷的年
  10. // return:1:閏年
  11. // 0: 平年
  12. uint8_t isLeapYear(uint16_t year)
  13. {
  14. uint8_t res=0;
  15. if(year%4 == 0) // 能夠被4整除
  16. {
  17. if((year%100 == 0) && (year%400 != 0)) //能夠被100整除,但是不能夠被400整除
  18. {
  19. res = 0;
  20. }
  21. else
  22. {
  23. res =1;
  24. }
  25. }
  26. return res;
  27. }
  28. // 將Unix時間戳轉換為北京時間
  29. // unixTime: 需要判斷的Unix時間戳
  30. // *tempBeijing:返回的北京時間
  31. // return:none
  32. // note:沒對輸入參數正確性做判斷
  33. void covUnixTimeStp2Beijing(uint32_t unixTime, rtc_time_t *tempBeijing)
  34. {
  35. uint32_t totleDaynum=0, totleSecNum=0;
  36. uint16_t remainDayofYear;
  37. uint8_t *pr, tempYear=0;
  38. totleDaynum = (uint32_t)unixTime/(((uint32_t)24*60*60)); //總天數(注意加括號)
  39. totleSecNum = (uint32_t)unixTime%((uint32_t)24*60*60); //當天剩余的秒速
  40. memset(tempBeijing, 0x00, sizeof(rtc_time_t));
  41. // 1.計算哪一年
  42. tempBeijing->ui8Year = 1970 + (totleDaynum/((uint32_t)FOURYEARDAY))*4;
  43. remainDayofYear = totleDaynum%((uint32_t)FOURYEARDAY)+1;
  44. //Delay_1ms(1000);
  45. while(remainDayofYear > dayPerYear[tempYear])
  46. {
  47. remainDayofYear -= dayPerYear[tempYear];
  48. tempBeijing->ui8Year++;
  49. tempYear++;
  50. }
  51. //2.計算哪一月的哪一天
  52. pr = isLeapYear(tempBeijing->ui8Year)?Leap_month_day:month_day;
  53. while(remainDayofYear > *(pr+tempBeijing->ui8Month))
  54. {
  55. remainDayofYear -= *(pr+tempBeijing->ui8Month);
  56. tempBeijing->ui8Month++;
  57. }
  58. tempBeijing->ui8Month++; //month
  59. tempBeijing->ui8DayOfMonth = remainDayofYear; //day
  60. //3.計算當天時間
  61. tempBeijing->ui8Hour = (totleSecNum)/3600;
  62. tempBeijing->ui8Minute = (totleSecNum%3600)/60; //error:變量搞錯
  63. tempBeijing->ui8Second = (totleSecNum%3600)%60;
  64. //4.時區調整
  65. tempBeijing->ui8Hour +=TIMEZONE;
  66. if(tempBeijing->ui8Hour>23){
  67. tempBeijing->ui8Hour -= 24;
  68. tempBeijing->ui8DayOfMonth++;
  69. }
  70. }
  71. // 將北京時間轉換為Unix時間戳
  72. // year: 需要判斷的年
  73. // return:Unix時間戳(從1970/1/1 00:00:00 到現在的秒數)
  74. // note:沒對輸入參數正確性做判斷
  75. uint32_t covBeijing2UnixTimeStp(rtc_time_t *beijingTime)
  76. {
  77. uint32_t daynum=0, SecNum=0; //保存北京時間到起始時間的天數
  78. uint16_t tempYear=1970, tempMonth=0;
  79. //1.年的天數
  80. while(tempYear < beijingTime->ui8Year)
  81. {
  82. if(isLeapYear(tempYear)){
  83. daynum += 366;
  84. }
  85. else{
  86. daynum += 365;
  87. }
  88. tempYear++;
  89. }
  90. //2.月的天數
  91. while(tempMonth < beijingTime->ui8Month-1)
  92. {
  93. if(isLeapYear(beijingTime->ui8Year)){ //閏年
  94. daynum += Leap_month_day[tempMonth];
  95. }
  96. else{
  97. daynum += month_day[tempMonth];
  98. }
  99. tempMonth++;
  100. }
  101. //3.天數
  102. daynum += (beijingTime->ui8DayOfMonth-1);
  103. //4.時分秒
  104. SecNum = daynum*24*60*60; //s
  105. SecNum += beijingTime->ui8Hour*60*60;
  106. SecNum += beijingTime->ui8Minute*60;
  107. SecNum += beijingTime->ui8Second;
  108. //5.時區調整
  109. SecNum -= TIMEZONE*60*60;
  110. return SecNum;
  111. }
復制代碼
3.timeconv.h
  1. #ifndef __TIMECONV_H
  2. #define __TIMECONV_H
  3. ?
  4. #include
  5. #include
  6. #include
  7. #include "ohos_init.h"
  8. #include "cmsis_os2.h"
  9. #define FOURYEARDAY (((uint32_t)365+365+365+366))//4年一個周期內的總天數(1970~2038不存在2100這類年份,故暫不優化)
  10. #define TIMEZONE (8) //北京時區調整
  11. ?
  12. typedef struct rtc_time_struct
  13. {
  14. uint16_t ui8Year; // 1970~2038
  15. uint8_t ui8Month; // 1~12
  16. uint8_t ui8DayOfMonth;// 1~31
  17. uint8_t ui8Week;
  18. uint8_t ui8Hour; // 0~23
  19. uint8_t ui8Minute; // 0~59
  20. uint8_t ui8Second; // 0~59
  21. }rtc_time_t;
  22. ?
  23. uint8_t isLeapYear(uint16_t year);
  24. void covUnixTimeStp2Beijing(uint32_t unixTime, rtc_time_t *tempBeijing);
  25. uint32_t covBeijing2UnixTimeStp(rtc_time_t *beijingTime);
  26. ?
  27. #endif /*__TIMECONV_H*/
  28. ?
復制代碼
4、oled_demo.c
該c文件主要是oled顯示屏顯示程序、包括時間轉換顯示、溫濕度顯示。
  1. extern float humidity;
  2. extern float temperature;
  3. static void OledTask(void *arg)
  4. {
  5. rtc_time_t mData;
  6. (void)arg;
  7. ?
  8. GpioInit();
  9. ?
  10. OledInit();
  11. OledFillScreen(0x00);
  12. while (1) {
  13. static char text[128] = {0};
  14. unsigned short data = 0;
  15. AdcRead(analog_KEY_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0);
  16. float voltage = ConvertToVoltage(data);
  17. snprintf(text, sizeof(text), "voltage: %.3f!", voltage);
  18. //OledShowString(0, 5, text, 1);
  19. ?
  20. OLED_ShowCHinese(0,3,0);//溫
  21. OLED_ShowCHinese(16,3,2);//度
  22. OledShowChar(32,3,':',2);
  23. sprintf((char *)TimeStr,"%02d",
  24. (uint32_t)temperature);
  25. OledShowString(40,3,(char *)TimeStr,2);
  26. OLED_ShowCHinese(64,3,1);//濕
  27. OLED_ShowCHinese(80,3,2);//度
  28. OledShowChar(96,3,':',2);
  29. sprintf((char *)TimeStr,"%02d",
  30. (uint32_t)humidity);
  31. OledShowString(104,3,(char *)TimeStr,2);
  32. timedata++;
  33. covUnixTimeStp2Beijing(timedata, &mData);
  34. sprintf((char *)TimeStr,"%04d-%02d-%02d",
  35. mData.ui8Year, mData.ui8Month, mData.ui8DayOfMonth);
  36. OledShowString(24,0,(char *)TimeStr,1);
  37. sprintf((char *)TimeStr,"%02d:%02d:%02d",
  38. mData.ui8Hour,mData.ui8Minute,mData.ui8Second);
  39. OledShowString(32,1,(char *)TimeStr,1);
  40. sleep(1);
  41. }
  42. }
復制代碼
5、oled_ssd1306.c
原來例程上是不能中文的,現在把顯示中文功能加上,但是需要提前使用取模軟件把字取模。
  1. //顯示漢字
  2. void OLED_ShowCHinese(uint8_tx,uint8_ty,uint8_tno)
  3. {
  4. uint8_tt,adder=0;
  5. OledSetPosition(x,y);
  6. for(t=0;t<16;t++)
  7. {
  8. WriteData(Hzk[2*no][t]);
  9. adder+=1;
  10. }
  11. OledSetPosition(x,y+1);
  12. for(t=0;t<16;t++)
  13. {
  14. WriteData(Hzk[2*no+1][t]);
  15. adder+=1;
  16. }
  17. }
復制代碼
字模數組
  1. static const unsigned charHzk[][16]={
  2. {0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},
  3. {0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00},/*"溫",0*/
  4. /* (16 X 16 , 宋體 )*/
  5. {0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00},
  6. {0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00},/*"濕",1*/
  7. /* (16 X 16 , 宋體 )*/
  8. {0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00},
  9. {0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00},/*"度",2*/
  10. };
復制代碼
6、BUILD.gn
BUILD.gn內容為
  1. # Copyright (c) 2020, HiHope Community.
  2. #
  3. # Redistribution and use in source and binary forms, with or without
  4. # modification, are permitted provided that the following conditions are met:
  5. #
  6. # 1. Redistributions of source code must retain the above copyright notice, this
  7. # list of conditions and the following disclaimer.
  8. #
  9. # 2. Redistributions in binary form must reproduce the above copyright notice,
  10. # this list of conditions and the following disclaimer in the documentation
  11. # and/or other materials provided with the distribution.
  12. #
  13. # 3. Neither the name of the copyright holder nor the names of its
  14. # contributors may be used to endorse or promote products derived from
  15. # this software without specific prior written permission.
  16. #
  17. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  18. # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  21. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  23. # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  24. # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  25. # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  26. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. ?
  28. static_library("oled_example") {
  29. sources = [
  30. "oled_demo.c",
  31. "oled_ssd1306.c",
  32. "timeconv.c",
  33. "envrionment_demo.c",
  34. "aht20.c"
  35. ]
  36. ?
  37. include_dirs = [
  38. "http://utils/native/lite/include",
  39. "http://kernel/liteos_m/components/cmsis/2.0",
  40. "http://base/iot_hardware/inteRFaces/kits/wifiiot_lite",
  41. ]
  42. }
復制代碼
這樣還不行,還要修改app文件夾下的BUILD.gn。在features下增加"OLED:oled_example",
  1. lite_component("app") {
  2. features = [
  3. "startup",
  4. "SSL:ssl_example",
  5. "EM:em_example",
  6. "OLED:oled_example"
  7. ]
  8. }
復制代碼
三、 編譯燒錄
演示結果
四、總結
顯示的時間是沒有進行對時的,下一篇講寫關于如何連接網絡,并且如何獲取網絡時間。然后把顯示屏上時間更新為網絡時間。
`231429t6yg66ogkvxkmbvo.png
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • wi-fi
    +關注

    關注

    15

    文章

    2424

    瀏覽量

    129564
  • HarmonyOS
    +關注

    關注

    80

    文章

    2153

    瀏覽量

    36054
  • HiSpark
    +關注

    關注

    1

    文章

    156

    瀏覽量

    7757
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    技術資訊 I Wi-Fi 模塊設計

    本文要點Wi-Fi模塊設計旨在打造一套緊湊且高效的硬件和軟件解決方案,使設備能夠通過Wi-Fi網絡實現通信。Wi-Fi模塊設計是一個復雜的過程,要求研發人員兼具硬件與軟件工程方面的專業知識
    的頭像 發表于 02-27 17:12 ?572次閱讀
    技術資訊 I <b class='flag-5'>Wi-Fi</b> 模塊設計

    Wi-Fi:無線連接的全球通用語

    一、什么是Wi-FiWi-FiWi-Fi聯盟制造商的商標認證,是基于IEEE 802.11標準的無線局域網技術。它允許電子設備在特定范圍內無線接入網絡,實現高速數據交換與互聯網訪問,已成為
    發表于 01-07 09:49

    Nordic發布nRF7002 EBII 開發, 支持Wi-Fi 6, 解鎖nRF54L新玩法

    Wi-Fi 6 功能,幫助開發人員創建高性能、高能效的Wi-Fi 6 物聯網解決方案。 基于 Nordic 的 nRF7002 Wi-Fi 協同 IC,nRF7002 EBII幫助 采用
    發表于 12-10 11:58

    Wi-Fi模塊選型指南 | 低功耗藍牙/Wi-Fi 6模塊推薦 | 物聯網設備集成攻略

    物聯網的快速發展,Wi-Fi技術的成熟的情況下,越來越多的場景需要用到Wi-Fi來無線傳輸數據,尤其是移動設備中,怎么再設備中選擇合適的Wi-Fi模塊呢?下面我們來介紹下Wi-Fi模塊
    的頭像 發表于 12-09 11:27 ?1070次閱讀
    <b class='flag-5'>Wi-Fi</b>模塊選型指南 | 低功耗藍牙/<b class='flag-5'>Wi-Fi</b> 6模塊推薦 | 物聯網設備集成攻略

    ?Microchip WILCS02 Wi-Fi?模塊開發技術解析與應用指南

    Microchip Technology WILCS02 Wi-Fi^?^ 鏈路控制器SD是一款安全數字 (SD) 卡接口,支持2.4GHz IEEE^?^ 802.11 b/g/n標準。該
    的頭像 發表于 10-06 15:54 ?1215次閱讀
    ?Microchip WILCS02 <b class='flag-5'>Wi-Fi</b>?模塊開發<b class='flag-5'>板</b>技術解析與應用指南

    淺談Wi-Fi 6E與Wi-Fi 7的關鍵器件——BAW濾波器新技術

    作者: Qorvo 亞太區無線連接事業部高級行銷經理林健富 ? 2020年1月,Wi-Fi聯盟正式宣布開放6GHz頻段(5925MHz-7125MHz),并將其命名為Wi-Fi 6E。2020年4月
    發表于 09-19 18:29 ?2132次閱讀
    淺談<b class='flag-5'>Wi-Fi</b> 6E與<b class='flag-5'>Wi-Fi</b> 7的關鍵器件——BAW濾波器新技術

    如何在 NuMaker-IoT-M467 上使用 Arduino IDE 控制 Wi-Fi 模塊?

    在NuMaker開發上,有一個ESP-12F Wi-Fi模塊;但是,Arduino IDE 中的 NuMaker UNO 包不提供該模塊的相關控制。如果您希望在 Arduino IDE 中控制此模塊,您應該如何進行?
    發表于 09-04 08:28

    如何更新 NuMaker IoT 上的 Wi-Fi 模塊固件?

    更新 NuMaker IoT 上的 Wi-Fi 模塊固件
    發表于 09-04 08:28

    LitePoint Wi-Fi測試軟件減輕客戶設計負擔

    Wi-Fi 7于一年多前獲得Wi-Fi聯盟認證以來,作為最新一代通信技術,Wi-Fi正逐步成為用戶實現無所不在無線連接的新選擇。隨著每一代Wi-Fi信號復雜性的提升,建議將硬件測試納
    的頭像 發表于 08-06 15:34 ?1197次閱讀
    LitePoint <b class='flag-5'>Wi-Fi</b>測試軟件減輕客戶設計負擔

    如何選擇合適的芯科科技Wi-Fi開發

    您正在尋找適用于超低功耗物聯網應用項目的Wi-Fi 開發嗎?本文將介紹Silicon Labs(芯科科技)推出的所有SiWx917 Wi-Fi 6和低功耗藍牙5.4解決方案的Wi-Fi
    的頭像 發表于 07-09 09:15 ?2689次閱讀

    Wi-Fi 8:開啟極高可靠性 (UHR) 連接的新紀元——1

    Wi-Fi Alliance 所發布的統計資料顯示(如圖1所示),截至2024年,Wi-Fi 所貢獻的: ? 經濟產值為 4.3萬億美元 ? 帶有Wi-Fi功能的設備年度出貨為41億臺
    發表于 06-13 11:09

    基于 Wi-Fi 的定位服務

    以下捕獲使用 location_wifi_get 函數請求 Wi-Fi 定位服務。該事件的總功耗為 125.85mC,日志顯示精確度為 30.0m。 Got location: method
    發表于 04-17 15:16

    nRF Cloud Wi-Fi 定位服務

    、Predictive-GPS、Single-Cell、Multi-Cell 和 Wi-Fi 定位。通過利用 nRF Cloud 的優化定位算法,基于 Nordic SoC 和 模組的產品可在定位用例
    發表于 04-17 15:07

    Wi-Fi 定位服務

    Wi-Fi 是一種著名的無線網絡技術,用于設備的局域網和互聯網接入。Wi-Fi 通過 Wi-Fi 網絡為家庭、辦公室和學校等環境提供便捷的無線互聯網接入服務。 Wi-Fi 定位是一種
    發表于 04-17 15:01

    如何為驅動添加Wi-Fi功能

    為驅動添加Wi-Fi功能,可以通過硬件和軟件兩種途徑實現。
    的頭像 發表于 04-16 14:22 ?928次閱讀