arduino的C++库文件编写笔记
蜂鸣器播放曲子的库文件
目的是实现在 arduino文件 music.ino 中可以自定义蜂鸣器的引脚int buzzer_pin = 3;
然后主函数直接调用一个函数就可以播放曲子,void loop() { birthday(); }
1.库文件的头文件.h
头文件中常出现的#ifndef #define #endif
用法如下
#ifndef <标识>
#define <标识>
......
......
#endif
作用
#ifndef起到的效果是防止一个源文件两次包含同一个头文件
头文件的内容都放在#ifndef和#endif中,这样被多个c文件调用时,就不会出现多次调用的问题
class类
class里面的量相当于c语言中的变量声明,函数声明。
把下面的内容命名为 music.h
#ifndef _MUSIC_H_
#define _MUSIC_H_
#include <Arduino.h>
class music
{
public: //public里定义的是 公共成员在类的外部是可访问的
//带参数的构造函数,用于接收music.ino文件中传过来的蜂鸣器引脚
music(char pin);
void birthday(void); //声明函数
void super_mario(void); //声明函数
void sing(int s); //声明带一个参数的函数
void buzz(int targetPin, long frequency, long length); //声明一个带多个参数的函数
private: //private里定义的是私有成员 在类的外部是不可访问的
char buzzer_pin;
};
#endif
2.C++文件
C++文件和头文件.h结合使用
将下面的内容命名为music.cpp
#include "music.h" //引入定义好的头文件
//::在这里为类作用域符号,这里music类里的成员music(char pin)
music::music(char pin) //这里调用了构造函数music
{
//构造函数music是public成员,所以这里可以直接调用私有变量private成员buzzer_pin
buzzer_pin = pin;
}
//调用music类中的函数birthday(void)
void music::birthday(void)
{
tone(buzzer_pin,294);
delay(250);
tone(buzzer_pin,440);
delay(250);
tone(buzzer_pin,392);
delay(250);
tone(buzzer_pin,532);
delay(250);
tone(buzzer_pin,494);
delay(500);
tone(buzzer_pin,392);
delay(250);
tone(buzzer_pin,440);
delay(250);
tone(buzzer_pin,392);
delay(250);
tone(buzzer_pin,587);
delay(250);
tone(buzzer_pin,532);
delay(500);
tone(buzzer_pin,392);
delay(250);
tone(buzzer_pin,784);
delay(250);
tone(buzzer_pin,659);
delay(250);
tone(buzzer_pin,532);
delay(250);
tone(buzzer_pin,494);
delay(250);
tone(buzzer_pin,440);
delay(250);
tone(buzzer_pin,698);
delay(375);
tone(buzzer_pin,659);
delay(250);
tone(buzzer_pin,532);
delay(250);
tone(buzzer_pin,587);
delay(250);
tone(buzzer_pin,532);
delay(500);
noTone(buzzer_pin);
}
3.arduino代码调用库文件
上面两步写好了 头文件music.h 和 cpp文件 music.cpp
现在写arduino文件 music.ino
arduino IDE中新建一个文件保存为music,将库文件music.h和music.cpp放到music文件夹下
代码:
//引入库函数头文件," "就是可以引入同文件夹下的库文件,如果库函数放到了arduino IDE的 library中,就要使用尖括号 #include <music.h>来进入头文件
#include "music.h"
// 蜂鸣器引脚
int buzzer_pin = 3;
//构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。
music Music(buzzer_pin); //实例化一个对象,这就把蜂鸣器引脚传给了构造函数
void setup() {
Serial.begin(9600);
}
void loop() {
Music.birthday(); //通过点符号 . 来调用music.cpp文件中的public里的函数birthday()
}
这就完成了一个简单的蜂鸣器播放生日快乐曲子的库文件