一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要:本文介绍变量和函数的基本知识

在前面一篇中了解了变量,接着就来了解一下函数。函数是程序中的一个关键概念,它可以简化程序的编写,使代码更加模块化、可复用,提高程序的可读性。其实在之前已经多次遇到函数了,引脚设置、输出高低电平等等功能,都是通过函数调用来实现的。只不过,之前是使用别人写好的函数,接下来是要尝试自己写函数了。

每一个函数也有一个名字,也就是标识符。其命名的规则与变量名基本相同。函数一般由参数、函数体和返回值组成。参数是用来让函数进行不同的计算和操作,函数体是函数的主体语句,定义函数的执行流程及操作的语句,返回值则定义函数的执行结果,用来返回执行结果给调用者。函数包含一个或多个函数体,这些函数可以多次被调用,以提高程序的可重用性。一个最简单的函数如下图所示:

int add(int a, int b)

{

    return a+b;

}

第一行表明了函数的返回值是一个int类型的数据。函数的名字是add,函数有两个参数:a和b,这两个参数都是整数。

后边大括号中的内容就是函数体,在函数体中包含了实现预期功能的代码。

在Mixly中也支持函数,下面就在Mixly中创建一个add函数,然后将图形化的功能序列和它所生成的源代码对应起来,这样就应该可以理解是怎么开发一个函数了。

创建函数的功能在左侧的“函数”功能模块区,在这里选择一个有返回值的函数功能。然后,单击函数功能左上角的蓝色图标,在弹出的对话框中,增加两个整数参数,分别为a和b。然后再创建一个局部变量c,用来保存求和后的结果,然后将c做为该函数的返回值。开发完成后的add函数如下所示:

这个函数就实现了简单的将2个数据相加的功能。Mixly生成的源代码如下所示:

int add(int a, int b) {

  int c = 0;

  c = a + b;

  return c;

}

这个和我之前的实现代码的区别就是定义了一个c来保存相加之后的结果,然后再将c作为返回值,返回给了函数的调用者。如果直接将a+b返回,那么生成的函数就和我之前的代码一模一样了。如下所示:

函数的调用方法很简单,有返回值的可以把返回值赋值给一个变量,或者作为参数传递给其他的函数。方法如下所示:

这就实现了计算5+10的功能,a和b的参数也可以是其他函数的返回值。对应的代码为:

  int c = 0;

  c = add(5, 10);

没有返回值的函数,是不能将结果赋值给其他的变量或者作为另一个函数的参数的。接下来就来实现一个控制小车车轮的函数,在前面的学习中,已经知道了,控制小车车轮需要控制两个GPIO的状态来实现小车车轮的正转、反转和停止。接下来就定义一个wheel()函数,这个函数有3个参数,两个控制的GPIO引脚,一个表示运动的状态,对于运动状态,可以用0表示停止,1表示前进,2表示后退。接下来先生成一个有三个整数参数的wheel()函数,in1和in2是控制车轮转动的2个GPIO管脚。status表示车轮的运动状态。如下所示:

然后,用一个swtich功能来实现依据不同的status,对应不同的操作。swith后的变量与case后的值相等时,该case后的功能将被执行。所有case的值均不相等的时候,default后的语句将被执行。完成实现的函数如下所示:

通过上图可以看出,当status是1时,in1输出高电平,in2输出低电平。当status是2时,in1输出低电平,in2输出高电平。status不是1也不是2的时候,in1和in2都输出低电平。

这个wheel()函数对应的C语言源码如下:

void wheel(int in1, int in2, int status) {

  switch (status) {

   case 1:

    pinMode(in1, OUTPUT);

    digitalWrite(in1,HIGH);

    pinMode(in2, OUTPUT);

    digitalWrite(in2,LOW);

    break;

   case 2:

    pinMode(in1, OUTPUT);

    digitalWrite(in1,LOW);

    pinMode(in2, OUTPUT);

    digitalWrite(in2,HIGH);

    break;

   default:

    pinMode(in1, OUTPUT);

    digitalWrite(in1,LOW);

    pinMode(in2, OUTPUT);

    digitalWrite(in2,LOW);

    break;

  }

}

这个代码可以很容易的和Mixly中的图形对应起来。在这里就不过多的解释了。接下来再来实现一个前进的函数,函数的名字叫forward()。在实现这个函数之前,先把控制车轮的8个GPIO都定义成全局变量,这样将来万一需要修改使用的GPIO管脚,我们只要修改全局变量的初值就可以了,整个运动的控制,只和这8个变量有关。这些变量的定义如下:

接下来就来实现小车的向前运动函数forward()。如下所示:

这个时候向前运动的函数,就比之前的简单多了,而且再实现其他方向的运动也很简单了,在这个函数的基础上,修改一下轮子的转动方向就可以了。Forward()函数的源代码如下所示:

