数据类型

void

void只用在函数声明。声明的函数代表不具有返回值。
例子: 执行setuploop两个函数时,没有返回值返回。

void setup()
{
  // ...
}
 
void loop()
{
  // ...
}

boolean

一个boolean类型的变量包含有两个值,truefalse。(每个boolean类型的变量占用内存的一个字节)
例子:

int LEDpin = 5;       // 定义LED引脚
int switchPin = 13;   //定义按键的引脚
 
boolean running = false;
 
void setup()
{
  pinMode(LEDpin, OUTPUT);
  pinMode(switchPin, INPUT);
  digitalWrite(switchPin, HIGH);      // 开启内部上拉电阻
}
 
void loop()
{
  if (digitalRead(switchPin) == LOW)
  {  // 按下按键
    delay(100);                        // 延时100MS
    running = !running;                // 切换变量值
    digitalWrite(LEDpin, running);      // 更改LED状态
  }
}

char

描述:
占用1个字节的内存,用于存储一个字符的数据类型。字符文字都写在单引号里面,像这样:'A'。一个字符是以数字形式来保证。你可以看到ASCII表中指定的编码。这意味着,它可以做算术运算,(例如'A'+1的值是66即为’B’,因为大写字母’A’的ASCII值是65)。char数据类型是有符号的类型,这意味着它编码的数字从-128到127。
例子:

char myChar = 'A';
char myChar = 65;      // 两句意思是一样的

unsigned char

描述:
占用1个字节的内存,用于存储一个无符号字符的数据类型。unsigned char数据类型的编码数字从0到255。
例子:

unsigned char myChar = 240;

byte

描述:
一个字节存储一个8位无符号数,从0到255。
例子:

byte b = B10010;  // "B"是用来表示二进制格式 (B10010 = 18 decimal)

int

描述:
整数是基本的数据类型。
Arduino UNO是一个16位MUC,int储存一个16位的值。它的取值范围在:-32768 到 32767 (最小值为-2 ^15 和最大值为 (2 ^15)-1)。
Arduino Due是一个32位MUC,int储存一个32位的值。它的取值范围在:-2147483648 到 2147483647 (最小值为-2 ^31 和最大值为 (2 ^31)-1)。
示例:

int ledPin = 13;

语法:

int var = val;

参数:
var:变量名
val:赋给变量的值
提示:
当变量数值过大而超过整数类型所能表示的范围时(-32,768到32,767),变量值会“回滚”

int x;
x = -32768;
x = x - 1;       // x 现在是 32,767
x = 32767;
x = x + 1;       // x 现在是 -32,768 

unsigned int

描述: 在Arduino UNO 与其他16位MCU下,unsigned int(无符号整型)与整型数据同样大小,占据2字节。它只能用于存储正数而不能存储负数,范围0~65,535 (2^16) - 1)。
在Arduino Due下,unsigned int(无符号整型)与整型数据同样大小,占据4字节。它只能用于存储正数而不能存储负数,范围0 ~4294967295 (2 ^32-1)。
无符号整型和整型最重要的区别是它们的最高位不同,既符号位。在Arduino整型类型中,如果最高位是1,则此数被认为是负数,剩下的15位为按2的补码计算所得值。
示例:

unsigned int ledPin = 13;

语法:

unsigned int var = val;

参数:
var:无符号变量名称
val:给变量所赋予的值

当变量的值超过它能表示的最大值时它会“滚回”最小值,反向也会出现这种现象。
unsigned int x
x = 0;
x = x - 1;       //x现在等于65535--向负数方向滚回
x = x + 1;       //x现在等于0--滚回

word

描述:
存储一个16字节无符号数的字符,取值范围从0到65535,与unsigned int相同。
示例:

word w = 10000;

long

长整数型变量是扩展的数字存储变量,它可以存储32位(4字节)大小的变量,从-2,147,483,648到2,147,483,647。
示例:

long speedOfLight = 186000L;   // 参考整数常量’L’的说明

语法:

long var = val;

参数:
var:长整型变量名
var:赋给变量的值

unsigned long

