2

我想在 cpp 中为 arduino uno 创建一个在显示器上书写的课程。我正在使用 LiquidCrystal_I2C 库,但我无法在课堂上使用它。我知道如何在没有课程的情况下做到这一点,但现在我想建立一个课程,但我无法让它工作。

我的 .h 文件:

// WriteDisplay.h

#ifndef _WRITEDISPLAY_h
#define _WRITEDISPLAY_h

#if defined(ARDUINO) && ARDUINO >= 100
#include "arduino.h"
#else
    #include "WProgram.h"
#endif
#include <Wire/Wire.h>
#include <LiquidCrystal_I2C2004V1/LiquidCrystal_I2C.h>

class WriteDisplayClass
{
 public:
    WriteDisplayClass();
    void write(String text);
 private:
    LiquidCrystal_I2C lcd(0x27,20,4);
};

extern WriteDisplayClass WriteDisplay;

#endif

我的.cpp:

#include "WriteDisplay.h"

WriteDisplayClass::WriteDisplayClass()
{
    lcd.init();
    lcd.backlight();
    lcd.setCursor(0, 0);
}

WriteDisplayClass::write(String text)
{
    lcd.clear();
    lcd.print(text);
}


WriteDisplayClass WriteDisplay;

我的.ino:

#include "WriteDisplay.h"

WriteDisplayClass wdc;
void setup()
{
    wdc.write("Hello World");
}

void loop()
{
}

我将 AtmelStudio 与 Visual Micro 一起使用。当我只使用我的 .ino 文件时,我让它工作,但我不能在 cpp 中做同样的事情。我收到了无法找到 LiquidCrystal_I2C.h 之类的错误。我应该怎么做才能让它按照我想要的方式工作?或者甚至有可能吗?

感谢您的回答。

4

2 回答 2

0

对不起,我第一次看错了这个问题。

要在 Arduino 草图的 .cpp 文件中使用库,您还必须将它们包含在主 .ino 文件中。只有在 .ino 中找到它们才会被编译

您可以手动添加包含或使用“项目>添加/导入草图库”菜单项,它将为您将它们添加到 .ino。

于 2015-04-10T14:38:41.240 回答
0

基于this post here,您的代码问题与被实例化为全局的类有关。问题来了,编译器不保证全局变量处理的顺序,所以为了保证显示的对象在所有库对象之后最后执行,你必须在setup()函数中实例化它!

.ino 代码的解决方案是设置一个全局指针,然后在setup()函数内分配对象,如下所示:

#include "WriteDisplay.h"

WriteDisplayClass *wdc;

void setup()
{
    wdc = new WriteDisplayClass();
    wdc->write("Hello World");
}

void loop()
{
}
于 2021-10-19T07:37:58.447 回答