1.简单的类和对象

/*面向对象*/
class Led{
 public:
 Led(); //构造函数(对象建立时马上执行)
 ~Led(); //析构函数 (对象删除前马上执行)
 void on();
 void off();
};

Led::Led(){
  Serial.println("Led对象创建");
  pinMode(A2, OUTPUT);
}

Led::~Led(){
  Serial.println("Led对象已被删除了");
}

void Led::on(){
   Serial.println("Led点亮了");
  digitalWrite(A2, HIGH);  
}

void Led::off(){
  Serial.println("Led熄灭了");
  digitalWrite(A2, LOW);  
}

void setup() {
  Serial.begin(9600);
  Led myled;
  Serial.println("Hello, this is from Setup()");

  for (int i=0; i<3; i++)
  {
    myled.on();
    delay(1000);
    myled.off();
    delay(1000);
  }
  
}

void loop() {
   
}

1根线(正极)连接A2引脚,一根线(负极)连接GND,正极上再连接一个电阻防止led烧坏

16:46:26.050 -> Led对象创建
16:46:26.050 -> Hello, this is from Setup()
16:46:26.083 -> Led点亮了
16:46:27.035 -> Led熄灭了
16:46:28.057 -> Led点亮了
16:46:29.049 -> Led熄灭了
16:46:30.042 -> Led点亮了
16:46:31.030 -> Led熄灭了
16:46:32.053 -> Led对象已被删除了

2.多构造函数类
 

/*面向对象*/
class Led{
 public:
 Led(); //构造函数(对象建立时马上执行)
 Led(int userLedPin);
 ~Led(); //析构函数 (对象删除前马上执行)
 void on();
 void off();
 int ledPin = 16; //16是A2引脚
};

Led::Led(){
  Serial.println("Led对象创建");
  pinMode(16, OUTPUT);
}
Led::Led(int userLedPin){
  Serial.println("传参数的Led对象创建");
  ledPin = userLedPin;
  pinMode(ledPin, OUTPUT);
}
Led::~Led(){
  Serial.println("Led对象已被删除了");
}

void Led::on(){
   Serial.print(ledPin);
   Serial.println("引脚的Led点亮了" );
   
  digitalWrite(ledPin, HIGH);  
}

void Led::off(){
  Serial.print(ledPin);
  Serial.println("引脚的Led熄灭了");
  digitalWrite(ledPin, LOW);  
}

void setup() {
  Serial.begin(9600);
  Led myled;
  Led myled2(17); // 17是A3引脚
  Serial.println("Hello, this is from Setup()");

  for (int i=0; i<3; i++)
  {
    myled.on();
    myled2.on();
    delay(1000);
    myled.off();
    myled2.off();
    delay(1000);
  }
  
}

void loop() {
   
}

17:35:22.568 -> Led对象创建
17:35:22.568 -> 传参数的Led对象创建
17:35:22.615 -> Hello, this is from Setup()
17:35:22.615 -> 16引脚的Led点亮了
17:35:22.709 -> 17引脚的Led点亮了
17:35:23.618 -> 16引脚的Led熄灭了
17:35:23.618 -> 17引脚的Led熄灭了
17:35:24.618 -> 16引脚的Led点亮了
17:35:24.618 -> 17引脚的Led点亮了
17:35:25.640 -> 16引脚的Led熄灭了
17:35:25.640 -> 17引脚的Led熄灭了
17:35:26.619 -> 16引脚的Led点亮了
17:35:26.619 -> 17引脚的Led点亮了
17:35:27.633 -> 16引脚的Led熄灭了
17:35:27.633 -> 17引脚的Led熄灭了
17:35:28.616 -> Led对象已被删除了
17:35:28.616 -> Led对象已被删除了

3.类的封装

/*面向对象*/
class Led{
   public:
   Led(); //构造函数(对象建立时马上执行)
   Led(int userLedPin);
   ~Led(); //析构函数 (对象删除前马上执行)
   void on();
   void off();
  
   int getLedPin();
   void setLedPin(int userLedPin);
   private:
      int ledPin = 16; //16是A2引脚
};

Led::Led(){
  Serial.println("Led对象创建");
  pinMode(16, OUTPUT);
}
Led::Led(int userLedPin){
  Serial.println("传参数的Led对象创建");
  ledPin = userLedPin;
  pinMode(ledPin, OUTPUT);
}
Led::~Led(){
  Serial.println("Led对象已被删除了");
}

