Arduino编程语言简介

944 阅读9分钟

你如何为你的Arduino板编写程序?

Arduino原生支持一种语言,我们称之为Arduino编程语言,或Arduino语言。

这种语言是基于Wiring开发平台的,而Wiring开发平台又是基于Processing的,如果你不熟悉的话,它就是p5.js的基础。这是一个历史悠久的项目,它以非常开放的方式建立在其他项目之上。Arduino IDE是基于Processing IDE和建立在它之上的Wiring IDE的。

当我们使用Arduino工作时,我们通常使用Arduino IDE(集成开发环境),这是一个适用于所有主要桌面平台(macOS、Linux、Windows)的软件,它为我们提供了两件事:一个支持集成库的编程编辑器,以及一个可以轻松编译和加载我们的Arduino程序到连接到计算机的电路板上的方法。

Arduino编程语言基本上是一个建立在C++之上的框架。你可以争辩说它不是传统意义上的真正的编程语言,但我认为这有助于避免初学者的混淆。

用Arduino编程语言编写的程序被称为草图。一个草图通常以.ino (来自Arduino )为扩展名保存。

与 "普通 "C或C++的主要区别是,你把所有的代码都包在2个主函数中。当然,你可以有超过2个,但任何Arduino程序必须至少提供这2个。

一个被称为setup() ,另一个被称为loop() 。第一个被调用一次,当程序启动时,第二个在你的程序运行时被反复调用。

我们没有像你在C/C++中习惯的那样有一个main() 函数作为程序的进入点。一旦你编译了你的草图,IDE会确保最终结果是一个正确的C++程序,并且基本上会通过预处理来添加缺少的胶水。

其他都是正常的C++代码,由于C++是C的超集,任何有效的C也是有效的Arduino代码。

一个可能给你带来麻烦的区别是,虽然你可以在多个文件上生成你的程序,但这些文件必须都在同一个文件夹中。如果你的程序会变得非常大,这可能是一个破坏性的限制,但在这一点上,很容易转移到一个本地的C++设置,这是可能的。

Arduino编程语言的一部分是内置的库,允许你轻松地与Arduino板提供的功能集成。

你的第一个Arduino程序肯定会涉及到让一个led打开灯,然后再关闭。要做到这一点,你将使用pinMode(),delay()digitalWrite() 函数,以及一些常数,如HIGH,LOW,OUTPUT

像这样,典型的第一个Arduino项目("你好,世界!")。

#define LED_PIN 13

void setup() {
    // Configure pin 13 to be a digital output
    pinMode(LED_PIN, OUTPUT);
}

void loop() {
    // Turn on the LED
    digitalWrite(LED_PIN, HIGH);
    // Wait 1 second (1000 milliseconds)
    delay(1000);
    // Turn off the LED
    digitalWrite(LED_PIN, LOW);
    // Wait 1 second
    delay(1000);
}

这都是Arduino编程语言的一部分,或者我们最好叫它套件 或库

对其他语言的支持

作为提醒,我想指出,你并不局限于使用这种语言和IDE来为Arduino编程。存在一些项目,其中包括让你使用Johnny Five项目在上面运行Node.js代码,使用pyserial的Python代码和使用Gobot的Go代码,但Arduino编程语言绝对是你会看到大多数教程的基础,因为它是使用这些设备的原生和典型方式。

Arduino编程语言的内置常量

Arduino设置了两个常数,我们可以用来

HIGH 等于一个高水平的电压,这可能取决于硬件(在3.3V的板子上>2V,如Arduino Nano,在5V的板子上>3V,如Arduino Uno) ,相当于一个低水平的电压。同样,确切的数值取决于所使用的板子。LOW

然后,我们有3个常数,可以和pinMode() 函数结合使用。

  • INPUT 将该引脚设置为输入引脚
  • OUTPUT 将引脚设置为输出引脚
  • INPUT_PULLUP 将该引脚设置为内部上拉电阻

另一个常数是LED_BUILTIN ,它指向板上引脚的编号,通常相当于数字13

除此以外,我们还有C/C++常量truefalse

Arduino数学常数

  • M_PI 常数pi ( )3.14159265358979323846
  • M_E 常数e
  • M_LN10 数字10的自然对数。
  • M_LN2 数字2的自然对数。
  • M_LOG10E e的对数,以10为底。
  • M_LOG2E e的对数,以2为底。
  • M_SQRT2 2的平方根。
  • NAN NAN(不是一个数字)常数。

Arduino编程语言的内置函数

在本节中,我将对Arduino编程语言所提供的内置函数做一个参考。

程序生命周期

  • setup() 这个函数被调用一次,当程序开始时,以及Arduino被关闭和重新启动时。
  • loop() 在Arduino程序运行时,这个函数被反复调用。

处理I/O

下面的函数有助于处理来自你的Arduino设备的输入和输出。

