Duvida no código para exibir mensagens

Fiz esse código com a ideia de deixar um Arduino para exibir mensagens enviadas pela internet, recados e etc para quem estivesse em casa, algo como “grava tal programa”, “compra tal coisa”, ou colocar no meu quarto para os meus pais me deixarem uma mensagem enquanto fico trancado jogando no meu quarto. Até aí tudo bem, meu código funciona, por enquanto fiz usando o Serial, mas ele não atende há 2 demandas que eu tenho: guardar mais de uma mensagem (ele sempre vai exibir a última enviada pelo Serial) e se eu mandar uma mensagem de 46 caracteres, por exemplo, ele exibe apenas os últimos 14 caracteres. Se eu criar mais matrizes, como eu faria para, se a matriz mensagem1 estiver ocupada, passar a guardar em uma matriz mensagem2 e assim por diante? E depois de lida, começar a mostrar as mensagens anteriores? Qual seria a lógica? Tentei de algumas formas que não deram certo. Eu já tentei aumentar o tamanho da matriz mensagem1 para caber mais de 32 caracteres e resolver o 2º problema, mas ele continua imprimindo o que sobra.

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 45, 5, 6, 7);

int i;
int j;
int mensagem1[2][16];

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    delay(100);
    lcd.setCursor(0, 0);
    lcd.print(" Nova mensagem!");
    tone(49, 500, 50);
    delay(100);
    for (i = 0; i < 2; i++)
      for (j = 0; j < 16; j++)
        mensagem1[i][j] = Serial.read(); // a cada Serial.read, grava em uma posição na matriz
  }
  if (analogRead(A0) > 600 && analogRead(A0) < 700) { // botao Select
    lcd.clear();
    for (i = 0; i < 2; i++)
      for (j = 0; j < 16; j++)
      {
        if (mensagem1[i][j] == -1)
          mensagem1[i][j] = 32; // preenche o restante com " " (sem isso, o LCD imprime quadrados brancos)
        lcd.setCursor(j, i); // anda a posição do cursor para
        lcd.write(mensagem1[i][j]); // imprimir letra por letra
      }
    delay(5000); // exibe a mensagem durante 5 segundos até apagar
    lcd.clear();
  }
}

Se queres guardar mais do que a mensagem que esta no LCD, tens de arranjar um sitio para colocar essa dita mensagem… porque nao criar mais memoria para ela?

Devido a memoria finita do Arduino tens de impor um limite… como propoes mostrar 46 caracteres num espaco de 32?

Acho que precisas de estudar algo chamado de bounded buffer ou buffer para resolver o problema de mostrares varias mensagens.
O teu codigo so vai imprimir o que tu dizes para imprimir… neste caso e isto:

      for (j = 0; j < 16; j++)

Obrigado por responder. Me deram a ideia em um grupo no Facebook de criar uma matriz 3D, então a criação da matriz ficou assim:

int mensagem[9][2][16];

E para leitura ficou assim

mensagem[m][i][j]

Cada vez que chega uma nova entrada no Serial, o “m” aumenta de acordo com o Serial.available()

for (m = m; Serial.available() ; m++)

E quando eu aperto o botão para ler, o “m” diminui

if (analogRead(A0) > 600 && analogRead(A0) < 700) {
  m--;

Essas foram as modificações no código e ele funciona até 9 mensagens (porque imprimir “10 nova(s) msg(s)” não cabe em uma linha do LCD)

Agora, para exibir uma mensagem de mais de 32 caracteres acho que eu deveria aumentar o numero de linhas da matriz e a cada 2 linhas um delay().

int mensagem[9][6][16];

Aí sim

O teu codigo so vai imprimir o que tu dizes para imprimir

Vamos ver se funciona! Valeu

Não me parece que isto funcione, principalmente esta linha:

daneins: (...)

for (m = m; Serial.available() ; m++)

(...)

Qual é a ideia?

Não me parece que isto funcione, principalmente esta linha. Qual é a ideia?

O valor de “m” aumenta por um loop for e diminui quando eu aperto o botão, então o valor de “m” no loop tem sempre que receber o próprio valor de “m”, sem atribuição de valor. A condição é o Serial.available(), E funcionou!

Assim também funciona, incusive deixarei assim. Ficou m = m por que estava testando como fazer.

for (m; Serial.available() ; m++)

Aqui o código final, já alterei muita coisa. Agora dá para exibir uma mensagem de 4 linhas, exibindo 2 de cada vez. Se não tiver mais de 2 linhas, ele já sai. A tela fica acesa enquanto houver mensagens para ser exibidas, e apaga quando não tem mensagens

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 45, 5, 6, 7);

