Arduino - 快速指南


Arduino - 概述

Arduino 是一个基于易于使用的硬件和软件的原型平台(开源)。它由一块可以编程的电路板(称为微控制器)和一个称为Arduino IDE(集成开发环境)的现成软件组成,该软件用于编写计算机代码并将其上传到物理板。

主要特点是 -

  • Arduino 板能够读取来自不同传感器的模拟或数字输入信号,并将其转换为输出,例如激活电机、打开/关闭 LED、连接到云端以及许多其他操作。

  • 您可以通过Arduino IDE向板上的微控制器发送一组指令(称为上传软件)来控制您的板子功能。

  • 与大多数以前的可编程电路板不同,Arduino 不需要额外的硬件(称为编程器)来将新代码加载到电路板上。您只需使用 USB 电缆即可。

  • 此外,Arduino IDE 使用简化版本的 C++,使学习编程变得更加容易。

  • 最后,Arduino 提供了一个标准外形尺寸,将微控制器的功能分解为更易于访问的封装。

木板

板类型

根据所使用的微控制器的不同,可以使用各种类型的 Arduino 板。然而,所有 Arduino 板都有一个共同点:它们都是通过 Arduino IDE 进行编程的。

差异取决于输入和输出的数量(可以在单板上使用的传感器、LED 和按钮的数量)、速度、工作电压、外形尺寸等。有些板设计为嵌入式,无需编程接口(硬件),您需要单独购买。有些可以直接使用 3.7V 电池供电,有些则至少需要 5V。

以下是可用的不同 Arduino 板的列表。

基于ATMEGA328微控制器的Arduino板

董事会名称 工作电压 时钟速度 数字输入/输出 模拟输入 脉宽调制 串口 编程接口
Arduino Uno R3 5V 16兆赫 14 6 6 1 通过 ATMega16U2 USB
Arduino Uno R3 贴片 5V 16兆赫 14 6 6 1 通过 ATMega16U2 USB
红板 5V 16兆赫 14 6 6 1 通过 FTDI USB
Arduino Pro 3.3v/8 MHz 3.3V 8兆赫 14 6 6 1 FTDI 兼容接头
Arduino Pro 5V/16MHz 5V 16兆赫 14 6 6 1 FTDI 兼容接头
Arduino迷你05 5V 16兆赫 14 8 6 1 FTDI 兼容接头
Arduino Pro 迷你 3.3v/8mhz 3.3V 8兆赫 14 8 6 1 FTDI 兼容接头
Arduino Pro 迷你 5v/16mhz 5V 16兆赫 14 8 6 1 FTDI 兼容接头
Arduino以太网 5V 16兆赫 14 6 6 1 FTDI 兼容接头
Arduino Fio 3.3V 8兆赫 14 8 6 1 FTDI 兼容接头
LilyPad Arduino 328主板 3.3V 8兆赫 14 6 6 1 FTDI 兼容接头
LilyPad Arduino 简单板 3.3V 8兆赫 9 4 5 0 FTDI 兼容接头

基于ATMEGA32u4微控制器的Arduino板

董事会名称 工作电压 时钟速度 数字输入/输出 模拟输入 脉宽调制 串口 编程接口
莱昂纳多·阿杜诺 5V 16兆赫 20 12 7 1 原生USB
专业微5V/16MHz 5V 16兆赫 14 6 6 1 原生USB
专业微3.3V/8MHz 5V 16兆赫 14 6 6 1 原生USB
LilyPad Arduino USB 3.3V 8兆赫 14 6 6 1 原生USB

基于ATMEGA2560微控制器的Arduino板

董事会名称 工作电压 时钟速度 数字输入/输出 模拟输入 脉宽调制 串口 编程接口
Arduino Mega 2560 R3 5V 16兆赫 54 16 14 4 通过 ATMega16U2B USB
兆丰专业3.3V 3.3V 8兆赫 54 16 14 4 FTDI 兼容接头
超级专业5V 5V 16兆赫 54 16 14 4 FTDI 兼容接头
超级专业迷你3.3V 3.3V 8兆赫 54 16 14 4 FTDI 兼容接头

