Como alterar o valor de uma propriedade instanciada

Amigos, estou não consigo alterar o valor da variável depois de instancia-la.

No código abaixo nas primeiras 73 linhas crio uma classe que usa a biblioteca LiquidCrystal_I2C para apresentar no monitor alguma mensagem.

Na linha 71 (Monitor contador(String(contar), 2, 10); // Valor contar Recebe zero) crio uma instância chamada contador que recebe zero, até ai sem problemas.

No entanto, quando jogo ela dentro de um loop o valor é acrescido todas as vezes que aperto um botão e me apresenta o valor, mas ao sair do loop o valor apresentado volta a ser zero.

Percebi que instanciei o objeto varias vezes, mas foi a forma que funcionou mais perto do jeito que eu queria.

#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();
		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!
	  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(_texto);
			tempoAgora = millis();
			status = !status;
	  }else if(!status && millis() - tempoAgora > 700){
			lcd.setCursor(_coluna, _linha);
			lcd.print(vazio);
			tempoAgora = millis();
			status = !status;
	  }
}

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

bool lido;
void setup() {
  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(); //Aqui o valor volta a ser zero
}

Pode explicar melhor o que voce deseja que aconteça quando executa a "função" blink()?

void Monitor::blink(){   // tem que estar dentro de um loop para funcionar!
	  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(_texto);
			tempoAgora = millis();
			status = !status;
	  }else if(!status && millis() - tempoAgora > 700){
			lcd.setCursor(_coluna, _linha);
			lcd.print(vazio);
			tempoAgora = millis();
			status = !status;
	  }
}

PS:
Fiz algumas alterações no seu code, veja se é o que voce precisa.

Simulado em: Instanciando - Wokwi ESP32, STM32, Arduino Simulator

Meu caro, obrigado pela resposta! Mas ainda não é o que preciso.
O Blink faz com que a escrita na tela pisque, que nem quando você está acertando a hora de um relógio de pulso. :slight_smile:
Então a ideia desse sketch é: Quando apertar o botaoMais, ele começa a piscar o zero. Toda vez que eu apertar, acrescenta um e continua piscando, até que eu aperte outro botão qualquer, nesse exemplo pode ser o botaoDoCachorro. Quando ele parar de piscar mostrará o valor da váriável contar atualizado

PS.: Sou iniciante mas gostei do simulador, vou ver se consigo aprender mais para facilitar perguntas no futuro.

Veja se agora faz mais sentido:

// 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
}
1 Like

Meu amigo, você mandou muito bem!
Que pessoas como você se multipliquem no mundo para torná-lo melhor.
Muito obrigado!