什么是Arduino?
Arduino 是一款开源的电子原型平台,它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家,Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等,只要你能想到的,Arduino 都能帮你实现。
如果你想了解更多关于 Arduino 的信息,你可以访问 Arduino 的官方网站,那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区,和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外,你还可以使用 Arduino 的在线编程工具,在云端编写代码并上传到你的开发板上。
Arduino 是一个不断发展和创新的平台,它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情,让你享受 Arduino 带来的创造力和乐趣
维基百科的定义
Arduino 是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司,同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售,也可以作为 DIY 套件购买。
Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。
Arduino 这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin(Arduin of Ivrea)命名,他是伊夫雷亚边疆伯爵,也是 1002 年至 1014 年期间的意大利国王。
Arduino 系列电路板的设计大多使用 Atmel AVR 单片机。这些电路板配有一组数字和模拟I/O引脚,可以连接各种扩展板或面包板(Shields 扩展版)和其他电路。这些电路板具有串行端口,包括某些型号上的通用串行总线(USB),也用于从个人电脑加载程序。
软件编程方面,通常使用C/C++程序语言,官方提供了一个Arduino IDE用开发。除了使用传统的编译工具链之外,Arduino 项目还提供了一个基于 Processing 语言项目的集成开发环境。另外,一些少儿编程教育软件提供了对 Arduino 的可视化编程。
七、Arduino指针运算符
是用于操作指针的符号,指针是一种特殊的变量,它可以存储另一个变量的地址。指针运算符有以下几种:
&(引用运算符):用于获取一个变量的地址,并赋值给一个指针。例如,如果x是一个变量,那么&x表示x的地址。
(解引用运算符):用于获取一个指针所指向的变量的值,并赋值给另一个变量。例如,如果p是一个指针,那么p表示p所指向的变量的值。
->(箭头运算符):用于访问一个指针所指向的结构体或类的成员。例如,如果p是一个指向结构体或类的指针,那么p->a表示p所指向的结构体或类的成员a。
[](下标运算符):用于访问一个数组或字符串的元素。例如,如果a是一个数组或字符串,那么a[i]表示a的第i个元素。实际上,a[i]等价于(a+i),即先将a作为一个指针加上i,然后解引用得到元素。
3、->(箭头运算符)
是一种用于访问结构体或类的成员的运算符。它的一般形式为:
指针变量->成员名
它的含义是:先通过指针变量找到它所指向的结构体或类的对象,然后再访问该对象的指定成员。它相当于以下形式:
(*指针变量).成员名
其中,*指针变量是一个结构体或类的对象,.是另一种访问成员的运算符。->运算符可以简化这种写法,使代码更简洁和易读。
->运算符的应用场景主要有以下几种:
1)当我们需要动态分配内存空间来存储结构体或类的对象时,我们通常使用指针来接收返回的地址,然后通过->运算符来访问对象的成员。例如:
//定义一个学生结构体
struct Student {
int id;
char name[20];
float score;
};
//在setup函数中动态分配内存空间,并赋值
void setup() {
//创建一个指向Student结构体的指针变量
Student* stu = (Student*)malloc(sizeof(Student));
//通过->运算符给对象赋值
stu->id = 1;
strcpy(stu->name, "Alice");
stu->score = 95.5;
//打印对象的信息
Serial.begin(9600);
Serial.print("ID: ");
Serial.println(stu->id);
Serial.print("Name: ");
Serial.println(stu->name);
Serial.print("Score: ");
Serial.println(stu->score);
}
void loop() {
}
2)当我们需要使用链表这种数据结构时,我们通常使用指针来连接每个节点,然后通过->运算符来访问节点的数据和下一个节点的地址。例如:
//定义一个链表节点结构体
struct Node {
int data; //节点存储的数据
Node* next; //节点指向的下一个节点的地址
};
//在setup函数中创建一个链表,并打印它
void setup() {
//创建三个节点,并赋值
Node* node1 = (Node*)malloc(sizeof(Node));
node1->data = 10;
Node* node2 = (Node*)malloc(sizeof(Node));
node2->data = 20;
Node* node3 = (Node*)malloc(sizeof(Node));
node3->data = 30;
//将三个节点连接起来,形成一个链表
node1->next = node2;
node2->next = node3;
node3->next = NULL; //链表的最后一个节点的next为NULL
//打印链表中每个节点的数据
Serial.begin(9600);
//创建一个临时指针变量,用于遍历链表
Node* temp = node1; //从第一个节点开始
while (temp != NULL) { //当temp不为NULL时,说明还有节点未遍历
Serial.println(temp->data); //打印当前节点的数据
temp = temp->next; //将temp指向下一个节点
}
}
void loop() {
}
3)当我们需要使用面向对象编程时,我们通常使用指针来创建类的对象,然后通过->运算符来访问对象的属性和方法。例如:
//定义一个LED类
class LED {
private:
int pin; //LED连接的引脚号
public:
//LED类的构造函数,用于初始化对象
LED(int p) {
pin = p; //将参数p赋值给pin
pinMode(pin, OUTPUT); //将pin设置为输出模式
digitalWrite(pin, LOW); //将pin输出低电平,关闭LED
}
//LED类的方法,用于打开LED
void turnOn() {
digitalWrite(pin, HIGH); //将pin输出高电平,打开LED
Serial.println("LED is on"); //打印信息到串口监视器
}
//LED类的方法,用于关闭LED
void turnOff() {
digitalWrite(pin, LOW); //将pin输出低电平,关闭LED
Serial.println("LED is off"); //打印信息到串口监视器
}
};
//在setup函数中创建一个LED类的对象,并使用它
void setup() {
//创建一个指向LED类的指针变量,并使用new运算符动态分配内存空间
//同时调用LED类的构造函数,传入参数13,表示LED连接到13号引脚
LED* led = new LED(13);
//打开串口通信,波特率为9600
Serial.begin(9600);
//通过->运算符调用对象的方法,打开LED
led->turnOn();
//延时1秒
delay(1000);
//通过->运算符调用对象的方法,关闭LED
led->turnOff();
}
void loop() {
}
->运算符的注意事项主要有以下几点:
1)->运算符只能用于指针变量,不能用于普通变量。如果要访问普通变量的成员,可以使用.运算符。
2)->运算符的优先级高于赋值运算符=,所以在给成员赋值时,不需要加括号。例如:stu->id = 1;正确,stu->(id) = 1;错误。
3)->运算符不能连续使用,如果要访问多层嵌套的成员,可以使用括号和*运算符。例如:(*stu->next)->id表示访问stu指向的下一个节点的id成员。
当在Arduino(C++)中使用箭头运算符->时,它通常被用于访问指针所指向的对象的成员。下面是三个实际运用程序案例,展示了->运算符的使用:
1)访问结构体指针的成员(Accessing members of a struct pointer):
struct Person {
string name;
int age;
};
void setup() {
Person* ptr = new Person;
ptr->name = "John";
ptr->age = 30;
cout << "Name: " << ptr->name << endl;
cout << "Age: " << ptr->age << endl;
delete ptr;
}
2)在上述示例中,我们定义了一个名为Person
的结构体,具有name
和age
两个成员变量。我们创建了一个指向Person
结构体的指针ptr
,然后使用箭头运算符->
来访问指针所指向的结构体对象的成员。
访问类指针的成员(Accessing members of a class pointer):
class MyClass {
private:
int value;
public:
void setValue(int val) {
value = val;
}
int getValue() {
return value;
}
};
void setup() {
MyClass* ptr = new MyClass;
ptr->setValue(42);
cout << "Value: " << ptr->getValue() << endl;
delete ptr;
}
在这个示例中,我们定义了一个名为MyClass
的类,具有私有成员变量value
和公共成员函数setValue
和getValue
。我们创建了一个指向MyClass
类的指针ptr
,然后使用箭头运算符->
来访问指针所指向的类对象的成员函数和成员变量。
3)访问类对象的动态分配成员(Accessing dynamically allocated members of a class object):
class MyClass {
private:
int* dynamicArray;
public:
MyClass() {
dynamicArray = new int[5];
}
~MyClass() {
delete[] dynamicArray;
}
int getValueAtIndex(int index) {
return dynamicArray[index];
}
};
void setup() {
MyClass obj;
obj.getValueAtIndex(2); // 直接访问对象的成员函数
MyClass* ptr = new MyClass;
ptr->getValueAtIndex(2); // 使用箭头运算符访问对象指针的成员函数
delete ptr;
}
在这个示例中,我们定义了一个名为MyClass
的类,具有一个动态分配的整数数组dynamicArray
。我们在类的构造函数中分配了内存,并在析构函数中释放内存。我们可以使用箭头运算符->
来访问指针所指向的类对象的成员函数和成员变量。
这些示例展示了箭头运算符->的实际应用。它可以用于访问指针所指向的对象的成员函数和成员变量,包括结构体、类和动态分配的对象等。通过箭头运算符,我们可以方便地操作和处理指针所指向的对象的成员。