基于AT91SAM3X8E微控制器的Arduino板

董事会名称 工作电压 时钟速度 数字输入/输出 模拟输入 脉宽调制 串口 编程接口
Arduino Mega 2560 R3 3.3V 84兆赫 54 12 12 4 USB本机

Arduino - 板描述

在本章中,我们将了解 Arduino 板上的不同组件。我们将研究 Arduino UNO 板,因为它是 Arduino 板系列中最受欢迎的板。此外,它是开始电子和编码的最佳板。有些板看起来与下面给出的有点不同,但大多数 Arduino 的大部分组件都是相同的。

主板说明
电源USB

电源USB

Arduino 板可以使用计算机上的 USB 电缆供电。您所需要做的就是将 USB 电缆连接到 USB 接口 (1)。

桶形千斤顶

电源(桶形千斤顶)

通过将交流电源连接到 Barrel Jack (2),Arduino 板可以直接由交流电源供电。

电压调节器

电压调节器

电压调节器的功能是控制提供给Arduino板的电压并稳定处理器和其他元件使用的直流电压。

晶体振荡器

晶体振荡器

晶体振荡器帮助Arduino处理时间问题。Arduino如何计算时间?答案是,通过使用晶体振荡器。Arduino 晶体顶部打印的数字是 16.000H9H。它告诉我们频率是 16,000,000 赫兹或 16 MHz。

Arduino重置

Arduino重置

您可以重置您的 Arduino 板,即从头开始您的程序。您可以通过两种方式重置 UNO 板。首先,使用板上的重置按钮 (17)。其次,您可以将外部重置按钮连接到标有 RESET (5) 的 Arduino 引脚。

针脚

引脚(3.3、5、GND、Vin)

  • 3.3V (6) - 提供 3.3 输出电压

  • 5V (7) − 提供 5 输出电压

  • Arduino 板使用的大多数组件在 3.3 伏和 5 伏电压下都能正常工作。

  • GND (8)(接地) - Arduino 上有多个 GND 引脚,其中任何一个都可用于将电路接地。

  • Vin (9) - 该引脚还可用于通过外部电源(例如交流电源)为 Arduino 板供电。

模拟引脚

模拟引脚

Arduino UNO 板有六个模拟输入引脚 A0 至 A5。这些引脚可以读取来自湿度传感器或温度传感器等模拟传感器的信号,并将其转换为微处理器可以读取的数字值。

主微控制器

主微控制器

每个 Arduino 板都有自己的微控制器 (11)。您可以将其视为董事会的大脑。Arduino 上的主要 IC(集成电路)因板与板之间略有不同。微控制器通常是ATMEL公司的。在从 Arduino IDE 加载新程序之前,您必须知道您的主板有什么 IC。该信息位于 IC 顶部。有关IC结构和功能的更多详细信息,您可以参考数据手册。

ICSP引脚

ICSP引脚

大多数情况下,ICSP (12) 是一个 AVR,是 Arduino 的一个微型编程头,由 MOSI、MISO、SCK、RESET、VCC 和 GND 组成。它通常被称为 SPI(串行外设接口),可以被视为输出的“扩展”。实际上,您正在将输出设备从属于 SPI 总线的主机。

电源LED指示灯

电源LED指示灯

当您将 Arduino 插入电源时,该 LED 应该会亮起,表明您的开发板已正确通电。如果该灯不亮,则表明连接有问题。

TX 和 RX LED

TX 和 RX LED

在您的主板上,您会发现两个标签:TX(发送)和 RX(接收)。它们出现在 Arduino UNO 板上的两个位置。首先,在数字引脚0和1处,指示负责串行通信的引脚。其次,TX 和 RX 主导 (13)。发送串行数据时,TX LED 以不同的速度闪烁。闪烁的速度取决于板子使用的波特率。接收过程中RX闪烁。

