目录
数据类型
void
void只用在函数声明。声明的函数代表不具有返回值。
例子:
执行setup和loop两个函数时,没有返回值返回。
void setup() { // ... } void loop() { // ... }
boolean
一个boolean类型的变量包含有两个值,true或false。(每个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字节)数据。它的取值范围在:-32768 到 32767 (最小值为-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相同,精度并未提高。
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]); }