Arduino C++:从外部创建对象 class
Arduino C++: Create object from foreign class
我使用以下代码将 LCD 显示器连接到我的 Arduino Mega 2560:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C myLCD(0x27, 20, 4);
void setup() {
myLCD.begin();
myLCD.backlight();
}
void loop() {
myLCD.clear();
myLCD.print("Hello");
delay(2000);
}
这工作正常,显示屏显示“Hello”。但是由于我需要某些自定义功能来显示,我想将它们全部移动到我创建的单独的“ldc”-class:
ldc.h
#ifndef Lcd_h
#define Lcd_h
#include "Arduino.h"
#include <LiquidCrystal_I2C.h>
class Lcd {
private:
unsigned int lcd_address = 0;
unsigned int rows = 0;
unsigned int columns = 0;
LiquidCrystal_I2C myLCD;
public:
// Construtor
Lcd();
void begin(unsigned int _columns, unsigned int _rows, unsigned int _lcd_address = 0x27);
void write();
};
#endif
lcd.cpp
#include "Lcd.h"
#include "Arduino.h"
#include <LiquidCrystal_I2C.h>
// Construtor
Lcd::Lcd() : myLCD(lcd_address, columns, rows) {
}
void Lcd::begin(unsigned int _columns, unsigned int _rows, unsigned int _lcd_address = 0x27) {
lcd_address = _lcd_address;
columns = _columns;
rows = _rows;
LiquidCrystal_I2C myLCD(lcd_address, columns, rows);
myLCD.begin();
myLCD.backlight();
}
void Lcd::write() {
myLCD.clear();
myLCD.print("hello");
Serial.println("I am here");
}
主文件
#include <LiquidCrystal_I2C.h>
#include "lcd.h"
Lcd thisLCD;
void setup() {
Serial.begin(9600);
thisLCD.begin(20, 4, 0x27);
}
void loop() {
thisLCD.write();
delay(2000);
}
代码编译没有错误。此外,我确实在串行监视器上看到“我在这里”,因此调用了 write() 函数。但是显示器什么也没有显示。
我怀疑我在构造函数上做错了什么:
Lcd::Lcd() : myLCD(lcd_address, columns, rows) {...
如果我将构造函数更改为
Lcd::Lcd() : myLCD() {...
我遇到编译错误:
lcd.cpp: In constructor 'Lcd::Lcd()':
lcd.cpp:9:20: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C()'
Lcd::Lcd() : myLCD() {
^
我做错了什么?构造函数有错误吗?还是其他原因?
在 begin() 方法中,您定义了一个与 class 字段同名的局部变量
LiquidCrystal_I2C myLCD(lcd_address, columns, rows);
在 begin() 方法结束时,该对象被销毁。 write()方法中的myLCD对象与begin()中的本地对象myLCD无关
在构造函数 Lcd() 中,也许您可以添加一些参数来传递地址、列和行。
由于 LiquidCrystal_I2C 没有在创建后更新这些字段的方法,这似乎是唯一的方法。
所以
// Construtor
Lcd::Lcd(int addr, int ncols, int nrows) : myLCD(addr, ncols, nrows) {
//...
}
我使用以下代码将 LCD 显示器连接到我的 Arduino Mega 2560:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C myLCD(0x27, 20, 4);
void setup() {
myLCD.begin();
myLCD.backlight();
}
void loop() {
myLCD.clear();
myLCD.print("Hello");
delay(2000);
}
这工作正常,显示屏显示“Hello”。但是由于我需要某些自定义功能来显示,我想将它们全部移动到我创建的单独的“ldc”-class:
ldc.h
#ifndef Lcd_h
#define Lcd_h
#include "Arduino.h"
#include <LiquidCrystal_I2C.h>
class Lcd {
private:
unsigned int lcd_address = 0;
unsigned int rows = 0;
unsigned int columns = 0;
LiquidCrystal_I2C myLCD;
public:
// Construtor
Lcd();
void begin(unsigned int _columns, unsigned int _rows, unsigned int _lcd_address = 0x27);
void write();
};
#endif
lcd.cpp
#include "Lcd.h"
#include "Arduino.h"
#include <LiquidCrystal_I2C.h>
// Construtor
Lcd::Lcd() : myLCD(lcd_address, columns, rows) {
}
void Lcd::begin(unsigned int _columns, unsigned int _rows, unsigned int _lcd_address = 0x27) {
lcd_address = _lcd_address;
columns = _columns;
rows = _rows;
LiquidCrystal_I2C myLCD(lcd_address, columns, rows);
myLCD.begin();
myLCD.backlight();
}
void Lcd::write() {
myLCD.clear();
myLCD.print("hello");
Serial.println("I am here");
}
主文件
#include <LiquidCrystal_I2C.h>
#include "lcd.h"
Lcd thisLCD;
void setup() {
Serial.begin(9600);
thisLCD.begin(20, 4, 0x27);
}
void loop() {
thisLCD.write();
delay(2000);
}
代码编译没有错误。此外,我确实在串行监视器上看到“我在这里”,因此调用了 write() 函数。但是显示器什么也没有显示。
我怀疑我在构造函数上做错了什么:
Lcd::Lcd() : myLCD(lcd_address, columns, rows) {...
如果我将构造函数更改为
Lcd::Lcd() : myLCD() {...
我遇到编译错误:
lcd.cpp: In constructor 'Lcd::Lcd()':
lcd.cpp:9:20: error: no matching function for call to 'LiquidCrystal_I2C::LiquidCrystal_I2C()'
Lcd::Lcd() : myLCD() {
^
我做错了什么?构造函数有错误吗?还是其他原因?
在 begin() 方法中,您定义了一个与 class 字段同名的局部变量
LiquidCrystal_I2C myLCD(lcd_address, columns, rows);
在 begin() 方法结束时,该对象被销毁。 write()方法中的myLCD对象与begin()中的本地对象myLCD无关
在构造函数 Lcd() 中,也许您可以添加一些参数来传递地址、列和行。
由于 LiquidCrystal_I2C 没有在创建后更新这些字段的方法,这似乎是唯一的方法。
所以
// Construtor
Lcd::Lcd(int addr, int ncols, int nrows) : myLCD(addr, ncols, nrows) {
//...
}