数字输入/输出

数字输入/输出

Arduino UNO 板有 14 个数字 I/O 引脚 (15)(其中 6 个提供 PWM(脉冲宽度调制)输出。这些引脚可配置为用作输入数字引脚以读取逻辑值(0 或 1)或用作数字输出引脚可驱动不同的模块,如 LED、继电器等。标有“~”的引脚可用于生成 PWM。

AREF

AREF

AREF 代表模拟参考。有时,它用于将外部参考电压(0 至 5 伏之间)设置为模拟输入引脚的上限。

Arduino - 安装

了解了 Arduino UNO 板的主要部分后,我们准备学习如何设置 Arduino IDE。一旦我们了解了这一点,我们就准备好将我们的程序上传到 Arduino 板上了。

在本节中,我们将通过简单的步骤学习如何在计算机上设置 Arduino IDE 并准备开发板通过 USB 线接收程序。

步骤 1 - 首先,您必须拥有 Arduino 板(您可以选择您最喜欢的板)和 USB 电缆。如果您使用 Arduino UNO、Arduino Duemilanove、Nano、Arduino Mega 2560 或 Diecimila,您将需要一根标准 USB 电缆(A 插头到 B 插头),您可以将其连接到 USB 打印机,如下图所示。

USB电缆

如果您使用 Arduino Nano,则需要一根 A 转 Mini-B 电缆,如下图所示。

迷你电缆

第 2 步 - 下载 Arduino IDE 软件。

您可以从Arduino 官方网站的下载页面获取不同版本的 Arduino IDE 。您必须选择与您的操作系统(Windows、IOS 或 Linux)兼容的软件。文件下载完成后,解压缩该文件。

打开 Arduino Nightly Windows

步骤 3 - 给你的主板上电。

Arduino Uno、Mega、Duemilanove 和 Arduino Nano 自动从计算机的 USB 连接或外部电源获取电力。如果您使用的是 Arduino Diecimila,则必须确保该板配置为从 USB 连接获取电源。电源通过跳线来选择,跳线是一小块塑料,安装在 USB 和电源插孔之间的三个引脚中的两个上。检查它是否位于最靠近 USB 端口的两个引脚上。

使用 USB 电缆将 Arduino 板连接到计算机。绿色电源 LED(标记为 PWR)应发光。

第 4 步 - 启动 Arduino IDE。

下载 Arduino IDE 软件后,您需要解压该文件夹。在该文件夹内,您可以找到带有无限标签的应用程序图标(application.exe)。双击该图标启动 IDE。

启动 Arduino IDE

步骤 5 - 打开您的第一个项目。

软件启动后,您有两个选择 -

  • 创建一个新项目。
  • 打开现有的项目示例。

要创建新项目,请选择“文件”→ “新建”

编辑文件

要打开现有项目示例,请选择文件 → 示例 → 基础知识 → Blink。

开放项目

在这里,我们仅选择名为Blink 的示例之一。它会延迟一段时间打开和关闭 LED。您可以从列表中选择任何其他示例。

第 6 步 - 选择您的 Arduino 板。

为了避免在将程序上传到开发板时出现任何错误,您必须选择正确的 Arduino 开发板名称,该名称与连接到计算机的开发板相匹配。

转到工具 → 板并选择您的板。

选择主板

这里,我们根据我们的教程选择了Arduino Uno板,但您必须选择与您使用的板相匹配的名称。

步骤 7 - 选择您的串行端口。

选择Arduino板的串口设备。转到工具 → 串行端口菜单。这可能是 COM3 或更高版本(COM1 和 COM2 通常为硬件串行端口保留)。要找到答案,您可以断开 Arduino 板的连接并重新打开菜单,消失的条目应该是 Arduino 板的条目。重新连接板并选择该串行端口。

串行端口

步骤 8 - 将程序上传到您的主板。

在解释如何将程序上传到开发板之前,我们必须演示 Arduino IDE 工具栏中出现的每个符号的功能。

上传程序

A - 用于检查是否有任何编译错误。

B - 用于将程序上传到 Arduino 板。

C - 用于创建新草图的快捷方式。

D - 用于直接打开示例草图之一。

E - 用于保存您的草图。

F - 串行监视器用于从板接收串行数据并将串行数据发送到板。

现在,只需单击环境中的“上传”按钮即可。等待几秒钟;您将看到板上的 RX 和 TX LED 闪烁。如果上传成功,状态栏中将显示“上传完成”消息。

注意- 如果您有 Arduino Mini、NG 或其他板,则需要在单击 Arduino 软件上的上传按钮之前立即按下板上的重置按钮。

Arduino - 程序结构

在本章中,我们将深入研究 Arduino 程序结构,并学习更多 Arduino 世界中使用的新术语。Arduino 软件是开源的。Java 环境的源代码在 GPL 下发布,C/C++ 微控制器库在 LGPL 下发布。

Sketch - 第一个新术语是名为“ sketch ”的 Arduino 程序。

结构

Arduino 程序可分为三个主要部分:结构、值(变量和常量)和函数。在本教程中,我们将逐步了解 Arduino 软件程序,以及如何编写没有任何语法或编译错误的程序。

让我们从结构开始。软件结构由两个主要功能组成 -

  • 设置( ) 函数
  • 循环()函数
结构
Void setup ( ) {

}
  • 目的- setup()函数在草图启动时被调用。用它来初始化变量、引脚模式、开始使用库等。设置函数只会在 Arduino 板每次上电或重置后运行一次。

  • 输入- -

  • 输出- -

  • 返回- -

Void Loop ( ) {

}
  • 目的- 创建初始化并设置初始值的setup()函数后,loop()函数正如其名称所暗示的那样,连续循环,允许您的程序更改和响应。用它来主动控制 Arduino 板。

  • 输入- -

  • 输出- -

  • 返回- -

Arduino - 数据类型

C 中的数据类型是指用于声明不同类型的变量或函数的广泛系统。变量的类型决定了它在存储中占据多少空间以及如何解释存储的位模式。

下表提供了 Arduino 编程期间将使用的所有数据类型。

空白 布尔值 字符 无符号字符 字节 整数 无符号整型 单词
长的 无符号长整型 短的 漂浮 双倍的 大批 字符串-字符数组 字符串对象

空白

void 关键字仅在函数声明中使用。它表明该函数预计不会向调用它的函数返回任何信息。

例子

Void Loop ( ) {
   // rest of the code
}

布尔值

布尔值包含两个值之一:true 或 false。每个布尔变量占用一个字节的内存。

例子

boolean val = false ; // declaration of variable with type boolean and initialize it with false
boolean state = true ; // declaration of variable with type boolean and initialize it with true

查尔

一种占用一个字节内存来存储字符值的数据类型。字符文字用单引号编写,如下所示:“A”,对于多个字符,字符串使用双引号:“ABC”。

但是,字符存储为数字。具体编码可以在ASCII图表中看到。这意味着可以对字符进行算术运算,其中使用字符的 ASCII 值。例如,“A”+1 的值为 66,因为大写字母 A 的 ASCII 值为 65。

例子

Char chr_a = ‘a’ ;//declaration of variable with type char and initialize it with character a
Char chr_c = 97 ;//declaration of variable with type char and initialize it with character 97

ASCII 字符表

无符号字符

Unsigned char是一种无符号数据类型,占用一个字节的内存。unsigned char 数据类型对 0 到 255 之间的数字进行编码。

例子

Unsigned Char chr_y = 121 ; // declaration of variable with type Unsigned char and initialize it with character y

字节

一个字节存储一个 8 位无符号数,从 0 到 255。

例子

byte m = 25 ;//declaration of variable with type byte and initialize it with 25

整数

整数是数字存储的主要数据类型。int 存储 16 位(2 字节)值。这会产生 -32,768 到 32,767 的范围(最小值为 -2^15,最大值为 (2^15) - 1)。

int大小因板而异。例如,在 Arduino Due 上,int存储 32 位(4 字节)值。这会产生 -2,147,483,648 到 2,147,483,647 的范围(最小值为 -2^31,最大值为 (2^31) - 1)。

例子

int counter = 32 ;// declaration of variable with type int and initialize it with 32

无符号整型

Unsigned ints(无符号整数)与 int 存储 2 字节值的方式相同。然而,它们不存储负数,而是仅存储正值,产生 0 到 65,535 (2^16) - 1) 的有用范围。Due 存储一个 4 字节(32 位)值,范围从 0 到 4,294,967,295 (2^32 - 1)。

