首先跟同样新入手单片机开发的小伙伴分享一点I2C通信的知识。我估计大部分入手开发板的小伙伴都有一定程序开发的能力,但是底层开发可能是新接触,我看有的小伙伴配置开发环境都有障碍,其实并不是多复杂,只是首次接触很陌生罢了,大胆试,多搞几回就轻松应对了。

通信开发是单片机主要开发内容,通信方式和协议有很多种,针对应用场景和模块的情况选用合适的协议。各种协议大同小异,开始了解通透一种,理解其思想,其他协议也就很容易理解了。

如果是第一次看到这种图是不是有点懵。

大概过程就是:

1. 发送一段模块地址信息 + 读/写。

等待…

模块如果收到,会给你个回复 ACK

2. 你看到ACK响应,进行下一步

再发送一段,读/写寄存器地址信息。

模块收到,再给你回复ACK

3. 如果是写,就再发送写的内容信息。

如果是读,就接收模块发送来的返回信息。

换个现实场景理解一下,假设你喊你室友帮你取快递:

你:三胖子!(发送模块地址)

三胖子:干啥。(接听ACK)

你:给我取份快递。(发送寄存器地址)

三胖子:好的。(接听ACK)

你:接收室友给你送来的快递。(接收信息)

整个通信过程就是一问一答,双方不能同时问答,一方说话一方只能接听。当然具体过程还要复杂一些,比如接收信息也要给模块回复应答,但是主体过程就是这样的。这个过程大概了解一下就行,所有通信的细节部分都已经被鸿蒙下的函数封装好了,具体过程交由鸿蒙做就好,你只需要考虑要说什么做什么就行了。这个过程真的好简单。

看一下鸿蒙真对WifiIoT智能设备提供的I2C相关函数:

将数据写入I2C设备。

unsigned int I2cWrite(WifiIotI2cIdx id, unsigned short deviceAddr, const WifiIotI2cData *i2cData);

在i2c.h文件里有详细的说明,这里复制过来一一对照看一下每个参数的意义。

将数据写入I2C设备。

id表示I2C设备id。

deviceAddr表示I2C设备地址。

i2cData表示指向要写入的数据描述符的指针。

如果操作成功,返回WIFI_IOT_ SUCCESS;

否则返回在wifiiot_errno.h中定义的错误代码。

(百度翻译还是很准确的哦!哈)

从I2C设备读取数据。

unsigned int I2cRead(WifiIotI2cIdx id, unsigned short deviceAddr, const WifiIotI2cData *i2cData);

读取的数据将保存到i2cData指定的地址。

id表示I2C设备id。

deviceAddr表示I2C设备地址。

i2cData表示指向要读取的数据描述符的指针。

如果操作成功,返回WIFI_IOT_ SUCCESS;

否则返回在wifiiot_errno.h中定义的错误代码。

鸿蒙把I2C所使用的数据封装在一个结构体中。我们只需要把数据写入到这个结构体中,然后让函数自己处理就可以了。

typedef struct {
/** Pointer to the buffer storing data to send */
unsigned char *sendBuf;
/** Length of data to send */
unsigned int sendLen;
/** Pointer to the buffer for storing data to receive */
unsigned char *receiveBuf;
/** Length of data received */
unsigned int receiveLen;
} WifiIotI2cData;

定义I2C数据传输属性。

指向存储要发送的数据的缓冲区的指针

unsigned char *sendBuf;

要发送的数据长度

unsigned int  sendLen;

指向用于存储要接收的数据的缓冲区的指针

unsigned char *receiveBuf;

接收数据的长度

unsigned int  receiveLen;

具体用的时候,我们可以根据实际情况再封装一下。这是主要根据使用场景和模块所提供的功能。我针对我要使用PCF8563模块把I2C过程做了一点包装。可以看看我写的代码,也许能给你一点启发。参看我的代码。

在这次开发过程中还用到了GPIO管脚中断

很多老师都专门写了按键的中断触发,我也是仔细研读然后做了我这个程序的触发控制,老师的文章写的太详细了,实在没什么好再说明的,我在使用中也没有遇到什么问题,最多就是,要关闭看门狗功能,否者会重启,再就是当暂中断发的时候用到这个方法。

GpioSetIsrMask(WIFI_IOT_IO_NAME_GPIO_8, 0); 正常

GpioSetIsrMask(WIFI_IOT_IO_NAME_GPIO_8, 1); 暂停

ADC模数转换

