如何正确粘贴 Arduino IDE 中 #include 的代码?

How do you properly paste in code from an #include in Arduino IDE?

我有一个控制 RGB LED 灯条的简短程序。因为这个库太小了,我想把它放到一个文件中,这样就可以简单地 copied/pasted 到一个项目中。

除了一个单独的包含,它在直接复制到代码中时不起作用,一切正常。

我尝试直接复制并粘贴来自 #include "cRGB.h" 的代码,这恰好是一个简单的结构。定义 (struct cRGB { uint8_t g; uint8_t r; uint8_t b; };).

查看下面的完整代码。

据我了解,#include 只是 'copies' 将文件中的代码直接插入到文件中。如果是这样,为什么这段代码编译失败?

#include "cRGB.h"

class WS2812 {
public: 
  WS2812(uint16_t num_led);
  ~WS2812();
  
  void setOutput(uint8_t pin);
  
  cRGB get_crgb_at(uint16_t index);
  uint8_t set_crgb_at(uint16_t index, cRGB px_value);
  uint8_t set_subpixel_at(uint16_t index, uint8_t offset, uint8_t px_value);

  void sync();

private:
  uint16_t count_led;
  uint8_t *pixels;

  void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask,uint8_t *port, uint8_t *portreg);

  const volatile uint8_t *ws2812_port;
  volatile uint8_t *ws2812_port_reg;
  uint8_t pinMask; 
};



WS2812 LED(4); // 1 LED
  
cRGB value1;
cRGB value2;
cRGB value3;
cRGB value4;

void setup() {
  LED.setOutput(3); // Digital Pin 9
}

void loop() {
  value1.b = 0; value1.g = 255; value1.r = 255; // RGB Value
  LED.set_crgb_at(0, value1); // Set value at LED found at index 0
  LED.sync(); // Sends the value to the LED
  delay(500); // Wait 500 ms
}

错误如下:

/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `setup':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:39: undefined reference to `WS2812::setOutput(unsigned char)'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `loop':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:44: undefined reference to `WS2812::set_crgb_at(unsigned int, cRGB)'
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:45: undefined reference to `WS2812::sync()'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `_GLOBAL__sub_I_LED':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:31: undefined reference to `WS2812::WS2812(unsigned int)'
/var/folders/fr/vj8c52911yg97mycb0d8xjk00000gn/T//ccoFxRCe.ltrans0.ltrans.o: In function `_GLOBAL__sub_D_LED':
/Users/*/Documents/Arduino/fastLEDcompressed/fastLEDcompressed.ino:31: undefined reference to `WS2812::~WS2812()'
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino Uno.

代码在使用 #include 而不是直接在草图中编写时编译和运行得很好。

好像有很多function prototypes没有定义

例如

void setOutput(uint8_t pin);

这里setOutput被声明为WS2812的一个方法,但是这个函数没有在任何地方定义,好像你缺少指定所有这些函数的.cpp文件,你可以复制它们在文件末尾,它应该 运行 可以。