Enviar mais de uma valor pelo monitor derial do Arduino

Estou tendo uma problema ao tentar adquirir dados para um cálculo.
Basicamente o código vai calcular o comprimento total de uma uma bobina a partir de três valores:
d1 = diâmetro interno
d2 = diâmetro externo
T = espessura
Código:

float d1 = 0, d2 = 0, T = 0, Lm = 0, Lt = 0;
int modo = 1, cont = 0;
const byte V [8] [3] =  {{0,0,0},
                         {0,0,1},
                         {0,1,0},
                         {0,1,1},
                         {1,0,0},
                         {1,0,1},
                         {1,1,0},
                         {1,1,1}};

const int tecla [4] [3] = {{1,2,3},
                           {4,5,6},
                           {7,8,9},
                           {10,0,11}};

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

void loop() {
  switch(modo){
    case 1:
    /* Modo 1: Armazena os dados da bobina
    d1: diâmetro interno
    d2: diâmetro externo
    Lm: comprimento que será feita a manutenção
    T = espessura da bobina */
      Serial.println("Digite o diâmetro interno:");
      while(cont == 0){
        if(Serial.available() > 0){
          d1 = Serial.parseFloat();
          cont = 1;
          }
      }
      Serial.println("Digite o diâmetro externo:");
      while(cont == 1){
        if(Serial.available() > 0){
          d2 = Serial.parseFloat();
          cont = 2;
          }
      }
      Serial.println("Digite a espessura:");
      while(cont == 2){        
        if(Serial.available() > 0){
          T = Serial.parseFloat();
          cont = 3;
          }
      }
      Serial.println("Digite comprimento da manutenção:");
      while(cont == 3){
        if(Serial.available() > 0){
          Lm = Serial.parseFloat();
          cont = 0;
          }
      }
      Lt = TamanhoTotal(d1, d2, T);
      Serial.println(d1);
      Serial.println(d2);
      Serial.println(T);
      break;
  }
  }

Inicialmente ele funciona, a primeira variável (d1) é armazenada normalmente, porém, ele pula a segunda (d2) e vai para a terceira, eu digito a terceira e envio e ele pula a quarta (Lm). E no fim das contas a única variável realmente armazenada é a primeira, todas as outras três ficam em 0.00 (print).
Sem título - Copia
Talvez isso seria um problema com esse parseFloat? Que estaria pegando sempre o primeiro valor válido do buffer? Ou seria com o Serial.available? Ou com algo que ainda não conheço?

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Ola',
este seu co'digo nao compila.

falta a funcao : TamanhoTotal()

Opa, esqueci pois fiz ela em outra aba.

float TamanhoTotal(float d1, float d2, float T){
  float pi = 3.1415926535897932384626433832795;
  float Lt = (pi/T)*(pow((d2/2), 2)-pow((d1/2), 2));
  return Lt;
  }

Essa é a função.

Ola,
De um exemplo de valores de D1, D2 e T e Lm

Como exemplo estou usando:
d1 = 0.5
d2 = 2
T = 0.002
Lm = 180

Como est'a definido no seu serial monitor em baixo: Aqui:
SerialMonitor1

Defina como " sem fim de linha" ou algo parecido com isto. Minha IDE est'a em ingles.

Está em NewLine
e o baud está em 9600

Defina como " sem fim de linha" ou algo parecido com isto. Minha IDE est'a em ingles.

Mudei a minha IDE para portugues e o que esta' escrito e': nenhum final de linha.
Use esta opcao e teste seu codigo.

We can talk in english if you want. I changed to "sem fim de linha" and the problem still going.
But i found a way to "resolve" using Serial.end().

Serial.begin(9600);
      Serial.println("Digite o diâmetro interno:");
      while(cont == 0){
        if(Serial.available() > 0){
          d1 = Serial.parseFloat();
          cont = 1;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Serial.println("Digite o diâmetro externo:");
      while(cont == 1){
        if(Serial.available() > 0){
          d2 = Serial.parseFloat();
          cont = 2;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Serial.println("Digite a espessura:");
      while(cont == 2){
        if(Serial.available() > 0){
          T = Serial.parseFloat();
          cont = 3;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Serial.println("Digite comprimento da manutenção:");
      while(cont == 3){
        if(Serial.available() > 0){
          Lm = Serial.parseFloat();
          cont = 0;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Lt = TamanhoTotal(d1, d2, T);
      Serial.println(d1);
      Serial.println(d2);
      Serial.println(T);
      Serial.println(Lm);
      Serial.println(Lt);
      break;

What i think is that the Serial.end() really clear the buffer. But i tried the Serial.flush function, it not works, so maybe theres nothing about the serial buffer?

Na area portugues, escreva em portugues.

Testei seu codigo aqui usando "nenhum final de linha." como opcao e funcionou como voce quer.

Ok. Eu mudei o monitor serial para sem fim de linha e o problema continua. Mas encontrei uma forma de "resolver" o problema usando a função Serial.end().

Serial.begin(9600);
      Serial.println("Digite o diâmetro interno:");
      while(cont == 0){
        if(Serial.available() > 0){
          d1 = Serial.parseFloat();
          cont = 1;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Serial.println("Digite o diâmetro externo:");
      while(cont == 1){
        if(Serial.available() > 0){
          d2 = Serial.parseFloat();
          cont = 2;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Serial.println("Digite a espessura:");
      while(cont == 2){
        if(Serial.available() > 0){
          T = Serial.parseFloat();
          cont = 3;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Serial.println("Digite comprimento da manutenção:");
      while(cont == 3){
        if(Serial.available() > 0){
          Lm = Serial.parseFloat();
          cont = 0;
          Serial.end();
          }
      }
      Serial.begin(9600);
      Lt = TamanhoTotal(d1, d2, T);
      Serial.println(d1);
      Serial.println(d2);
      Serial.println(T);
      Serial.println(Lm);
      Serial.println(Lt);
      break;

O que eu acho é que o Serial.end() realmente limpa o buffer. Mas eu tentei a função Serial.flush, e ela não funciona, então talvez não tenha nada a ver com o buffer do serial?

Eu tinha trocado errado, ainda estava em "Nova-linha", agora coloquei "Nenhum final-de-linha" e funcionou completamente. Muito obrigado!!
Mas qual seria a diferença entre essas duas opções?

A opcao com nova linha ou com retorno de carro colocam um ou 2 bytes de controle depois dos dados.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.