void Led::on(){
   Serial.print(ledPin);
   Serial.println("引脚的Led点亮了" );
   
  digitalWrite(ledPin, HIGH);  
}

void Led::off(){
  Serial.print(ledPin);
  Serial.println("引脚的Led熄灭了");
  digitalWrite(ledPin, LOW);  
}

int Led::getLedPin(){
  return ledPin;
}

void Led::setLedPin(int userLedPin){
  ledPin = userLedPin;
  pinMode(ledPin, OUTPUT);
}

void setup() {
  Serial.begin(9600);
  Led myled;
  myled.setLedPin(18); // 18是A4引脚
  int myLedPin = myled.getLedPin();
  Serial.print("int myLedPin = ");
  Serial.println(myLedPin);
  
  Led myled2(17); // 17是A3引脚

  int myLed2Pin = myled2.getLedPin();
  Serial.print("int myLed2Pin = ");
  Serial.println(myLed2Pin);
  
  Serial.println("Hello, this is from Setup()");

  for (int i=0; i<3; i++)
  {
    myled.on();
    myled2.on();
    delay(1000);
    myled.off();
    myled2.off();
    delay(1000);
  }
  
}

void loop() {
   
}


19:29:52.348 -> Led对象创建
19:29:52.348 -> int myLedPin = 18
19:29:52.382 -> 传参数的Led对象创建
19:29:52.415 -> int myLed2Pin = 17
19:29:52.415 -> Hello, this is from Setup()
19:29:52.448 -> 18引脚的Led点亮了
19:29:52.481 -> 17引脚的Led点亮了
19:29:53.431 -> 18引脚的Led熄灭了
19:29:53.431 -> 17引脚的Led熄灭了
19:29:54.445 -> 18引脚的Led点亮了
19:29:54.445 -> 17引脚的Led点亮了
19:29:55.428 -> 18引脚的Led熄灭了
19:29:55.428 -> 17引脚的Led熄灭了
19:29:56.445 -> 18引脚的Led点亮了
19:29:56.445 -> 17引脚的Led点亮了
19:29:57.431 -> 18引脚的Led熄灭了
19:29:57.431 -> 17引脚的Led熄灭了
19:29:58.453 -> Led对象已被删除了
19:29:58.453 -> Led对象已被删除了

4.h头文件和cpp文件
led.ino

# include "Led.h"

void setup() {
  Serial.begin(9600);
  Led myled;
  myled.setLedPin(18); // 18是A4引脚
  int myLedPin = myled.getLedPin();
  Serial.print("int myLedPin = ");
  Serial.println(myLedPin);
  
  Led myled2(17); // 17是A3引脚

  int myLed2Pin = myled2.getLedPin();
  Serial.print("int myLed2Pin = ");
  Serial.println(myLed2Pin);
  
  Serial.println("Hello, this is from Setup()");

  for (int i=0; i<3; i++)
  {
    myled.on();
    myled2.on();
    delay(1000);
    myled.off();
    myled2.off();
    delay(1000);
  }
  
}

void loop() {
   
}

Led.cpp

#include "Led.h"

Led::Led(){
  Serial.println("Led对象创建");
  pinMode(16, OUTPUT);
}
Led::Led(int userLedPin){
  Serial.println("传参数的Led对象创建");
  ledPin = userLedPin;
  pinMode(ledPin, OUTPUT);
}
Led::~Led(){
  Serial.println("Led对象已被删除了");
}

void Led::on(){
   Serial.print(ledPin);
   Serial.println("引脚的Led点亮了" );
   
  digitalWrite(ledPin, HIGH);  
}

void Led::off(){
  Serial.print(ledPin);
  Serial.println("引脚的Led熄灭了");
  digitalWrite(ledPin, LOW);  
}

int Led::getLedPin(){
  return ledPin;
}

void Led::setLedPin(int userLedPin){
  ledPin = userLedPin;
  pinMode(ledPin, OUTPUT);
}

Led.h

#ifndef _LED_H_   //如果没用定义(防止多次编译),如果是#ifdef如果用定义了
#define _LED_H_

#include<Arduino.h>
class Led{
   public:
   Led(); //构造函数(对象建立时马上执行)
   Led(int userLedPin);
   ~Led(); //析构函数 (对象删除前马上执行)
   void on();
   void off();
  