void forward() {

  wheel(PIN1, PIN2, 1);

  wheel(PIN3, PIN4, 1);

  wheel(PIN4, PIN6, 1);

  wheel(PIN7, PIN8, 1);

}

只有短短的四行了,比之前实现一个方向的运动,要简单多了吧?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/300570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VELO维乐携手【晓饰记】创始人胡晓,引领潮流新饰界!

不知道大家还记不记得2023年维乐带着自己满满的诚意闪现英伦时尚之都为全世界带来了一场无与伦比的视觉盛宴!而依照维乐固有的执念,从不会让自己止步的精神,维乐又带着自己的维乐坐垫找到了CoCo胡晓,【晓饰记】的首饰品牌创始人、…

Video classification with UniFormer基于统一分类器的视频分类

本文主要介绍了UniFormer: Unified Transformer for Efficient Spatial-Temporal Representation Learning 代码:https://github.com/Sense-X/UniFormer/tree/main/video_classification UNIFormer 动机 由于视频具有大量的局部冗余和复杂的全局依赖关系&#xf…

Matplotlib for C++不完全手册

matplotlib-cpp是Matplotlib(MPL)为C提供的一个用于python的matplotlib绘图库的C包装器。它的构建类似于Matlab和matplotlib使用的绘图API。 However, the function signatures might differ and Matplotlib for C does not support the full functional…

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射,枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏,例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) ,QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…

如何信任机器学习模型的预测结果?

在本篇中,我将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。 我使用数据集 carbig(MATLAB 自带的数据集)训练一个回归模型,用于预测汽车的燃油效率。数据集 carbig 是 70 年代到 80 年代生产的汽…

Android AIDL 创建的DEMO

使用AIDL创建一个demo 主要参考文件, 以及其他地址 Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 绑定服务概览 | Android 开发者 | Android Developers Android 接口定义语言 (AIDL) Android 接口定义语言 (AIDL) 与您可能使用…

倍思科技红海突围要义:紧随新趋势,“实用而美”理念从一而终

移动数码周边市场始终不缺热度。 销售端是业绩的节节高升,如在2023年京东双十一,移动数码周边产品销售成果丰硕,根据京东战报,大功率充电器成交额同比提升 200%,65W以上移动电源成交额同比提升 150%,自带线…

服务器内存不足怎么办?会有什么影响?

服务器内存,也被称为RAM(Random Access Memory),是一种临时存储设备,用于临时存放正在运行的程序和数据。它是服务器上的超高速存储介质,可以快速读取和写入数据,提供给CPU进行实时计算和操作。…

Python基础入门第八课笔记(自定义函数 lambda)

什么时候用lambda表达式? 当函数有一个返回值,且只有一句代码,可以用lambda简写。 2、lanbda语法 lambda 形参 : 表达式 注意: 1、形参可以省略,函数的参数在lambda中也适用 2、lambda函数能接收任何数量的参数但只能…

Dockerfile的EXPOSE

文章目录 环境总结测试使用EXPOSE测试1:不做端口映射测试2:-p 8080:80测试3:-P测试4:--networkhost 不使用EXPOSE 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息,可以直接看结果&#…

MYSQL篇--sql优化高频面试题

sql优化 1 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 其实对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说 它…

228. 汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

[C#]使用onnxruntime部署yolov8-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

OpenCV图像处理|1.1 OpenCV介绍与环境搭建

1.1.1 介绍 OpenCV(Open Source Computer Vision Library)开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV 其实就是一堆 C 和 C语言的源代码文件,这些源代码文件中实现了许多常用的计算机视…

智慧医院预约及支付平台—智慧支付

医保支付流程 自费支付流程 智慧医院支付业务介绍 社保卡绑定(身份认证) 认证方案:银行身份已验证客户,可通过本人银行登记的手机号码登录医院APP后,在完善APP注册身份信息时,将相关信息发送苏州银行,由银行核对客户身份信息正确性并将社保卡绑定本人手机。核实后的身份…

Java:File类详解

文章目录 1、概述2、创建File实例3、常用方法3.1 获取功能的方法3.2 绝对路径和相对路径3.3 判断功能的方法3.4 创建删除功能的方法3.5 文件过滤功能的方法 4、文件夹的遍历5、综合练习5.1 创建文件夹5.2 查找文件(不考虑子文件夹)5.3 查找文件&#xff…

视频剪辑技巧:添加srt字幕,提升视频品质的方法

在视频制作和剪辑过程中,字幕的添加是一项常见的技巧。通过添加srt字幕,可以提升视频的品质和观感,让观众更好地理解视频内容。下面一起来看云炫AI智剪如何批量添加srt字幕的方法,如何通过这些技巧提升视频品质。 原视频画面与添…

XAgent调研

文章目录 1 简介2 快速测试 Quick Start3 结构分析 1 简介 XAgent(链接)是一个开源的,基于大语言模型的agent构建框架;其目标是构建出能够辅助人类处理各类任务的自动助手 定位:一个全能的,自动的辅助agen…