用到OLED模块上的按键的时候碰到了ADC功能,这里先做个伏笔,主要是还没把鸿蒙下的ADC方法研究明白,而且数模转换应用场景非常多,以后用到专门的模块再仔细写写心得吧。暂时看老师们的代码照猫画虎也能运行,有时候会不稳定。

PCF8563是个比价常用的模块。

PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片。PCF8563 的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

PCF8563并不是我们套件里所带的模块,只是赶巧我手上刚好有这么个模块。官方套件提供的模块有限,但是涵盖了单片开发的所有应用场景,如果每个模块都认真走一遍,那么基本解锁了鸿蒙单片机开发的所有知识了。在实际应用中,我们还是要使用各种功能的电子模块来实现更有趣的功能的。所以以后还是要更多尝试新模块的使用,也能提高鸿蒙系统的应用范围。

前面已经开发过AHT20温湿度模块,SSD1306模块,所以再开发PCF8563的过程就变的很简单。有很多内容都是重叠的,整体思路也是相通的,所以过程变得非常轻松。

任何一个模块上手第一步都是读它的技术手册,了解功能寄存器的配置。读手册的过程是枯燥的,只有坚持把手册读透,那么这个模块才算真正属于你。

我想要实现的功能是一个时钟功能,然后按需求和过程写一大坨流水账代码,测试走通,再把代码整理一下,最后归结为2部分,一部分设置时间,一部分读取时间。完了!

当你拥有了一个写时钟的能力,你就拥有了各种计时的能力,比如写个万年历,做个股票投资报时,等等。我通过一部电影获得灵感,做了一个到计数时钟,看时间飞快的流逝,会不会让看钟的人有压力感,治治拖延症呢。但结果除了无聊一点用没有。

PCF8563模块可以输出时钟信号,我开始设想通过Hi3861的1个端口接收时钟信模块发出的周期性低电平,把间隔设定为1秒,触发中断,然后读取模块的时间信息,发送到OLED上显示出来。这样就能每隔1秒显示一次。

OLED模块上有2个按键,想通过它们实现时间设置功能。这个两个按键很有趣,通过1个端口接收信号,通过测试信号的电压强度来区分是那个按键再工作。这时候需要通过ADC能来实现,(坑王艾希已经上线,哈开玩笑。)数模转换功能,难道不能通过2个端口来实现吗?当然不是,这可能是这套开发板设计的初衷,就是让你充分学习未来可能遇到的所有知识。闲话少叙,又解锁新姿势了。

通过2个按键实现功能控制:早期机械计算机用齿轮实现功能的切换,比如可编曲发音盒,有一种可编曲的,中间转子每个音节都可调,实现编曲功能,那种太高级了,没找到图片。我借鉴这种工作原理,来实现2个按键的复杂控制。

按键功能实现的原理就跟那个齿轮是一样的,S1驱动gear这个大齿轮,他有9齿,按一下,转1齿,循环往复,每一齿联动1个功能。S2驱动gears组的7个小齿轮,每个小齿轮针对1个时间的值。当然这不是唯一的控制方法,也可以做个大数组什么的,只是一种方法而已。

gear = 9 正常时间显示

gear = 0 进入设置状态

gear = 1 秒设置 gears[0]可以驱动

gear = 2 分设置 gears[1]可以驱动

gear = 3 时设置 gears[2]可以驱动

gear = 4 日设置 gears[3]可以驱动

gear = 5 周设置 gears[4]可以驱动

gear = 6 月设置 gears[5]可以驱动

gear = 7 年设置 gears[6]可以驱动

gear = 8 将设置好的值输入到时间模块

gear = 9 正常时间显示

因为不是套件中的模块,我只简单说一下主体程序工作结构。

1. 所有功能先初始化,准备好。

2. 做中断触发,每按1次驱动gear加1循环往复。

3. 建1个主循环,所有的工作就这个循环里了。

4. 针对gear的值,调用执行不同的功能。

完了! 谢谢。~哈

看代码吧,代码写的像流水账,我也懒了改了,欢迎纠错,有问题欢迎问。

随着代码越写越多,也深感C语言知识太少。我会再好好看看C教程,希望以后写的代码,能更好些。

【下载源代码】

作者:细嗅蔷薇05

想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

