Arduino面向对象编程基础

article/2025/9/22 23:21:08

面向对象编程基础

1.基础概论

在这里插入图片描述

面向对象三大特征:继承、封装、多态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.简单的类和对象

案例:创建Led类
案例01:感受构造函数与析构函数的功能

class Led {public :Led(); //构造函数声明,初始化对象,在创建对象的时候自动执行~Led();//析构函数。清除对象,在对象清除前自动执行
};
Led:: Led(){//构造函数
Serial.println("Led Object Created");
pinMode (2,OUTPUT);
}Led::~Led(){加粗样式Serial.println("Led Object Deleted");}
void setup() {Serial.begin(9600);Led myLed;//创建一个Led对象,与创建变量类似Serial.println("Hellow, this is function of setup");}void loop() {}

案例02:感受类的设计与应用

class Led {public : //公共:可以通过类创建对象,然后通过对象调用。
//  private : 私有,只能在类内部调用,不能通过对象调用。
//构造函数与析构函数,属于特殊函数,不能被对象调用,而是在对象创新与消失时自动执行。Led(); //声明构造函数,对象一旦创建就会调用构造函数~Led();//声明细析函数。在对象被删除前执行void on();//声明成员函数(功能函数),函数功能:点亮Led灯void off();//声明成员函数(功能函数),函数功能:熄灭Led灯};
Led:: Led() { //构造函数Serial.println("Led Object Created");pinMode (2, OUTPUT);
}Led::~Led() {Serial.println("Led Object Deleted");
}void Led:: on() {digitalWrite(2, HIGH);Serial.println("Led is on");
}
void Led:: off() {digitalWrite(2, LOW);Serial.println("Led is off");
}void setup() {Serial.begin(9600);Led myLed;//创建一个Led对象,与创建变量类似Serial.println("Hellow, this is function of setup");myLed.on();//调用Led类中的on函数delay(1000);myLed.off();//调用Led类中的off函数delay(1000);
}void loop() {}

案例03 多构造函数理解

class Led {public : //公共:可以通过类创建对象,然后通过对象调用。//  private : 私有,只能在类内部调用,不能通过对象调用。//构造函数与析构函数,属于特殊函数,不能被对象调用,而是在对象创新与消失时自动执行。Led(); //声明构造函数,对象一旦创建就会调用构造函数Led(int uesrLedPin);~Led();//声明细析函数。在对象被删除前执行void on();//声明成员函数(功能函数),函数功能:点亮Led灯void off();//声明成员函数(功能函数),函数功能:熄灭Led灯int ledPin = 2;//默认ledPin等于2,即创建对象没有参数输入时,默认控制2号引脚};
Led:: Led() { //构造函数Serial.println("Led Object Created");pinMode (ledPin, OUTPUT);
}
//Led::Led(int uesrLedPin):ledPin(uesrLedPin){//该语句表示参数传递,功能与ledPin = uesrLedPin相同
Led::Led(int uesrLedPin) {Serial.println("Led Object Created");ledPin = uesrLedPin;//参数传递pinMode(ledPin, OUTPUT);
}Led::~Led() {Serial.println("Led Object Deleted");
}void Led:: on() {digitalWrite( ledPin , HIGH);Serial.println("Led is on");
}
void Led:: off() {digitalWrite( ledPin , LOW);Serial.println("Led is off");
}void setup() {Serial.begin(9600);Led myLed;//创建一个Led对象,与创建变量类似Led myLed2(7);Serial.println("Hellow, this is function of setup");myLed.on();//调用Led类中的on函数myLed2.on();//调用Led类中的on函数delay(1000);myLed.off();//调用Led类中的off函数myLed2.off();delay(1000);
}void loop() {}

3.类的封装

将类的设计制与使用者分离,将类中重要的成员通过private 修饰封装起来,不允许对象随意调用,然后在类的共有成员内部设置get 函数和set函数,通过get函数和set函数访问private修饰的私有成员。然后再通过对象调用get和set函数来访问私有成员。
在这里插入图片描述

案例3.1封装后

class Led {public : //公共成员:可以通过类创建对象,然后通过对象调用。//  private : 私有,只能在类内部调用,不能通过对象调用。//构造函数与析构函数,属于特殊函数,不能被对象调用,而是在对象创新与消失时自动执行。Led(); //声明构造函数,对象一旦创建就会调用构造函数Led(int uesrLedPin);~Led();//声明细析函数。在对象被删除前执行void on();//声明成员函数(功能函数),函数功能:点亮Led灯void off();//声明成员函数(功能函数),函数功能:熄灭Led灯int getLedPin();//封装接口,通过该函数获得私有成员void setLedPin(int userLed);//封装接口,通过该函数修改私有成员private ://私有成员:只能在类内部调用int ledPin = 2;
};
Led:: Led() { //构造函数Serial.println("Led Object Created");pinMode (ledPin, OUTPUT);
}
//Led::Led(int uesrLedPin):ledPin(   ){//该语句表示参数传递,功能与ledPin = uesrLedPin相同
Led::Led(int uesrLedPin) {Serial.println("Led Object Created");ledPin = uesrLedPin;//参数传递pinMode(ledPin, OUTPUT);
}Led::~Led() {Serial.println("Led Object Deleted");
}void Led :: on() {digitalWrite( ledPin , HIGH);Serial.println("Led is on");
}
void Led :: off() {digitalWrite( ledPin , LOW);Serial.println("Led is off");
}
int Led :: getLedPin(){return ledPin;}void Led :: setLedPin(int userLedPin){ledPin = userLedPin;pinMode(ledPin,OUTPUT);}
void setup() {Serial.begin(9600);Led myLed;//创建一个Led对象,与创建变量类似myLed.setLedPin(3);//通过接口改变私有变量ledPinint myLedPin = myLed.getLedPin();//通过接口改变私有变量ledPinSerial.print("myLedPin=");Serial.println(myLedPin);/*int myLedPin2 = myLed.ledPin;tg */
}void loop() {}

4.类的分文件管理

4.1 新建 .h文件

在这里插入图片描述
在这里插入图片描述
输入Led.h,点击’'好“,然后Ctrl+S保存。Led.h文件保存类的声明部分。


/*存放类的声明*/
#ifndef _LED_H_  //理解为if not define ,即如果 _LED_H_没有被定义则执行下面的语句直到endif为止,用于保证类程序只被编译一次。
#define _LED_H_#include <Arduino.h>
class Led {public : //公共成员:可以通过类创建对象,然后通过对象调用。//  private : 私有,只能在类内部调用,不能通过对象调用。//构造函数与析构函数,属于特殊函数,不能被对象调用,而是在对象创新与消失时自动执行。Led(); //声明构造函数,对象一旦创建就会调用构造函数Led(int uesrLedPin);~Led();//声明细析函数。在对象被删除前执行void on();//声明成员函数(功能函数),函数功能:点亮Led灯void off();//声明成员函数(功能函数),函数功能:熄灭Led灯int getLedPin();void setLedPin(int userLed);private ://私有成员:只能在类内部调用int ledPin = 2;
};
#endif

#ifdef与#ifndef详解

#ifdef与#ifndef语句起始于#ifdef与#ifndef,终于#endif。

#define DEBUG
void setup() {Serial.begin(9600);
#ifdef DEBUG  // 可以理解为if define  
//如果DEBUG被宏定义了,则执行以下语句直到#endifSerial.println("DEBUG Defined");
#endif#ifndef DEBUG// 可以理解为if not define  
//如果DEBUG没有被宏定义了,则执行以下语句直到#endifSerial.println("DEBUG NOT Defined");
#endif
}
void loop() {
}

4.2 .cpp文件

重复上面步骤新建一个窗口
在这里插入图片描述
Led.cpp存放类的成员部分。

/*存放类的具体成员*/#include "Led.h"
Led:: Led() { //构造函数Serial.println("Led Object Created");pinMode (ledPin, OUTPUT);
}
//Led::Led(int uesrLedPin):ledPin(uesrLedPin){//该语句表示参数传递,功能与ledPin = uesrLedPin相同
Led::Led(int uesrLedPin) {Serial.println("Led Object Created");ledPin = uesrLedPin;//参数传递pinMode(ledPin, OUTPUT);
}Led::~Led() {Serial.println("Led Object Deleted");
}void Led :: on() {digitalWrite( ledPin , HIGH);Serial.println("Led is on");
}
void Led :: off() {digitalWrite( ledPin , LOW);Serial.println("Led is off");
}
int Led :: getLedPin(){return ledPin;}void Led :: setLedPin(int userLedPin){ledPin = userLedPin;pinMode(ledPin,OUTPUT);}

5 继承

类的声明 .h文件

/*存放类的声明*/
#ifndef _LED_H_  //理解为if not define ,即如果 _LED_H_没有被定义则执行下面的语句直到endif为止
#define _LED_H_#include <Arduino.h>
class Led {public : //公共成员:可以通过类创建对象,然后通过对象调用,可以被继承。//  private : 私有,只能在类内部调用,不能通过对象调用。//构造函数与析构函数,属于特殊函数,不能被对象调用,而是在对象创新与消失时自动执行。Led(); //声明构造函数,对象一旦创建就会调用构造函数Led(int uesrLedPin);~Led();//声明细析函数。在对象被删除前执行void on();//声明成员函数(功能函数),函数功能:点亮Led灯void off();//声明成员函数(功能函数),函数功能:熄灭Led灯int getLedPin();void setLedPin(int userLed);private :   //私有成员:只能在类内部调用,不能被继承int ledPin = 2;
};
/***************继承*************//public:可以被对象调用,可以继承,可以在类内部调用//protected:不能被对象调用,可以继承,可以在类内部调用//private:不能被对象调用,不能被继承,只能在类内部调用//class pwmLed :private :Led{//将父类公共成员继承来作为自己的私有成员//class pwmLed :protected :Led{//将父类公共成员继承来作为自己的半公共成员,可以被子类继承,但不能被对象调用。
****/
class pwmLed : public  Led { //将父类公共成员继承来作为自己的公共成员public:void on(int user_pwm_val);//函数重载:覆盖了父类的on()函数,on()函数将不能在子类中使用int get_pwm_val();//封装接口获取pwm的值private:int pwm_val = 0;};#endif

类成员。.cpp文件

/*存放类的具体成员*/#include "Led.h"
Led:: Led() { //构造函数Serial.println("Led Object Created");pinMode (ledPin, OUTPUT);
}
//Led::Led(int uesrLedPin):ledPin(uesrLedPin){//该语句表示参数传递,功能与ledPin = uesrLedPin相同
Led::Led(int uesrLedPin) {Serial.println("Led Object Created");ledPin = uesrLedPin;//参数传递pinMode(ledPin, OUTPUT);
}Led::~Led() {Serial.println("Led Object Deleted");
}void Led :: on() {digitalWrite( ledPin , HIGH);Serial.println("Led is on");
}
void Led :: off() {digitalWrite( ledPin , LOW);Serial.println("Led is off");
}
int Led :: getLedPin() {return ledPin;
}void Led :: setLedPin(int userLedPin) {ledPin = userLedPin;pinMode(ledPin, OUTPUT);
}void pwmLed:: on(int user_pwm_val) {pwm_val = user_pwm_val;analogWrite(getLedPin(), pwm_val);
}int pwmLed:: get_pwm_val() {return  pwm_val;
}

对象创建于应用

# include "Led.h"pwmLed myPwmLed;
void setup() {Serial.begin(9600);myPwmLed.setLedPin(3);int myPwmLedPin = myPwmLed.getLedPin();Serial.print("myPwmLedPin =");Serial.println(myPwmLedPin );}void loop() {for(int i=0;i<255;i++){myPwmLed.on(i);Serial.print("myPwmLed.get_pwm_val()in =");Serial.println(myPwmLed.get_pwm_val() ); delay(10);}}

6Arduino库的建立。

0.新建两个案例程序

1.arduino程序文件打开文件夹并新建example文件夹
在这里插入图片描述
2.在examples文件夹下新建与案例同名的文件夹并在文件夹下设计案例程序。在这里插入图片描述
在这里插入图片描述

3.新建关键字高亮文本文件txt并命名为keywords.txt并保存在库文件夹下

在这里插入图片描述

# 井号为注释,解释说明 
#class (KEYWORD1)   关键词1 即颜色1 高亮类名
Led	KEYWORD1
pwmLed	KEYWORD1#function and method (KEYWORD2) 关键词2 即颜色2 高亮类的成员(或方法)
on	KEYWORD2
off	KEYWORD2
getLedPin	KEYWORD2
setLedPin	KEYWORD2

4.压缩库文件为zip格式
在这里插入图片描述
在这里插入图片描述
5.重启arduino_IED,在项目中加载库,选择添加zip库,找到刚才的压缩文件直到IDE下方显示 :库已经添加,请检查”导入库“菜单
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
表示库文件添加成功
在这里插入图片描述


http://chatgpt.dhexx.cn/article/pSMGHOo4.shtml

相关文章

Arduino入门教程

Arduino是一款简单易学的开源电子原型平台&#xff0c;包含硬件&#xff08;各种型号的Arduino板&#xff09;和软件&#xff08;Arduino IDE&#xff09;。它通过各种各样的传感器来感知环境&#xff0c;再通过控制灯光、电机和其他的装置来完成很多自动控制任务&#xff0c;在…

Arduino学习篇,基础入门

什么是arduino? 简单来讲arduino就是通过源代码控制开发板的信号输入输出从而实现对一些电子元件的控制&#xff0c;例如LED灯&#xff0c;蜂鸣器&#xff0c;按键 arduino程序 首先来讲arduino程序是基于C语言&#xff0c;而实现类似对于LED灯和蜂鸣器的简单控制只需简单C语…

TCP 四次挥手,可以变成三次挥手吗?

作者&#xff1a;小林coding 计算机八股文网站&#xff1a;https://xiaolincoding.com 大家好&#xff0c;我是小林。 虽然我们在学习 TCP 挥手时&#xff0c;学到的是需要四次来完成 TCP 挥手&#xff0c;但是在一些情况下&#xff0c; TCP 四次挥手是可以变成 TCP 三次挥手的…

TCP的三次握手、四次挥手--非常详细讲解

本篇文章转自 TCP的三次握手(建立连接&#xff09;和四次挥手(关闭连接&#xff09;不过进行了一些编辑。 TCP(Transmission Control Protocol) 传输控制协议 1&#xff64;TCP三次握手和四次挥手的过程图 tcp的6种标志位的分别代表&#xff1a; SYN(synchronous建立联机) ACK…

两张动图-彻底明白TCP的三次握手与四次挥手

背景描述 通过上一篇中网络模型中的IP层的介绍&#xff0c;我们知道网络层&#xff0c;可以实现两个主机之间的通信。但是这并不具体&#xff0c;因为&#xff0c;真正进行通信的实体是在主机中的进程&#xff0c;是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。…

http——三次握手四次挥手

http htttp:TCP三次握手四次挥手&#xff08;TCP连接的释放&#xff09; htttp: 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消…

HTTP的三次握手和四次挥手

目录 1. HTTP的三次握手2. HTTP的四次挥手3. HTTPS的三次握手 1. HTTP的三次握手 三次握手&#xff08;Three-way Handshake&#xff09;其实就是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力…

我终于搞懂了TCP的三次握手和四次挥手(图片案例超详解)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

tcp四次挥手,为什么是四次?

上一篇博客说了三次握手为什么是是三次&#xff08;点这里&#xff09;&#xff0c;那么现在就介绍一下四次挥手。大家都知道TCP是全双工的&#xff0c;再建立连接时的三次握手中的SYN和ACK一起发送&#xff0c;这里就会有疑问&#xff0c;为什么在四次挥手的时候没有将SYN和AC…

TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

文章目录 前言TCP协议的介绍三次握手四次挥手 前言 主要介绍为什么TCP协议需要三次握手和四次挥手 TCP协议的介绍 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议. 面向连接&…

TCP四次挥手

第一次挥手&#xff1a; 主动断开方&#xff08;客户端&#xff0c;服务的都可以&#xff09;向对方发送一个FIN结束请求报文&#xff0c;并设置序列号和确认号&#xff0c;随后主动断开方进入FIN_WAIT1状态&#xff0c;这表示主动断开方已经没有业务数据要发给对方了&#xff…

TCP的三次握手与四次挥手详解

文章目录 TCP 协议简述TCP包首部TCP 三次握手建立连接TCP 四次挥手关闭连接常见面试题&#xff1a; TCP 协议简述 TCP 提供面向有连接的通信传输&#xff0c;面向有连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。TCP传输的是字节流 无论哪一方…

什么是“三次挥手”和“四次握手”

文章目录 一、为什么要进行三次握手二、握手为什么要三次三、挥手为什么需要三次四、挥手为什么三次不行总结 前言 首先&#xff0c;我们先说什么是”三次握手“和”四次挥手“ 1.我们先来简单介绍一下”三次握手“ &#xff08;1&#xff09;.先来介绍一下里面这些看起来比较…

简述TCP四次挥手

四次挥手主要用到了两个标志位(ACK&FIN): ACK 示意参考:TCP三次握手FIN: 终止数据传输标志位---->当FIN为1的时候代表此数据为终止断开连接的请求 四次挥手流程: 由于TCP连接是双向传输的对等的模式即双工 wiki百科定义: 全双工&#xff08;full-duplex&#xff09;的…

简述四次挥手

什么是四次挥手 由于TCP连接是全双工的,断开一个TCP连接,需要客户端与服务器发送四个包来确认连接的断开 简述四次挥手的过程: 因为TCP是全双工的,因此,每个方向都要单独关闭 当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着 一方向不会再…

三次握手四次挥手

三次握手四次挥手是tcp协议中的&#xff0c;在说三次握手四次挥手先说一下tcp协议和udp协议。 &#xff08;1&#xff09;我们常用的网络通信如浏览网页、软件聊天、看的爱奇艺上的视频都是通过tcp、udp这两种协议来进行数据传输的&#xff1b; &#xff08;2&#xff09;tcp…

TCP三次握手与四次挥手(详解)

TCP三次握手 一&#xff1a;引出 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西&#xff1b;由于TCP不存在连接的概念&#xff0c;只存在请求和响应&#xff0c;请求和响应都是数据包&#xff0c;它们之间都是经过由TCP创建的一个从客户端…

TCP连接的四次挥手全过程

TCP通过四次挥手来释放连接 四次挥手的过程如下&#xff1a; 第一次挥手&#xff1a; 客户端向服务器发送一个 FIN 数据包&#xff08;FIN 1&#xff0c;seq u&#xff09;主动断开连接&#xff0c;报文中会指定一个序列号。告诉服务器&#xff1a;我要跟你断开连接了&am…

http三次握手四次挥手详解

1、 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥…

TCP四次挥手及原因

聚散终有时&#xff0c;TCP 断开连接是通过四次挥手方式。 双方都可以主动断开连接&#xff0c;断开连接后主机中的「资源」将被释放。 上图是客户端主动关闭连接 &#xff1a; 一次挥手 客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&…