一起玩儿物联网人工智能小车(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);

}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arduion Modbus通讯示例

实现了Arduion和Qt上位机利用Modbus协议采集DHT11数据&#xff0c;以及开关LED灯 软件界面&#xff1a; 实物界面&#xff1a; arduion下位机代码&#xff1a; #include <ModbusRtu.h> #include <DHT.h>#define DHTPIN 2 // DHT11连接到Arduino的数字引…

使用C#发送邮箱验证码

使用C#发送邮箱验证码 在很多应用程序中&#xff0c;我们需要使用邮箱来进行用户身份验证。其中一种常见的方式是通过发送验证码到用户的邮箱&#xff0c;然后要求用户输入该验证码进行验证。本文将介绍如何使用 C# 发送邮箱验证码。 声明 验证码登录没有用任何的工具&#…

学习尚硅谷Vue的TodoList案例下半部分总结

今天学习尚硅谷Vue的TodoList案例四到八节的内容&#xff0c;主要实现的功能有勾选、删除、底部统计、底部交互这几部分。先说勾选&#xff0c;想要获取到用户是否勾选&#xff0c;就要给checkbox多选框注册鼠标点击事件&#xff0c;这里的思路是用户虽然是获取到了是否勾选但还…

项目框架构建之3:Nuget服务器的搭建

本文是“项目框架构建”系列之3&#xff0c;本文介绍一下Nuget服务器的搭建&#xff0c;这是一项简单的工作&#xff0c;您或许早已会了。 1.打开vs2022创建Asp.net Web应用程序 框架选择.net framework4.8&#xff0c;因为nuget服务器只支持.net framework。 2.选择空项目和保…

C++ 学习系列 -- tuple 原理

一 可变参数模板 variadic template 前面的章节 C 学习系列 -- 模板 template-CSDN博客 我们介绍了 c 中的模板概念&#xff0c;本章则在其基础上介绍了新的概念 可变参数模板 variadic template &#xff0c;顾名思义&#xff0c;可变参数模板意思为模板参数的类型与数量是变…

微信小程序封装vant 下拉框select 单选组件

先上效果图&#xff1a; 主要是用vant 小程序组件封装的&#xff1a;vant 小程序ui网址&#xff1a;vant-weapp 主要代码如下: 先封装子组件&#xff1a; select-popup 放在 components 文件夹里面 select-popup.wxml: <!--pages/select-popup/select-popup.wxml--> &…

爆肝整理,企业级性能测试-性能方案设计详细总结(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试策略 1&a…

【小沐学C++】C++ 实现鼠标键盘钩子HOOK

文章目录 1、简介2、相关函数2.1 SetWindowsHookEx2.2 UnhookWindowsHookEx2.3 CallNextHookEx 3、相关结构体3.1 KBDLLHOOKSTRUCT3.2 MSLLHOOKSTRUCT 4、挂钩过程5、代码测试5.1 代码1 结语 1、简介 https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks 挂…

Java学习笔记(十)——异常

一、异常的概念 二、异常体系图&#xff08;重要&#xff09; 三、常见的异常 &#xff08;一&#xff09;常见的运行时异常 1、NullPointerException空指针异常 2、ArithmeticException数学运算异常 3、ArrayIndexOutOfBoundsException数组下标越界异常 4、ClassCastEx…

CSS 压重按钮 效果

<template><view class="cont"><div class="container"><div class="pane"><!-- 选项1 --><label class="label" @click="handleOptionClick(0)":style="{ color: selectedOption ==…

约数个数和约数之和算法总结

知识概览 约数个数 由算数基本定理 可得对于N的任何一个约数d&#xff0c;有 因为N的每一个约数和~的一种选法是一一对应的&#xff0c;根据乘法原理可得&#xff0c; 一个数的约数个数为 约数之和 一个数的约数之和公式为 多项式乘积的每一项为 正好对应的是一个数的每一个约…

【网络安全】upload靶场pass11-17思路

目录 Pass-11 Pass-12 Pass-13 Pass-14 Pass-15 Pass-16 Pass-17 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x…

JetCache源码解析——配置加载和初始化

JetCache自动化配置加载 JetCache的配置加载主要是在jetcache-autoconfigure模块中完成的&#xff0c;其中加载配置的核心类是JetCacheAutoConfiguration&#xff0c;主要是用于创建全局性的一些Bean&#xff0c;例如全局缓存配置类GlobalCacheConfig&#xff0c;AutoConfigur…

数据密集型应用系统设计--第2章 数据模型与查询语言

一、引言 数据模型可能是开发软件最重要的部分,而且还对如何思考待解决的问题都有深远的影响。 大多数应用程序是通过一层一层叠加数据模型来构建的。每一层都面临的关键问题是&#xff1a;如何将其用下一层来表示&#xff1f; 1.作为一名应用程序开发人员&#xff0c;观测现实…

yarn无法加载文件和‘vue-cli-service‘ 不是内部或外部命令解决方法

导致此错误的原因是&#xff0c;PowerShell 执行策略&#xff0c;默认设置为Restricted不加载配置文件或运行脚本。需变更设置为RemoteSigned&#xff0c;变更过程为&#xff1a; 1.运行 Windows PowerShell&#xff08;管理员&#xff09;&#xff0c;执行命令set-ExecutionPo…

使用redis时快速考虑的问题

使用场景 ap组件程序是否容忍极限丢失1s数据是否可以不依赖redis就能实现是否过度依赖redis 数据结构 5种结构选择不同结构有自己的限制&#xff0c;使用前需考虑限制考虑当前业务最适合那种解构&#xff0c;或多种解构混合使用 key设计 大keykey的格式热key敏感数据 过…

Redis的IO多路复用原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

SpringCloud系列篇:入门讲解Spring Cloud是什么

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Cloud是什么 二.Spring …

通俗易懂的15个Java Lambda表达式案例

文章目录 1. **实现Runnable接口**&#xff1a;2. **事件监听器**&#xff08;如Swing中的ActionListener&#xff09;&#xff1a;3. **集合遍历**&#xff08;使用forEach方法&#xff09;&#xff1a;4. **过滤集合**&#xff08;使用Stream API&#xff09;&#xff1a;5. …

硬盘结构损坏且无法读取恢复方法

硬盘结构损坏且无法读取是计算机存储设备的一种常见故障。当硬盘出现此类问题时&#xff0c;用户往往无法正常访问存储在硬盘中的数据。本文将深入分析硬盘结构损坏且无法读取的潜在原因&#xff0c;并探讨有效的解决方法&#xff0c;以帮助用户恢复数据和正常使用硬盘。 硬盘结…