   int getLedPin();
   void setLedPin(int userLedPin);
   private:
   int ledPin = 16; //16是A2引脚
};

#endif

5.类的继承
led.ino

# include "Led.h"

PwmLed myPwmLed;

void setup() {
  Serial.begin(9600);
  myPwmLed.setLedPin(3); //D3引脚

  int myPwmLedPin = myPwmLed.getLedPin();
  Serial.print("int myPwmLedPin=") ;
  Serial.println(myPwmLedPin);
}

void loop() {
   for(int i = 0; i < 255; i++){
    myPwmLed.on(i);
    Serial.print("myPwmLed.getLedPin()=");
    Serial.println(myPwmLed.getLedPin());
    delay(10);
   }
//   myPwmLed.on() 错误写法,子类里面只有带参数的函数,必须加参数
}

Led.cpp

#include "Led.h"

Led::Led(){
  Serial.println("Led对象创建");
  pinMode(16, OUTPUT);
}
Led::Led(int userLedPin){
  Serial.println("传参数的Led对象创建");
  ledPin = userLedPin;
  pinMode(ledPin, OUTPUT);
}
Led::~Led(){
  Serial.println("Led对象已被删除了");
}

void Led::on(){
   Serial.print(ledPin);
   Serial.println("引脚的Led点亮了" );
   
  digitalWrite(ledPin, HIGH);  
}

void Led::off(){
  Serial.print(ledPin);
  Serial.println("引脚的Led熄灭了");
  digitalWrite(ledPin, LOW);  
}

int Led::getLedPin(){
  return ledPin;
}

void Led::setLedPin(int userLedPin){
  ledPin = userLedPin;
  pinMode(ledPin, OUTPUT);
}

void PwmLed::on(int userPwmVal){
  pwmVal = userPwmVal;
  analogWrite(getLedPin(), pwmVal);
}

int PwmLed::getPwmVal(){
  return pwmVal;
}

Led.h

#ifndef _LED_H_   //如果没用定义(防止多次编译),如果是#ifdef如果用定义了
#define _LED_H_

#include<Arduino.h>
class Led{
   public:
   Led(); //构造函数(对象建立时马上执行)
   Led(int userLedPin);
   ~Led(); //析构函数 (对象删除前马上执行)
   void on();
   void off();
  
   int getLedPin();
   void setLedPin(int userLedPin);
   private:
   int ledPin = 16; //16是A2引脚
};

/*继承父类*/
class PwmLed : public Led{
  public:
    void on(int userPwmVal);
    int getPwmVal();
  private:
    int pwmVal = 0;
};
#endif

16:36:56.688 -> myPwmLed.getLedPin()=3

6. 建立Arduino库

1.首先在Arduino\librarie新建一个文件夹比如yys_led

2.把.cpp和.h文件放入yys_led文件夹

C:\Users\yys53\Documents\Arduino\libraries\yys_led\Led.cpp

C:\Users\yys53\Documents\Arduino\libraries\yys_led\Led.h

3.在yys_led新建一个examples文件夹,

4.再examples新建一个文件夹比如yys_led

5.把.ino放进取,文件名必须和文件夹命一样

"C:\Users\yys53\Documents\Arduino\libraries\yys_led\examples\yys_led\yys_led.ino"

6.打开arduino,打开example,往下拉可以看到自己项目了

7.设置高亮关键字,再C:\Users\yys53\Documents\Arduino\libraries\yys_led下新建keywords.txt

C:\Users\yys53\Documents\Arduino\libraries\yys_led\keywords.txt

#######################################
# 数据类型/Datatypes (KEYWORD1)
#######################################

Led	KEYWORD1
PwmLed	KEYWORD1

#######################################
# 函数/Functions (KEYWORD2)
#######################################

on	KEYWORD2
off	KEYWORD2
getLedPin	KEYWORD2
setLedPin	KEYWORD2

#######################################
# 其它关键字测试演示
#######################################
testKEYWORD1	KEYWORD1
testKEYWORD2	KEYWORD2
testKEYWORD3	KEYWORD3

testLITERAL1	LITERAL1
testLITERAL2	LITERAL2

testRESERVED_WORD	RESERVED_WORD
testRESERVED_WORD_2	RESERVED_WORD_2
testDATA_TYPE	DATA_TYPE
testPREPROCESSOR	PREPROCESSOR