int i;
int j;
int m;
int mensagem[9][4][16];

void setup() {
  pinMode(43, OUTPUT);
  lcd.begin(16, 2);
  Serial.begin(9600);
  m = 0;
}

void loop() {
  while (m >= 0 && m <= 9) {
    guardaMensagem();
    exibeMensagem();
  }
  lcd.clear();
  if (m < 0)
  {
    lcd.clear();
    m = 0;
  }
  else
  {
    lcd.clear();
    lcd.print("9 nova(s) msg(s)");
    m = 9;
  }
}

void guardaMensagem() {
  if (Serial.available()) {
    pinMode(43, INPUT);
    lcd.setCursor(0, 0);
    lcd.print(m + 1);
    lcd.print(" nova(s) msg(s)");
    tone(49, 500, 50); delay(250); tone(49, 500, 50); delay(750); tone(49, 500, 50); delay(250); tone(49, 500, 50);
    delay(100);
    for (m; Serial.available() ; m++) {
      for (i = 0; i < 4; i++)
        for (j = 0; j < 16; j++)
          mensagem[m][i][j] = Serial.read();
    }
  }
}

void exibeMensagem() {
  if (analogRead(A0) > 600 && analogRead(A0) < 700) {
    lcd.clear();
    m--;
    for (i = 0; i < 2; i++) {
      for (j = 0; j < 16; j++)
      {
        if (mensagem[m][i][j] == -1)
          mensagem[m][i][j] = 32;
        lcd.setCursor(j, i);
        lcd.write(mensagem[m][i][j]);
      }
    }
    if (mensagem[m][2][0] != -1) {
      delay(5000);
      lcd.clear();
      for (i = 0; i < 2; i++) {
        for (j = 0; j < 16; j++)
        {
          if (mensagem[m][i + 2][j] == -1)
            mensagem[m][i + 2][j] = 32;
          lcd.setCursor(j, i);
          lcd.write(mensagem[m][i + 2][j]);
        }
      }
    }
    delay(5000);
    lcd.clear();
    if (m == 0)
    {
      lcd.clear();
      pinMode(43, OUTPUT);
    }
    else
    {
      lcd.clear();
      lcd.print(m);
      lcd.print(" nova(s) msg(s)");
    }
  }
}

Tudo bem, mas a mim não me parece lógico. Trabalha-se com 'm', ou trabalha-se com 'Serial.available()'? Talvez a melhor forma de fazer isso nem seja o ciclo 'for'.

Fiz uns testes usando o Serial.available() e cada caractere enviado pelo Serial aumenta um valor no Serial.available(), e cada Serial.read() tira um. Eu preciso usar o Serial.read() logo quando recebe uma mensagem, por que senão depois seria dificil saber até qual valor seria uma mensagem ou outra. Esse foi o código pra testar:

void setup() {
  Serial.begin(9600);

}

void loop() {
  if (Serial.available())
    Serial.println(Serial.available());
  delay(100);
  if (analogRead(A0) > 600 && analogRead(A0) < 700) {
    Serial.write(Serial.read());
    delay(100);
  }
}

A cada vez que eu aperto o botão, ele traz um caractere do que foi enviado pelo Serial.read(). O for serve para usar Serial.read enquanto houver Serial.available e armazenar na posição da matriz.