例子

Unsigned int counter = 60 ; // declaration of variable with 
   type unsigned int and initialize it with 60

单词

在 Uno 和其他基于 ATMEGA 的板上,一个字存储一个 16 位无符号数。在 Due 和 Zero 上,它存储一个 32 位无符号数。

例子

word w = 1000 ;//declaration of variable with type word and initialize it with 1000

长的

长变量是用于数字存储的扩展大小变量,存储 32 位(4 字节),从 -2,147,483,648 到 2,147,483,647。

例子

Long velocity = 102346 ;//declaration of variable with type Long and initialize it with 102346

无符号长

无符号长变量是用于数字存储的扩展大小变量,可存储 32 位(4 字节)。与标准长整型不同,无符号长整型不会存储负数,其范围为 0 到 4,294,967,295 (2^32 - 1)。

例子

Unsigned Long velocity = 101006 ;// declaration of variable with 
   type Unsigned Long and initialize it with 101006

短的

Short 是一种 16 位数据类型。在所有 Arduino(基于 ATMega 和 ARM)上,short 存储 16 位(2 字节)值。这会产生 -32,768 到 32,767 的范围(最小值为 -2^15,最大值为 (2^15) - 1)。

例子

short val = 13 ;//declaration of variable with type short and initialize it with 13