数字I/O

  • digitalRead() 从一个数字引脚读取数值。接受一个引脚号码作为参数,并返回 或 常数。HIGH LOW
  • digitalWrite() 将一个 或 的值写到一个数字输出引脚。将引脚号码和 或 作为参数传递。HIGH LOW HIGH LOW
  • pinMode() 设置一个引脚为输入或输出。将针脚编号和 或 的值作为参数传递。INPUT OUTPUT
  • pulseIn() 读取一个数字脉冲,从 到 ,然后再到 ,或者从 到 ,再到 。程序将被封锁,直到检测到脉冲。你可以指定针脚编号和你想检测的脉冲种类(LHL或HLH)。你可以指定一个可选的超时时间来停止等待该脉冲。LOW HIGH LOW HIGH LOW HIGH
  • pulseInLong() 与 相同,只是实现方式不同,如果中断关闭,就不能使用。中断通常被关闭,以获得更准确的结果。pulseIn()
  • shiftIn() 从一个引脚一次读取一个字节的数据。
  • shiftOut() 每次将一个字节的数据写到一个引脚上。
  • tone() 在一个引脚上发送一个方波,用于蜂鸣器/扬声器播放音调。你可以指定引脚,以及频率。它对数字和模拟引脚都有效。
  • noTone() 在一个引脚上停止 产生的波。tone()

模拟I/O

  • analogRead() 从一个模拟引脚读取数值。
  • analogReference() 配置模拟输入的最高输入范围,在5V板上默认为5V,在3.3V板上为3.3V。
  • analogWrite() 将一个模拟值写到一个引脚上
  • analogReadResolution() 让你改变 ,默认为10比特的模拟位分辨率。只适用于特定的设备(Arduino Due, Zero 和 MKR)。analogRead()
  • analogWriteResolution() 让你改变 的默认模拟位分辨率,默认为10位。只适用于特定的设备(Arduino Due, Zero 和 MKR)。analogWrite()

时间功能

  • delay() 将程序暂停若干毫秒,作为参数指定。
  • delayMicroseconds() 暂停程序,暂停时间为参数指定的微秒数
  • micros() 自程序开始以来的微秒数。由于溢出,~70分钟后重置。
  • millis() 自程序开始以来的毫秒数。因溢出而在~50天后重置。

数学函数

  • abs() 一个数字的绝对值
  • constrain() 将一个数字限制在一个范围内,见用法
  • map() 将一个数字从一个范围重新映射到另一个范围,见用法
  • max() 两个数字的最大值
  • min() 两个数字的最小值
  • pow() 一个数字提高到一个幂的值
  • sq() 一个数字的平方
  • sqrt() 一个数字的平方根
  • cos() 角度的余弦
  • sin() 某一角度的正弦
  • tan() 一个角的正切

注意:如果你需要的话,还有更多的内置数学函数,这里有记录

与字母数字字符打交道

  • isAlpha() 检查一个字符是否是阿尔法(一个字母)。
  • isAlphaNumeric() 检查一个字符是否是字母数字(一个字母或数字)。
  • isAscii() 检查一个字符是否是ASCII字符
  • isControl() 检查一个字符是否是控制字符
  • isDigit() 检查一个字符是否是一个数字
  • isGraph() 检查一个字符是否是可打印的ASCII字符,并且包含内容(例如,它不是一个空格)。
  • isHexadecimalDigit() 检查一个字符是否是一个十六进制数字(A-F 0-9)。
  • isLowerCase() 检查一个字符是否是一个小写的字母
  • isPrintable() 检查一个字符是否是一个可打印的ASCII字符
  • isPunct() 检查一个字符是否为标点符号(逗号、分号、感叹号等)。
  • isSpace() 检查一个字符是否为空格、换页 、换行 、回车 、水平制表符 、垂直制表符 。\f \n \r \t \v
  • isUpperCase() 检查一个字符是否是大写的字母
  • isWhitespace() 检查一个字符是否是空格或水平制表符。\t

生成随机数

  • random() 生成一个伪随机数
  • randomSeed() 用一个任意的初始数来初始化伪随机数发生器

在Arduino中,像大多数语言一样,不可能得到真正的随机数,而且序列总是相同的,所以你用当前时间作为种子,或者(在Arduino的情况下)你可以从模拟端口读取输入

与比特和字节一起工作

  • bit() 计算一个比特的值(0=1,1=2,2=4,3=8...)。
  • bitClear() 清除(设置为0)一个数字变量的一个位。接受一个数字,以及从右边开始的位的数字
  • bitRead() 读取一个数字的一个位。接受一个数字,以及从右边开始的位的数字。
  • bitSet() 将一个数字的一个位设置为1。接受一个数字,以及从右边开始的位的数字。
  • bitWrite() 将1或0写入一个数字的特定位 接受一个数字,从右边开始的位数,以及要写入的值(0或1)。
  • highByte() 获取一个字变量(有2个字节)的高阶(最左)字节
  • lowByte() 获取一个字变量(有2个字节)的低阶(最右)字节

中断

  • noInterrupts() 禁用中断
  • interrupts() 在中断被禁用后重新启用中断
  • attachInterrupt() 允许数字输入引脚成为一个中断。不同的板子有不同的允许引脚,请查看官方文档
  • detachInterrupt() 禁用一个使用attachInterrupt()