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

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

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

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

int add(int a, int b)

{

    return a+b;

}

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

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

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

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

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

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

int add(int a, int b) {

  int c = 0;

  c = a + b;

  return c;

}

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

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

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

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

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

  int c = 0;

  c = add(5, 10);

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

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

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

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

通过上图可以看出,当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个变量有关。这些变量的定义如下:

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

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

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

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

void forward() {

  wheel(PIN1, PIN2, 1);

  wheel(PIN3, PIN4, 1);

  wheel(PIN4, PIN6, 1);

  wheel(PIN7, PIN8, 1);

}

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

你可能感兴趣的:(开发工具软件,ESP32,物联网,单片机,c语言)