0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Arduino函数简化代码

星星科技指导员 来源:嵌入式计算设计 作者:Jeremy S. Cook 2022-08-16 09:23 次阅读

Arduino 板和 Arduino IDE 非常适合创建可以激活 LED、读取传感器、激活伺服或任何数量的独特物理计算应用程序的小代码片段。此类操作通常开始时很简单——例如,让计时器上的 LED 闪烁——但随着程序的扩展和程序员技能的提高,最终会变得相当复杂。

组织扩展代码的一种出色技术是使用函数,即可以根据需要从程序的其他部分(例如通过主循环)调用的代码片段。对于有经验的程序员来说,这种技术可能已经过时了,但对于那些从其他学科进入 Arduino 的人来说,尽早接受函数范式通常会对你有好处。

声明一个函数

在最基本的形式中,额外函数看起来几乎与您在开始新草图时在第 1 行和第 6 行看到的设置和循环函数一样(图 1)。这些函数需要在另一个函数之外声明,并且具有唯一的名称。事实上,主循环函数的简单复制/过去/修改可用于在您的代码中创建一个新函数。

poYBAGL68dOAaEKlAACCXUp6_JI398.png

图 1. 新功能 copypasta。

调用函数,继续

当然,声明一个从不被调用且不做任何事情的函数纯粹是浪费空间,所以让我们让它做一些有趣的事情(图 2)。下面的示例基本上重新格式化了 Arduino Blink 草图以将闪烁放入一个函数中,并添加一个串行输出以让您知道它“延迟闪烁打开和关闭”。

pYYBAGL68dmAd3UJAACoptgTOVQ871.png

虽然这对简化代码没有任何作用,但如果您想在主循环中的多个点执行相同类型的闪烁/响应操作,请考虑如何简化事情。无需编写 5 行代码,您只需使用 blinkAndTalk(); 调用新函数。

不需要太多用处就能看出这种简化是如何叠加起来的,尤其是在函数更复杂的情况下。这种代码分段还有助于在其他程序中重用代码,因为您可以根据需要在那里复制/粘贴。在 Arduino IDE 中,将函数放在最后很好,但如果您使用不同的环境(例如 PlatformIO),顺序可能很重要。

函数返回值

除了将代码简化为易于重用的块外,函数还可以返回一个值。Arduino.cc 提供了如何执行此操作的示例,将 myMultiplyFunction 称为 k = myMultiplyFunction(i, j);。这里的括号不是空的,而是将变量传递给函数本身,并且 k 由返回结果设置;函数中的行(图 3)。

pYYBAGL68d-AIcEnAACX8x_iNLg323.png

图 3.来自 Arduino 示例的代码。

另一种传递值的方法是在函数中设置一个全局变量,它可以在主循环或任何你需要结果的地方使用。出于多种原因,包括生成更复杂的代码以及使这些函数更难重用,使用 return 是这里更好的选择。如果您很好奇,下面显示了如何做到这一点的示例:

pYYBAGL68eaAUfmLAACfahn3UiY284.png

图 4. 可能,但通常不推荐

一旦您准备好将几行代码转移到编程上更有趣的应用程序中,请记住函数是您的朋友。他们在最初设置时会花一些心思,但随着事情变得更加复杂,他们可以支付巨额红利。

我最近写了一段代码,其中一小部分如下所示,接近 300 行。然而,主循环在括号内只有 4 行,主要是为了调用一些单独的函数。老实说,我应该将其进一步分解为功能块,从而可能会减小程序的大小并为自己省去一些麻烦。规划在这里有很长的路要走。

pYYBAGL68eyAPaIrAABcsioxRVM434.png

图 5. 对于主循环中的代码行(注释省略)

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2522

    文章

    47984

    浏览量

    739675
  • led
    led
    +关注

    关注

    237

    文章

    22420

    浏览量

    645781
  • Arduino
    +关注

    关注

    184

    文章

    6425

    浏览量

    184768