漂浮

浮点数的数据类型是具有小数点的数字。浮点数通常用于近似模拟值和连续值,因为它们比整数具有更高的分辨率。

浮点数最大可达 3.4028235E+38,最小可达 -3.4028235E+38。它们存储为 32 位(4 字节)信息。

例子

float num = 1.352;//declaration of variable with type float and initialize it with 1.352

双倍的

在 Uno 和其他基于 ATMEGA 的板上,双精度浮点数占用 4 个字节。也就是说,double 实现与 float 完全相同,但精度没有提高。在 Arduino Due 上,双精度数具有 8 字节(64 位)精度。

例子

double num = 45.352 ;// declaration of variable with type double and initialize it with 45.352

Arduino - 变量和常量

在我们开始解释变量类型之前,我们需要确保您完全理解一个非常重要的主题,称为变量范围

什么是变量作用域?

Arduino 使用的 C 编程语言中的变量有一个称为作用域的属性。作用域是程序的一个区域,可以在三个地方声明变量。他们是 -

  • 在函数或块内部,称为局部变量
  • 在函数参数的定义中,称为形式参数
  • 在所有函数之外,这称为全局变量

局部变量

在函数或块内声明的变量是局部变量。它们只能由该函数或代码块内的语句使用。局部变量在其自身之外无法发挥作用。以下是使用局部变量的示例 -

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

全局变量

全局变量在所有函数之外定义,通常在程序的顶部。全局变量将在程序的整个生命周期中保持其值。

全局变量可以被任何函数访问。也就是说,全局变量在声明后即可在整个程序中使用。

以下示例使用全局变量和局部变量 -

Int T , S ;
float c = 0 ; Global variable declaration

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

Arduino - 操作员

