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. static uint8_t month_day[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年
  5. static uint8_t Leap_month_day[12]={31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年
  6. const uint16_t dayPerYear[4] = {365, 365, 365, 366};
  7. // 判断是否是闰年
  8. // year: 需要判断的年
  9. // return:1:闰年
  10. // 0: 平年
  11. uint8_t isLeapYear(uint16_t year)
  12. {
  13. uint8_t res=0;
  14. if(year%4 == 0) // 能够被4整除
  15. {
  16. if((year%100 == 0) && (year%400 != 0)) //能够被100整除,但是不能够被400整除
  17. {
  18. res = 0;
  19. }
  20. else
  21. {
  22. res =1;
  23. }
  24. }
  25. return res;
  26. }
  27. // 将Unix时间戳转换为北京时间
  28. // unixTime: 需要判断的Unix时间戳
  29. // *tempBeijing:返回的北京时间
  30. // return:none
  31. // note:没对输入参数正确性做判断
  32. void covUnixTimeStp2Beijing(uint32_t unixTime, rtc_time_t *tempBeijing)
  33. {
  34. uint32_t totleDaynum=0, totleSecNum=0;
  35. uint16_t remainDayofYear;
  36. uint8_t *pr, tempYear=0;
  37. totleDaynum = (uint32_t)unixTime/(((uint32_t)24*60*60)); //总天数(注意加括号)
  38. totleSecNum = (uint32_t)unixTime%((uint32_t)24*60*60); //当天剩余的秒速
  39. memset(tempBeijing, 0x00, sizeof(rtc_time_t));
  40. // 1.计算哪一年
  41. tempBeijing->ui8Year = 1970 + (totleDaynum/((uint32_t)FOURYEARDAY))*4;
  42. remainDayofYear = totleDaynum%((uint32_t)FOURYEARDAY)+1;
  43. //Delay_1ms(1000);
  44. while(remainDayofYear > dayPerYear[tempYear])
  45. {
  46. remainDayofYear -= dayPerYear[tempYear];
  47. tempBeijing->ui8Year++;
  48. tempYear++;
  49. }
  50. //2.计算哪一月的哪一天
  51. pr = isLeapYear(tempBeijing->ui8Year)?Leap_month_day:month_day;
  52. while(remainDayofYear > *(pr+tempBeijing->ui8Month))
  53. {
  54. remainDayofYear -= *(pr+tempBeijing->ui8Month);
  55. tempBeijing->ui8Month++;
  56. }
  57. tempBeijing->ui8Month++; //month
  58. tempBeijing->ui8DayOfMonth = remainDayofYear; //day
  59. //3.计算当天时间
  60. tempBeijing->ui8Hour = (totleSecNum)/3600;
  61. tempBeijing->ui8Minute = (totleSecNum%3600)/60; //error:变量搞错
  62. tempBeijing->ui8Second = (totleSecNum%3600)%60;
  63. //4.时区调整
  64. tempBeijing->ui8Hour +=TIMEZONE;
  65. if(tempBeijing->ui8Hour>23){
  66. tempBeijing->ui8Hour -= 24;
  67. tempBeijing->ui8DayOfMonth++;
  68. }
  69. }
  70. // 将北京时间转换为Unix时间戳
  71. // year: 需要判断的年
  72. // return:Unix时间戳(从1970/1/1 00:00:00 到现在的秒数)
  73. // note:没对输入参数正确性做判断
  74. uint32_t covBeijing2UnixTimeStp(rtc_time_t *beijingTime)
  75. {
  76. uint32_t daynum=0, SecNum=0; //保存北京时间到起始时间的天数
  77. uint16_t tempYear=1970, tempMonth=0;
  78. //1.年的天数
  79. while(tempYear < beijingTime->ui8Year)
  80. {
  81. if(isLeapYear(tempYear)){
  82. daynum += 366;
  83. }
  84. else{
  85. daynum += 365;
  86. }
  87. tempYear++;
  88. }
  89. //2.月的天数
  90. while(tempMonth < beijingTime->ui8Month-1)
  91. {
  92. if(isLeapYear(beijingTime->ui8Year)){ //闰年
  93. daynum += Leap_month_day[tempMonth];
  94. }
  95. else{
  96. daynum += month_day[tempMonth];
  97. }
  98. tempMonth++;
  99. }
  100. //3.天数
  101. daynum += (beijingTime->ui8DayOfMonth-1);
  102. //4.时分秒
  103. SecNum = daynum*24*60*60; //s
  104. SecNum += beijingTime->ui8Hour*60*60;
  105. SecNum += beijingTime->ui8Minute*60;
  106. SecNum += beijingTime->ui8Second;
  107. //5.时区调整
  108. SecNum -= TIMEZONE*60*60;
  109. return SecNum;
  110. }
复制代码
3.timeconv.h
  1. #ifndef __TIMECONV_H
  2. #define __TIMECONV_H
  3. #include
  4. #include
  5. #include
  6. #include "ohos_init.h"
  7. #include "cmsis_os2.h"
  8. #define FOURYEARDAY (((uint32_t)365+365+365+366))//4年一个周期内的总天数(1970~2038不存在2100这类年份,故暂不优化)
  9. #define TIMEZONE (8) //北京时区调整
  10. typedef struct rtc_time_struct
  11. {
  12. uint16_t ui8Year; // 1970~2038
  13. uint8_t ui8Month; // 1~12
  14. uint8_t ui8DayOfMonth;// 1~31
  15. uint8_t ui8Week;
  16. uint8_t ui8Hour; // 0~23
  17. uint8_t ui8Minute; // 0~59
  18. uint8_t ui8Second; // 0~59
  19. }rtc_time_t;
  20. uint8_t isLeapYear(uint16_t year);
  21. void covUnixTimeStp2Beijing(uint32_t unixTime, rtc_time_t *tempBeijing);
  22. uint32_t covBeijing2UnixTimeStp(rtc_time_t *beijingTime);
  23. #endif /*__TIMECONV_H*/
复制代码
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. GpioInit();
  8. OledInit();
  9. OledFillScreen(0x00);
  10. while (1) {
  11. static char text[128] = {0};
  12. unsigned short data = 0;
  13. AdcRead(analog_KEY_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0);
  14. float voltage = ConvertToVoltage(data);
  15. snprintf(text, sizeof(text), "voltage: %.3f!", voltage);
  16. //OledShowString(0, 5, text, 1);
  17. OLED_ShowCHinese(0,3,0);//温
  18. OLED_ShowCHinese(16,3,2);//度
  19. OledShowChar(32,3,':',2);
  20. sprintf((char *)TimeStr,"%02d",
  21. (uint32_t)temperature);
  22. OledShowString(40,3,(char *)TimeStr,2);
  23. OLED_ShowCHinese(64,3,1);//湿
  24. OLED_ShowCHinese(80,3,2);//度
  25. OledShowChar(96,3,':',2);
  26. sprintf((char *)TimeStr,"%02d",
  27. (uint32_t)humidity);
  28. OledShowString(104,3,(char *)TimeStr,2);
  29. timedata++;
  30. covUnixTimeStp2Beijing(timedata, &mData);
  31. sprintf((char *)TimeStr,"%04d-%02d-%02d",
  32. mData.ui8Year, mData.ui8Month, mData.ui8DayOfMonth);
  33. OledShowString(24,0,(char *)TimeStr,1);
  34. sprintf((char *)TimeStr,"%02d:%02d:%02d",
  35. mData.ui8Hour,mData.ui8Minute,mData.ui8Second);
  36. OledShowString(32,1,(char *)TimeStr,1);
  37. sleep(1);
  38. }
  39. }
复制代码
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. static_library("oled_example") {
  28. sources = [
  29. "oled_demo.c",
  30. "oled_ssd1306.c",
  31. "timeconv.c",
  32. "envrionment_demo.c",
  33. "aht20.c"
  34. ]
  35. include_dirs = [
  36. "//utils/native/lite/include",
  37. "//kernel/liteos_m/components/cmsis/2.0",
  38. "//base/iot_hardware/inteRFaces/kits/wifiiot_lite",
  39. ]
  40. }
复制代码
这样还不行,还要修改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
    +关注

    关注

    14

    文章

    2113

    浏览量

    124331
  • HarmonyOS
    +关注

    关注

    79

    文章

    1967

    浏览量

    30027
  • HiSpark
    +关注

    关注

    1

    文章

    156

    浏览量

    6904
收藏 人收藏

    评论

    相关推荐

    Wi-Fi 8要来了!未来Wi-Fi技术演进方向揭秘

    产品销售中,虽然Wi-Fi 7产品的销量份额快速从年初的个位数百分比增长至14%,但Wi-Fi 6产品的销量份额依然稳定在60%左右。如果从存量设备来看,那么Wi-Fi 7路由器的占比将远远小于这个数。   智能手机等终端设备已
    的头像 发表于 11-24 03:14 807次阅读
    <b class='flag-5'>Wi-Fi</b> 8要来了!未来<b class='flag-5'>Wi-Fi</b>技术演进方向揭秘

    Wi-Fi 7与Wi-Fi 6E有什么区别

    也许很多人还在考虑是否要将使用的Wi-Fi设备升级到Wi-Fi 6或Wi-Fi 6E,而这些标准的继任者却已经开始“登堂入室”了。Wi-Fi 7是新一代
    的头像 发表于 11-07 11:38 512次阅读

    最典型的3家Wi-Fi Halow芯片企业

    Wi-Fi Halow是Wi-Fi联盟推出的专门面向物联网市场的标准。
    的头像 发表于 08-30 09:58 1242次阅读
    最典型的3家<b class='flag-5'>Wi-Fi</b> Halow芯片企业

    IR900 Wi-Fi联网的配置过程

    , 通过SSID扫描可以查看;输入密码,点击保存; 在SSID扫描页面中查看是否连接成功, 如果没有请检查认证方式、加密方式、密码是否输入正确; Wi-Fi扫描显示“已连接”,进入“快速向导-新建WAN
    发表于 07-25 06:09

    未来的Wi-Fi路由器

    转载自——钟林谈芯 没有创新就没有未来,Wi-Fi路由器也是如此。 进入2024年以后,Wi-Fi路由器市场变得更加艰难,利润大幅下滑,BOM成本价高于市场价,接不接订单,都陷入两难。 国内主芯片
    的头像 发表于 06-20 15:32 387次阅读

    DA16200 超低功耗 Wi-Fi 模块开发套件 Pro数据手册

    电子发烧友网站提供《DA16200 超低功耗 Wi-Fi 模块开发套件 Pro数据手册.rar》资料免费下载
    发表于 05-30 17:53 1次下载
    DA16200 超低功耗 <b class='flag-5'>Wi-Fi</b> 模块开发<b class='flag-5'>套件</b> Pro数据手册

    DA16200 超低功耗 Wi-Fi 模块开发套件数据手册

    电子发烧友网站提供《DA16200 超低功耗 Wi-Fi 模块开发套件数据手册.rar》资料免费下载
    发表于 05-30 17:13 0次下载
    DA16200 超低功耗 <b class='flag-5'>Wi-Fi</b> 模块开发<b class='flag-5'>套件</b>数据手册

    华为获得全球首个国际Wi-Fi联盟WFA企业级Wi-Fi 7认证!

    Wi-Fi联盟已发布Wi-Fi 7认证标准,华为是第一批送测厂商,获得业界首个企业级Wi-Fi 7 的Wi-Fi联盟官方认证。
    的头像 发表于 04-28 10:17 656次阅读
    华为获得全球首个国际<b class='flag-5'>Wi-Fi</b>联盟WFA企业级<b class='flag-5'>Wi-Fi</b> 7认证!

    验证物联网Wi-Fi HaLow用例的MM6108-EKH08开发套件来啦

    验证物联网Wi-Fi HaLow用例的MM6108-EKH08开发套件来啦 MM6108-EKH08开发套件专为验证物联网Wi-Fi HaLow用例而设计。该
    的头像 发表于 04-11 12:01 1664次阅读
    验证物联网<b class='flag-5'>Wi-Fi</b> HaLow用例的MM6108-EKH08开发<b class='flag-5'>套件</b>来啦

    Wi-Fi 7与Wi-Fi 6的相关知识科普

    科普:Wi-Fi 7 vs. Wi-Fi 6,青出于蓝
    的头像 发表于 03-12 10:59 695次阅读
    <b class='flag-5'>Wi-Fi</b> 7与<b class='flag-5'>Wi-Fi</b> 6的相关知识科普

    Wi-Fi的诞生与发展

    和5GHz两个频段,承载着不断增长的网络需求。ABIResearch显示,2022年Wi-Fi上传流量激增80%,Wi-Fi数据流量已超过蜂窝流量,且成为流量增量贡
    的头像 发表于 03-07 08:26 1137次阅读
    <b class='flag-5'>Wi-Fi</b>的诞生与发展

    Wi-Fi HaLow和传统Wi-Fi的区别

    Wi-Fi HaLow和传统Wi-Fi的区别  Wi-Fi是一种无线网络技术,可以连接到互联网或局域网,为用户提供无线上网的便利。随着科技的发展和互联网的普及,Wi-Fi也在不断演进和
    的头像 发表于 02-02 15:28 1121次阅读

    康普携手Wi-Fi联盟,RUCKUS Wi-Fi 7系列接入点成Wi-Fi

     康普高级副总裁兼网络、智能蜂窝和安全解决方案总裁Bart Giordano对此表示: “我们非常荣幸能与Wi-Fi Alliance形成长期合作伙伴关系,将我们的RUCKUS Wi-Fi 7 接入点平台作为Wi-Fi CERT
    的头像 发表于 01-23 14:10 707次阅读

    BT Wi-Fi模式是否可以通过ModustoolBox对套件进行编程来实现?

    想配置用于分析 CYW43439 的 CY8CPROTO-062S2-43439 原型开发套件。 浏览文档我无法弄清楚如何在不同的 Wi-Fi 和蓝牙模式(电源模式、连接模式等)下配置套件。 在
    发表于 01-22 06:19

    Wi-Fi 6和Wi-Fi 5之间有哪些区别呢?

    Wi-Fi 6和Wi-Fi 5之间有哪些区别呢? Wi-Fi 6和Wi-Fi 5是无线局域网标准的两个版本,它们之间存在很多区别。Wi-Fi
    的头像 发表于 12-09 16:09 2247次阅读