为 OLED SSD1306 编写包装器

时间:2021-05-12 22:45:46

标签: c++ arduino

我现在正在努力学习 Arduino 的 C++。我正在尝试编写一个简单的包装器,以便我可以在我的项目中使用多个 OLED。这是我到目前为止所得到的:

class Screen
{
  private:
    Adafruit_SSD1306 display;
    unsigned long startTime = 0;

  public :
    Screen(){
       Adafruit_SSD1306 this->display(128, 64, &Wire, -1);
    }
    void init(){
        //Initialize the screen
        this->display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
        this->display.setTextSize(1);
        this->display.setTextColor(SSD1306_WHITE);
        this->display.clearDisplay();
        this->output(60,30,":)");
        this->display.display();
    }

    void output(int x, int y, String S){
      this->display.setCursor(x, y);
      this->display.print(S);
      Display.display();
    }
};


Screen screen();
void setup(){
  screen.init();
}

void loop(){}


错误是:

In file included from D:\project\escape\puzzle box\source\puzzle_box_v6\Puzzle_box_v6.ino:12:0:
sketch\Screen.h: In constructor 'Screen::Screen()':
Screen.h:12:25: error: expected unqualified-id before 'this'
        Adafruit_SSD1306 this->display(128, 64, &Wire, -1);
                         ^~~~
sketch\Screen.h: In member function 'void Screen::output(int, int, String)':
Screen.h:27:7: error: 'Display' was not declared in this scope
       Display.display();
       ^~~~~~~
sketch\Screen.h:27:7: note: suggested alternative: 'display'
       Display.display();
       ^~~~~~~
       display
D:\project\escape\puzzle box\source\puzzle_box_v6\Puzzle_box_v6.ino: In function 'void setup()':
Puzzle_box_v6:40:9: error: expected unqualified-id before '.' token
   Screen.init();
         ^
exit status 1
expected unqualified-id before 'this'

我将不胜感激任何建议。也许我的整个方法都是错误的。 如果没有,我能否具体解释一下如何生成对象并将其分配给另一个类的属性。

最后,如果有人还在阅读……我不知道我需要声明什么参数数据类型来传递 init() 的内存位置值。目前它是“0x36”硬编码,我想通过参数传递它。如果有人可以就此事提供建议,我也将不胜感激。

2 个答案:

答案 0 :(得分:3)

我不确定我是否理解您的意图,但我想您在编写代码时想初始化 display 成员

Adafruit_SSD1306 this->display(128, 64, &Wire, -1);

在构造函数中。问题是:这条线毫无意义。

要通过调用其构造函数来初始化成员,您应该使用成员初始化列表。 init 也应该是 Screen 的构造函数的一部分:

Screen() : display(123,64, &Wire, -1) {
    //Initialize the screen
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.clearDisplay();
    output(60,30,":)");
    display.display();
}

您不需要为成员添加 this-> 前缀。不确定 &Wire 是什么,因为它不是错误消息的一部分,我想它是在您没有发布的代码中声明的。

其他错误是 'Display' was not declared in this scope,因为没有 Display。如果要调用 display 成员的 Adafruit_SSD1306 方法,必须注意大小写:display.display();

Screen screen(); 是所谓的最烦人的解析。它声明了一个函数。如果你想声明一个 Screen 类型的对象,请改写:

 Screen screen;          // or ..
 Screen screen{};        // or...
 auto screen = Screen();

最后一个错误不在您发布的代码中。当您拥有正确的 Screen.init() 时,它会抱怨 screen.init();。不过,如上所述,初始化可能应该是构造 Screen 的一部分,您可以删除该方法和该调用。

答案 1 :(得分:2)

这一行:

Adafruit_SSD1306 this->display(128, 64, &Wire, -1);

不是有效的 C++。如果要初始化 display 对象中的 Screen 成员,可以执行以下操作:

this->display = Adafruit_SSD1306 (128, 64, &Wire, -1);

免责声明:我不知道 Adafruit_SSD1306 构造函数期望什么参数,因此上述内容可能需要稍作调整。

或者(更好),您可以在 display 的构造函数的初始化列表中初始化您的 Screen 成员,如@largest_prime 的回答中所述。如果您不想使用所有常量初始化 display,则在任何一种情况下都将任何必要的参数传递给 Screen 的构造函数。

此外,您不需要在所有地方都写上 this->。这是编译器假定的。

相关问题