收藏 人收藏

    评论

    相关推荐

    如何用Rust过程宏魔法简化SQL函数呢?

    这是 RisingWave 中一个 SQL 函数的实现。只需短短几行代码,通过在 Rust 函数上加一行过程宏,我们就把它包装成了一个 SQL 函数
    的头像 发表于 01-23 09:43 288次阅读
    如何用Rust过程宏魔法<b class='flag-5'>简化</b>SQL<b class='flag-5'>函数</b>呢?

    自己编写函数示例代码很难吗?分享几个示例!

    Q A 问: Arduino Uno的函数示例 我决定自己编写函数示例代码,因为这应该是Arduino中的基本示例。网络上确实有关于使用
    的头像 发表于 11-16 16:05 203次阅读
    自己编写<b class='flag-5'>函数</b>示例<b class='flag-5'>代码</b>很难吗?分享几个示例!

    Python 简化函数调用的3种技巧

    (a=a, b=b, c = c , d= 4 ) 10 这样写实在是太丑了,如果用 Map 函数,是否能简化代码? 答案是肯定的,但是Map函数【一般】只能接受单一元素,如
    的头像 发表于 11-01 16:20 162次阅读

    Arduino音乐代码怎样添加?

    Arduino音乐代码怎样添加
    发表于 10-30 08:26

    arduino平台millis()函数有什么作用?

    有关arduino平台millis()函数,有什么作用?
    发表于 10-20 06:30

    静态代码块、构造代码块、构造函数及普通代码块的执行顺序

    在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。 1、静态
    的头像 发表于 10-09 15:40 427次阅读
    静态<b class='flag-5'>代码</b>块、构造<b class='flag-5'>代码</b>块、构造<b class='flag-5'>函数</b>及普通<b class='flag-5'>代码</b>块的执行顺序

    arduino的串口底层函数在哪里修改?

    arduino的串口底层函数在哪里修改
    发表于 09-25 06:35

    Arduino的PWM控制代码

    );// 延迟1秒钟}delay(5000);// 输出完10个脉冲后,等待5秒钟再重新开始输出[td]} 这个代码示例中,我们使用了Arduino的analogWrite()函数来控制PWM输出
    发表于 09-21 08:57

    CNC Control with Arduino Mega256源代码分享

    CNC Control with Arduino Mega256源代码分享
    发表于 07-17 15:59 4次下载

    使用Arduino和Octoblu上的Tentacle实现无代码物联网

    电子发烧友网站提供《使用Arduino和Octoblu上的Tentacle实现无代码物联网.zip》资料免费下载
    发表于 06-19 11:22 0次下载
    使用<b class='flag-5'>Arduino</b>和Octoblu上的Tentacle实现无<b class='flag-5'>代码</b>物联网

    如何从Arduino取回代码/程序

    电子发烧友网站提供《如何从Arduino取回代码/程序.zip》资料免费下载
    发表于 06-09 10:50 1次下载
    如何从<b class='flag-5'>Arduino</b>取回<b class='flag-5'>代码</b>/程序

    我玩Arduino,但我使用寄存器开发

    。ArduinoIDE提供了一个非常简洁、易于使用的开发环境,使编写和上传代码变得简单。它提供了一套简化函数库和API,使开发者可以轻松地与ATmega328P的硬件进行交互,无需深入了解底层的寄存器操作。但是
    的头像 发表于 05-19 09:27 1481次阅读
    我玩<b class='flag-5'>Arduino</b>,但我使用寄存器开发

    基于Arduino控制伺服电机(舵机)

    格式为 库函数名.需要调用的函数。 setup:只执行一次,arduino.ide不可缺少的函数,可理解为开始运行程序的准备阶段。 loop:也是
    发表于 05-16 15:54 1次下载
    基于<b class='flag-5'>Arduino</b>控制伺服电机(舵机)

    Arduino/ESP8266函数不返回值导致异常的原因?

    Arduino/ESP8266 上它编译得很好,但随后触发了一个异常,这看起来很极端。我是否缺少逻辑,或者这是一个错误? 使用开发板 3.0.2 和 Arduino 1.8.13 必须如何在函数
    发表于 05-08 07:36

    求分享arduino MEGA代码

    ESP8266 和 arduino MEGA 需要的代码 包括: 1. 设置 mac 地址 2. 连接到“路由器 WIFI” 3. 设置 Web 服务器 感谢您帮助人们
    发表于 05-08 07:33