在 arduino 上的类中使用LiquidCrystal_I2C

Use LiquidCrystal_I2C in a class on arduino

本文关键字:LiquidCrystal I2C arduino      更新时间:2023-10-16

我想在 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()
{
}

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

谢谢你的回答。

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

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

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

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

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

#include "WriteDisplay.h"
WriteDisplayClass *wdc;
void setup()
{
    wdc = new WriteDisplayClass();
    wdc->write("Hello World");
}
void loop()
{
}