运算符是告诉编译器执行特定数学或逻辑函数的符号。C语言有丰富的内置运算符,并提供以下类型的运算符 -

  • 算术运算符
  • 比较运算符
  • 布尔运算符
  • 按位运算符
  • 复合运算符

算术运算符

假设变量 A 为 10,变量 B 为 20,则 -

显示示例

操作员名称 操作简单 描述 例子
赋值运算符 = 将等号右侧的值存储到等号左侧的变量中。 A=B
添加 + 添加两个操作数 A + B 将为 30
减法 - 从第一个操作数中减去第二个操作数 A - B 将给出 -10
乘法 * 将两个操作数相乘 A * B 将给出 200
分配 / 分子除以分母 B/A 将给出 2
模数 % 模数运算符和整数除法后的余数 B % A 将给出 0

比较运算符

假设变量 A 为 10,变量 B 为 20,则 -

显示示例

操作员名称 操作简单 描述 例子
等于 == 检查两个操作数的值是否相等,如果相等则条件成立。 (A == B) 不成立
不等于 != 检查两个操作数的值是否相等,如果值不相等则条件成立。 (A != B) 为真
少于 < 检查左操作数的值是否小于右操作数的值,如果是,则条件为真。 (A < B) 为真
比...更棒 > 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 (A > B) 不正确
小于或等于 <= 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 (A <= B) 为真
大于或等于 >= 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。 (A >= B) 不正确

布尔运算符

假设变量 A 为 10,变量 B 为 20,则 -

显示示例

操作员名称 操作简单 描述 例子
&& 称为逻辑与运算符。如果两个操作数均非零,则条件为真。 (A && B) 为真
或者 || 称为逻辑或运算符。如果两个操作数中的任何一个非零,则条件变为真。 (A || B) 为真
不是 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑 NOT 运算符将为假。 !(A && B) 为假

按位运算符

假设变量 A 为 60,变量 B 为 13,则 -

显示示例

操作员名称 操作简单 描述 例子
& 如果两个操作数中都存在,则二进制 AND 运算符会将一位复制到结果中。 (A & B) 将给出 12,即 0000 1100
或者 | 如果任一操作数中存在该位,则二元或运算符会复制该位 (A | B) 将给出 61,即 0011 1101
异或 ^ 如果在一个操作数中设置了该位,但不是在两个操作数中都设置了该位,则二进制 XOR 运算符会复制该位。 (A ^ B) 将给出 49,即 0011 0001
不是 二进制补码运算符是一元的,具有“翻转”位的效果。 (~A ) 将给出 -60 即 1100 0011
左移 << 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将给出 240,即 1111 0000
右移 >> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 15,即 0000 1111

复合运算符

假设变量 A 为 10,变量 B 为 20,则 -

显示示例

操作员名称 操作简单 描述 例子
增量 ++ 自增运算符,将整数值加一 A++ 会给出 11
递减 -- 自减运算符,将整数值减一 A-- 会给 9
复合加法 += 添加 AND 赋值运算符。它将右操作数添加到左操作数并将结果分配给左操作数 B += A 相当于 B = B+ A
复合减法 -= 减法 AND 赋值运算符。它从左操作数中减去右操作数并将结果分配给左操作数 B -= A 相当于 B = B - A
复合乘法 *= 乘法与赋值运算符。它将右操作数与左操作数相乘,并将结果赋给左操作数 B*= A 相当于 B = B* A
复合除法 /= 除法与赋值运算符。它将左操作数与右操作数相除,并将结果赋给左操作数 B /= A 相当于 B = B / A
复合模 %= 模 AND 赋值运算符。它使用两个操作数取模并将结果分配给左操作数 B %= A 相当于 B = B % A
按位复合或 |= 按位 OR 和赋值运算符 A |= 2 与 A = A | 相同 2
按位复合和 &= 按位与赋值运算符 A &= 2 与 A = A & 2 相同

Arduino - 控制语句

