// https://forum.arduino.cc/t/como-alterar-o-valor-de-uma-propriedade-instanciada/1247267

#include <LiquidCrystal_I2C.h>

#define botaoDoCachorro 4
#define botaoMais 7
#define botaoMenos 5
#define botaoEnter 6
#define ledSemCredito 10
#define ledTemCredito 9
#define motorComida 8

class Monitor {
  public:
    Monitor(String texto, byte linha = 0, byte coluna = 0);
    void inicio();
    void loop();
    void limparTela();
    void blink(int contarx);
    unsigned long tempoAgora;
    bool status = false;

  private:
    String _texto;
    byte _linha;
    byte _coluna;

};

LiquidCrystal_I2C lcd(0x27, 20, 4);
Monitor::Monitor(String texto, byte linha = 0, byte coluna = 0) {
  _texto = texto;
  _linha = linha;
  _coluna = coluna;
}

void Monitor::inicio() {
  lcd.begin(4, 20);
  lcd.init();
  lcd.backlight();
}

void Monitor::loop() {
  lcd.setCursor(_coluna, _linha);
  lcd.print(_texto);
}

void Monitor::limparTela() {
  lcd.clear();
}

//void Monitor::blink() {  // tem que estar dentro de um loop para funcionar!
 void Monitor::blink(int contarx) {
  byte tamanhoTexto = _texto.length();
  String vazio;
  for (int inicio = 1; inicio <= tamanhoTexto; inicio++) {
    vazio = vazio + " ";
  }
  if (status && millis() - tempoAgora > 200) {
    lcd.setCursor(_coluna, _linha);
    lcd.print(contarx);
    tempoAgora = millis();
    status = !status;
  } else if (!status && millis() - tempoAgora > 700) {
    lcd.setCursor(_coluna, _linha);
    lcd.print("                     ");
    tempoAgora = millis();
    status = !status;
  }
}

Monitor Teste("Irra!");
int contar = 0;
Monitor contador(String(contar), 2, 10); // Valor contar Recebe zero

bool lido;
void setup() {
  Serial.begin(115200);
  Teste.inicio();
  pinMode(botaoMais, INPUT_PULLUP);
  pinMode(botaoDoCachorro, INPUT_PULLUP);
  pinMode(ledTemCredito, OUTPUT);
}
unsigned long marcaHora;
Monitor mostrar(String(contar), 3, 0);
void loop() {

  lido = !digitalRead(botaoMais);
  if (lido) {
    marcaHora = millis();
    contar ++;
    while (true) {
      Monitor mostrar(String(contar), 3, 0); //Aqui o valor é alterado
      mostrar.loop(); //Aqui exibe o valor corretamente
      digitalWrite(ledTemCredito, HIGH);
      if (lido) {
        contar ++;
      }
      if (millis() - marcaHora > 1000) break;
      if (!digitalRead(botaoDoCachorro)) break;
    }
  }
  digitalWrite(ledTemCredito, LOW);
  mostrar.blink(contar); //Aqui o valor volta a ser zero
}