描述:
无符号长整型变量扩充了变量容量以存储更大的数据,它能存储32位(4字节)数据。与标准长整型不同无符号长整型无法存储负数,它的是范围从0到4,294,967,295(2 ^ 32 - 1)。
示例:

unsigned long time;
 
void setup()
{
  Serial.begin(9600);
}
 
void loop()
{
  Serial.print("Time: ");
  time = millis();
  //程序开始后一直打印时间
  Serial.println(time);
  // 等待一秒钟,以免发送大量的数据
  delay(1000);
}

语法:

unsigned long var = val;
</cdoe>
**参数:** \\
var:无符号长整型变量名称  \\
val:给变量所赋的值
 
===== short =====
**描述:** \\
short是一个16位的数据类型。 \\
所有Arduinos(基于ATMEGA和ARM)的short都是储存16(4字节)数据。它的取值范围在:-3276832767 (最小值为-2 ^15 和最大值为 (2 ^15-1)。 \\
**示例:**
<code c>
int ledPin = 13;

语法:

int var = val;  

参数:
var:变量名
val:赋给变量的值

float

描述:
'float'浮点型数据,就是有小数点的数字。浮点数经常被用来近似的模拟连续值,因为它们比整数有更大的精确度。浮点数的取值范围在3.4028235 E+38 ~ -3.4028235E +38。它被存储为32位(4字节)的信息。'float'只有6-7位有效数字。这指的是总位数,而不是小数点右边的数字。与其他平台不同的是,在那里你可以使用double型得到更精确的结果(如15位),在Arduino上,double型与float型的大小相同。浮点数字在有些情况下是不准确的,在数据大小比较时,可能会产生奇怪的结果。例如 6.0 / 3.0 可能不等于 2.0。你应该使两个数字之间的差额的绝对值小于一些小的数字,这样就可以近似的得到这两个数字相等这样的结果。浮点运算速度远远慢于执行整数运算,例如,如果这个循环有一个关键的计时功能,并需要以最快的速度运行,就应该避免浮点运算。程序员经常使用较长的程式把浮点运算转换成整数运算来提高速度。
示例:

float myfloat;
float sensorCalbrate = 1.117;

语法:

float var = val; 

参数:
var:float型变量名称
val:分配给该变量的值 示例代码:

int x;
int y;
float z;
x = 1;
y = x / 2;         // Y为0,因为整数不能容纳分数
z = (float)x / 2.0;   // Z为0.5(你必须使用2.0做除数,而不是2)

double

描述:
双精度浮点数。占用4个字节。目前的arduino上的double实现和float相同,精度并未提高。

如果你从其他地方得到的代码中包含了double类变量,最好检查一遍代码以确认其中的变量的精确度能否在arduino上达到。

string

描述:
文本字符串可以有两种表现形式。你可以使用字符串数据类型,或者你可以做一个字符串,由char类型的数组和空终止字符('\0')构成。本节描述了后一种方法,而字符串对象(String object)能让你拥有更多的功能,同时也消耗更多的内存资源。
示例:
以下所有字符串都是有效的声明。

char Str1[15];
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
char Str4[ ] = "arduino";
char Str5[8] = "arduino";
char Str6[15] = "arduino";

声明字符串的解释:
在Str1中 声明一个没有初始化的字符数组
在Str2中 声明一个字符数组(包括一个附加字符),编译器会自动添加所需的空字符
在Str3中 明确加入空字符
在Str4中 用引号分隔初始化的字符串常数,编译器将调整数组的大小,以适应字符串常量和终止空字符
在Str5中 初始化一个包括明确的尺寸和字符串常量的数组
在Str6中 初始化数组,预留额外的空间用于一个较大的字符串

空终止字符
一般来说,字符串的结尾有一个空终止字符(ASCII代码0)。以此让功能函数(例如Serial.pring())知道一个字符串的结束。否则,他们将从内存继续读取后续字节,而这些并不属于所需字符串的一部分。这意味着,你的字符串比你想要的文字包含更多个字符空间。这就是为什么Str2和Str5需要八个字符,即使“Arduino”只有七个字符 - 最后一个位置会自动填充空字符。str4将自动调整为八个字符,包括一个额外的空。在Str3的,我们自己已经明确地包含了空字符(写入'\ 0')。需要注意的是,字符串可能没有一个最后的空字符(例如在Str2中您已定义字符长度为7,而不是8)。这会破坏大部分使用字符串的功能,所以不要故意而为之。如果你注意到一些奇怪的现象(在字符串中操作字符),基本就是这个原因导致的了。

单引号?还是双引号?
定义字符串时使用双引号(例如“ABC”),而定义一个单独的字符时使用单引号(例如'A')

包装长字符串
你可以像这样打包长字符串: char myString[] = “This is the first line” ” this is the second line” ” etcetera”;

字符串数组
当你的应用包含大量的文字,如带有液晶显示屏的一个项目,建立一个字符串数组是非常便利的。因为字符串本身就是数组,它实际上是一个两维数组的典型。在下面的代码,”char*”在字符数据类型char后跟了一个星号'*'表示这是一个“指针”数组。所有的数组名实际上是指针,所以这需要一个数组的数组。指针对于C语言初学者而言是非常深奥的部分之一,但我们没有必要了解详细指针,就可以有效地应用它。
示例:

char* myStrings[]={
  "This is string 1", "This is string 2", "This is string 3",
  "This is string 4", "This is string 5","This is string 6"};
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  for (int i = 0; i < 6; i++){
    Serial.println(myStrings[i]);
    delay(500);
  }
}