决策结构要求程序员指定一个或多个由程序评估或测试的条件。它应该与条件被确定为真时要执行的一个或多个语句一起,并且可选地,如果条件被确定为假则要执行的其他语句。

以下是大多数编程语言中典型决策结构的一般形式 -

决策

控制语句是源代码中控制程序执行流程的元素。他们是 -

序列号 控制语句和描述
1

如果语句

它采用括号中的表达式和语句或语句块。如果表达式为 true,则执行语句或语句块,否则将跳过这些语句。

2

if …else 语句

if语句后面可以跟一个可选的 else 语句,该语句在表达式为 false 时执行

3

If…else if…else 语句

if语句后面可以跟一个可选的else if...else语句,这对于使用单个 if...else if 语句测试各种条件非常有用

4

switch case 语句

与 if 语句类似,switch...case通过允许程序员指定应在各种条件下执行的不同代码来控制程序流程。

5

条件运算符 ? :

条件运算符 ? : 是 C 语言中唯一的三元运算符。

Arduino - 循环

编程语言提供了各种控制结构,允许更复杂的执行路径。

循环语句允许我们多次执行一条语句或一组语句,以下是大多数编程语言中循环语句的一般形式 -

循环架构

C 编程语言提供以下类型的循环来处理循环要求。

序列号 循环和描述
1

while 循环

while 循环将连续无限地循环,直到括号 () 内的表达式变为 false。某些东西必须改变被测试的变量,否则 while 循环将永远不会退出。

2

do…while 循环

do …while循环与 while 循环类似。在 while 循环中,在执行循环体之前,在循环开始时测试循环继续条件。

3

for循环

for循环执行语句预定次数。循环的控制表达式完全在 for 循环括号内初始化、测试和操作。

4

嵌套循环

C 语言允许您在一个循环内使用另一个循环。下面的例子说明了这个概念。

5

无限循环

这是没有终止条件的循环,因此循环变成无限循环。

Arduino - 功能

函数允许以代码段的形式构建程序来执行单独的任务。创建函数的典型情况是需要在程序中多次执行相同的操作。

将代码片段标准化为函数有几个优点 -

  • 函数可以帮助程序员保持井井有条。通常这有助于将程序概念化。

  • 函数将一个操作编码在一处,以便该函数只需考虑和调试一次。

  • 如果需要更改代码,这也可以减少修改错误的机会。

  • 函数使整个草图更小、更紧凑,因为代码部分被多次重用。

  • 通过将代码模块化,可以更轻松地在其他程序中重用代码,并且使用函数通常可以使代码更具可读性。

Arduino 草图或程序中有两个必需的函数,即setup() 和loop()。必须在这两个函数的括号之外创建其他函数。

定义函数的最常见语法是 -

功能

函数声明

函数在任何其他函数之外、循环函数上方或下方声明。

我们可以用两种不同的方式声明该函数 -

第一种方法是在循环函数上方编写称为函数原型的函数部分,其中包含 -

  • 函数返回类型
  • 函数名称
  • 函数参数类型,无需写参数名称

函数原型后面必须跟一个分号(;)。

下面的例子演示了使用第一种方法的函数声明。

例子

int sum_func (int x, int y) // function declaration {
   int z = 0;
   z = x+y ;
   return z; // return the value
}

void setup () {
   Statements // group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ; // function call
}

第二部分称为函数定义或声明,必须在循环函数下方声明,其中包含 -

  • 函数返回类型
  • 函数名称
  • 函数参数类型,这里必须添加参数名称
  • 函数体(调用函数时执行的函数内部语句)

下面的示例演示了使用第二种方法声明函数。

例子

int sum_func (int , int ) ; // function prototype

void setup () {
   Statements // group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ; // function call
}

int sum_func (int x, int y) // function declaration {
   int z = 0;
   z = x+y ;
   return z; // return the value
}

第二种方法只是在循环函数上方声明函数。

Arduino - 字符串