Wi-Fi IoT套件连PCF8563实现电子钟功能的更多相关文章

  1. Azure IoT带来更高效的新能源生产和会看人脸色的无人超市

    全球分析机构都认为物联网将在未来几年呈现爆发式增长,到2020年,各种传感器.新型物联网设备,再加上传统PC.智能手机.平板电脑.网络电视,以及各类可穿戴智能设备,将交织成一个由300亿到500亿台设 ...

  2. 【Azure IoT DevKit】实验终于做完了

    大家好,我是MSP李桑榆 今天终于把几个Azure IoT DevKit的小实验的视频给做完了. 不敢说什么指导,只是给大家一个参考.因为Devkit不需要你写一行代码,只需要你按着步骤来,并没有什么 ...

  3. 这里聊聊扫地机的 IOT 开发

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16663833.html 消费者使用扫地机通常的方式是通过 ...

  4. 如何在Raspberry Pi 3B中安装Windows 10 IoT Core

    Windows 10 IoT Core简介 Windows 10 IoT是微软专门为物联网生态打造的操作系统,Windows 10 IoT Core则是Windows 10 IoT 操作系统的核心版本 ...

  5. Edge-assisted Traffic Engineering and applications in the IoT

    物联网中边缘辅助的流量工程和应用 本文为SIGCOMM 2018 Workshop (Mobile Edge Communications, MECOMM)论文. 笔者翻译了该论文.由于时间仓促,且笔 ...

  6. 在Oracle电子商务套件版本12.2中创建自定义应用程序(文档ID 1577707.1)

    在本文档中 本笔记介绍了在Oracle电子商务套件版本12.2中创建自定义应用程序所需的基本步骤.如果您要创建新表单,报告等,则需要自定义应用程序.它们允许您将自定义编写的文件与Oracle电子商务套 ...

  7. IOTutility 一个轻量级的 IOT 基础操作库

    IOTutility 一个轻量级的 IOT 基础操作库 Base utility for IOT devices, networking, controls etc... IOTutility 的目的 ...

  8. 专家来“搞”| IoT DevKit,物联网界新手大礼包等你来拿

    专家来“搞” 这是一档基于近期热门云技术,邀请 IT 和开发领域的资深专家,来给大家分享不同领域的云技术操作环境及开发过程中经常遇到的痛点和解决方案,与实战紧密相连,帮助大家学习知识点,顺利解决工作中 ...

  9. AWS的边缘计算平台GreenGrass和IoT

    AWS的边缘计算平台GreenGrass和IoT 为什么需要有边缘计算? 如今公有云和私有云平台提供的服务已经连接上了绝大多数的桌面设备和移动设备.但是更多的设备比如,车辆,工程机械,医疗设备,无人机 ...

随机推荐

  1. Spring Cloud 入门教程(二): 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  2. 【Java】Java Win10环境搭建--JDK、Eclipse

    win10安装Java JDK环境及Eclipse安装使用(Hello world) win10环境下安装Java环境,对于小白来说简直是头疼,因为Java内部环境有着JDK和JRE两块,互相牵扯着很 ...

  3. rocketMq broker.conf全部参数解释

    #4.7.1版本 #所属集群名字brokerClusterName=rocketmq-cluster#broker名字,名字可重复,为了管理,每个master起一个名字,他的slave同他,eg:Am ...

  4. Python文件部分(不包括数据)

    一,基本操作过程:1.a = open(文件名 ,打开方式) 2.a.read(size) | a.readline(size) | a.readlines(hint) 或 a.write(s) | ...

  5. 任意文件上传——tcp

    package chaoba; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...

  6. 有关CSS 定位中的盒装模型、position、z-index的学习心得

    开始整体之前我需要说明两个概念: 第一个就是   一切皆为框  也就是说在HTML中的不管是是块级的还是内联的,都可以认为成块的,唯一的区别就是块的会独自占据一行 第二个文档流:  一个网页可以看作是 ...

  7. 分享知乎关于pull request的分享

    作者:知乎用户链接:https://www.zhihu.com/question/21682976/answer/79489643来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  8. 线程上下文类加载器(Context ClassLoader)

    1.线程上下文类加载器是从jdk1.2开始引入的,类Thread中的getContextClassLoader()与setContextClassLoader(ClassLoader c1),分别用来 ...

  9. AOP的姿势之 简化混用 MemoryCache 和 DistributedCache 的方式

    0. 前言 之前写了几篇文章介绍了一些AOP的知识, 但是还没有亮出来AOP的姿势, 也许姿势漂亮一点, 大家会对AOP有点兴趣 内容大致会分为如下几篇:(毕竟人懒,一下子写完太累了,没有动力) AO ...

  10. hive2

    4.hive优化 1)跑sql的时候会出现的参数: In order to change the average load for a reducer (in bytes): set hive.exe ...