String

描述:
String类,是0019版的核心的一部分,允许你实现比运用字符数组更复杂的文字操作。你可以连接字符串,增加字符串,寻找和替换子字符串以及其他操作。它比使用一个简单的字符数组需要更多的内存,但它更方便。
仅供参考,字符串数组都用小写的string表示而String类的实例通常用大写的String表示。注意,在“双引号”内指定的字符常量通常被作为字符数组,并非String类实例。

arrays

数组是一种可访问的变量的集合。Arduino的数组是基于C语言的,因此这会变得很复杂,但使用简单的数组是比较简单的。
创建(声明)一个数组
下面的方法都可以用来创建(声明)数组。

int myInts[6];
int myPins[] = {2, 4, 8, 3, 6};
int mySensVals[6] = {2, 4, -8, 3, 2};
char message[6] = "hello";

你声明一个未初始化数组,例如myPins。
在myPins中,我们声明了一个没有明确大小的数组。编译器将会计算元素的大小,并创建一个适当大小的数组。
当然,你也可以初始化数组的大小,例如在mySensVals中。请注意,当声明一个char类型的数组时,你初始化的大小必须大于元素的个数,以容纳所需的空字符。

访问数组
数组是从零开始索引的,也就说,上面所提到的数组初始化,数组第一个元素是为索引0, <coed c> mySensVals[0] == 2, mySensVals[1] == 4, and so forth. </code> 以此类推
这也意味着,在包含十个元素的数组中,索引九是最后一个元素。

int myArray[10]={9,3,2,4,3,2,7,8,9,11};
     // myArray[9]的数值为11
     // myArray[10],该索引是无效的,它将会是任意的随机信息(内存地址) 

出于这个原因,你在访问数组应该小心。若访问的数据超出数组的末尾(即索引数大于你声明的数组的大小- 1),则将从其他内存中读取数据。从这些地方读取的数据,除了产生无效的数据外,没有任何作用。向随机存储器中写入数据绝对是一个坏主意,通常会导致不愉快的结果,如导致系统崩溃或程序故障。要排查这样的错误是也是一件难事。 不同于Basic或JAVA,C语言编译器不会检查你访问的数组是否大于你声明的数组。

指定一个数组的值:

mySensVals[0] = 10;

从数组访问一个值:

x = mySensVals[4];

数组和循环:
数组往往在for循环中进行操作,循环计数器可用于访问每个数组元素。例如,将数组中的元素通过串口打印:

int i;
for (i = 0; i < 5; i = i + 1) {
  Serial.println(myPins[i]);
}