字符串用于存储文本。它们可用于在 LCD 或 Arduino IDE 串行监视器窗口中显示文本。字符串对于存储用户输入也很有用。例如,用户在连接到 Arduino 的键盘上键入的字符。

Arduino 编程中有两种类型的字符串 -

  • 字符数组,与 C 编程中使用的字符串相同。
  • Arduino String,它允许我们在草图中使用字符串对象。

在本章中,我们将学习字符串、对象以及字符串在 Arduino 草图中的使用。在本章结束时,您将了解在草图中使用哪种类型的字符串。

字符串字符数组

我们将学习的第一种字符串类型是由一系列char类型的字符组成的字符串。在上一章中,我们学习了什么是数组;存储在内存中的连续一系列相同类型的变量。字符串是 char 变量的数组。

字符串是一种特殊的数组,在字符串末尾有一个额外的元素,该元素的值始终为 0(零)。这称为“空终止字符串”。

字符串字符数组示例

此示例将展示如何创建字符串并将其打印到串行监视器窗口。

例子

void setup() {
   char my_str[6]; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str[0] = 'H'; // the string consists of 5 characters
   my_str[1] = 'e';
   my_str[2] = 'l';
   my_str[3] = 'l';
   my_str[4] = 'o';
   my_str[5] = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

以下示例显示了字符串的组成部分;一个包含可打印字符的字符数组,0 作为数组的最后一个元素,以表明这是字符串的结束位置。通过使用Serial.println()并传递字符串名称,可以将该字符串打印到 Arduino IDE 串行监视器窗口。

这个相同的例子可以用更方便的方式编写,如下所示 -

例子

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

在此草图中,编译器计算字符串数组的大小,并自动使用 null 以零终止字符串。创建一个长度为六个元素、由五个字符后跟一个零组成的数组,其创建方式与上一个草图完全相同。

操作字符串数组

我们可以更改草图中的字符串数组,如下图所示。

例子

void setup() {
   char like[] = "I like coffee and cake"; // create a string
   Serial.begin(9600);
   // (1) print the string
   Serial.println(like);
   // (2) delete part of the string
   like[13] = 0;
   Serial.println(like);
   // (3) substitute a word into the string
   like[13] = ' '; // replace the null terminator with a space
   like[18] = 't'; // insert the new word
   like[19] = 'e';
   like[20] = 'a';
   like[21] = 0; // terminate the string
   Serial.println(like);
}

void loop() {

}

结果

I like coffee and cake
I like coffee
I like coffee and tea

草图按以下方式工作。

创建并打印字符串

在上面给出的草图中,创建了一个新字符串,然后打印该字符串以显示在串行监视器窗口中。

缩短字符串

通过将字符串中的第 14 个字符替换为以零结尾的 null (2),可以缩短字符串。这是字符串数组中从 0 开始计数的第 13 个元素。

打印字符串时,所有字符都会打印到以零结尾的新空值。其他角色并没有消失;它们仍然存在于内存中,并且字符串数组的大小仍然相同。唯一的区别是任何处理字符串的函数都只会看到第一个空终止符之前的字符串。

更改字符串中的单词

最后,草图将“蛋糕”一词替换为“茶”(3)。它首先必须用空格替换 like[13] 处的空终止符,以便字符串恢复为最初创建的格式。

新字符用单词“tea”覆盖单词“cake”中的“cak”。这是通过覆盖单个字符来完成的。“cake”的“e”被替换为新的空终止字符。结果是字符串实际上以两个空字符终止,原始字符位于字符串末尾,新字符替换“cake”中的“e”。当打印新字符串时,这没有什么区别,因为打印字符串的函数在遇到第一个空终止符时会停止打印字符串字符。

操作字符串数组的函数

前面的草图通过访问字符串中的各个字符以手动方式操作字符串。为了更轻松地操作字符串数组,您可以编写自己的函数来执行此操作,或者使用C语言库中的一些字符串函数。