我如何创建一个Arduino库?

3

我需要一个关于Arduino库的简单示例。

我看了这个链接:https://www.arduino.cc/en/Hacking/LibraryTutorial

对我来说有点复杂,我更喜欢通过代码示例来理解。

我需要为Arduino构建一个库。在库中,我需要有两个函数,每个函数接收3个字符串值。然后函数需要将这些值连接成一个大字符串,并使用Serial.println(the new value);发送创建的值。

我只需要它来进行演示。所以,这些值对我来说并不重要。只是为了让我学习。我想以这种方式使用它。

className.Function1("val1", "val2", val3");
className.Function2("val1", "val2", val3");

这些文件应该使用什么扩展名(.h .cpp)?当然,我试着使用Arduino的库,但它们非常复杂。

如果有人有示例,我相信它将帮助我理解。

1个回答

6
如果你只想要几个函数,那么你不需要一个类,但是如果你想学习这种方法,我可以指导你正确的方向。
这里有一个简单的库,我们称之为LED
在这个例子中,我们将使用一个库来重新创建闪烁示例(包含在IDE中)。显然,这比示例使用更多的工作,但是比较这两个示例应该会让你更容易理解。

LED.h

#ifndef LED_h  //Prevents header contents from being added twice.
#define LED_h

class LED{
  public:
    void begin( char PinToUse );
    void on();
    void off();
  private:
    char pin;
};

#endif
中包含所谓的包含保护,这在这里进行了解释:为什么在C++头文件中使用#ifndef和#define?

LED.cpp

#include "Arduino.h"
#include "LED.h"

void LED::begin( char PinToUse ){  // LED:: indicates the function belongs to the LED class, and isn't a global function.
  pin = PinToUse;
  pinMode( pin, OUTPUT );
}

void LED::on(){
  digitalWrite( pin, HIGH );
}

void LED::off(){
  digitalWrite( pin, LOW );
}

在您的库中使用任何Arduino API时,需要包含Arduino.h。由于我在.cpp文件中使用了digitalWrite(),因此需要在此示例中包含它。如果您在头文件中使用API,则需要在那里包含它。

草图

#include <LED.h>

LED led;

void setup() {
  led.begin(13);
}

void loop() {
  led.on();
  delay(500);
  led.off();
  delay(500);
}

如您所见,该库被分为声明文件(.h)和定义文件(.cpp)。代码和.cpp文件都包含库头文件(.h)。

许多人在想要在自己的代码中使用SPI类等其他库时会遇到问题。不幸的是,IDE的设计方式要求代码还必须包括内部使用的库,无论代码是否直接使用它。这里有一个更详细的解释here

分享你的创作

一旦你的库完成,你可以在Arduino论坛上发布你的库。确保你有一些工作示例来增加人们尝试你的工作的机会。一个好的位置是这里:Other Software Development

如果你熟悉GitHub(Intro),你甚至可以直接将你的库添加到IDE库管理器中,这样人们只需点击安装即可使用它。访问1.5 Library specification以查看添加要求。

我不理解LED.h文件中的#ifndef Test_h、#define Test_h和#endif。 - Dany Maor
它们被称为包含保护,这里有一个很好的解释:https://dev59.com/EHI-5IYBdhLWcg3w0cOG - Chris A
1
对于这样一个简单的例子来说!+1 - xyz
@DanyMaor 这个回答是否提供了一个适合你理解水平的例子? - Chris A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接