Ler dados seriais de pesagem de uma balança e exibir em um display 16x2

Pessoal, Bom dia a todos!

sou novo em arduino,porém tenho experiência em eletrônica.

Minha dificuldade è, extrair e apresentar em um display 16x2 apenas a informação de leitura de peso liquido que está neste protocolo serial RS232 descrito no manual da balança:

São transmitidos peso bruto, tara e líquido e indicativo de estabilidade de acordo com a tabela abaixo

 S , B B B . B B B , T T T . T T T , L L L . L L L CR LF

S: Flag de estabilidade e pode assumir os seguintes valores:

0: Peso estável;

1: Peso instável.

B: 7 bytes de peso bruto incluindo o ponto decimal e sinal de peso negativo;

T: 7 bytes de peso tara incluindo o ponto decimal e sinal de peso negativo;

L: 7 bytes de peso líquido incluindo o ponto decimal e sinal de peso negativo;

CR Carriage return (0X0D)

LF Line feed (0x0A)

       Total: 27 bytes

Exemplos de transmissão: Bruto=10,000kg, tara=0,200kg e líquido=9,800kg

                                  1 , 0 1 0 . 0 0 0 , 0 0 0 . 2 0 0 , 0 0 9 . 8 0 0 CR LF

## Meu Código está lendo a "frase" serial e extraindo a informação peso, porém o display só atualiza o valor da leitura do peso quando eu desconecto e reconecto o DB9 da porta da balança.

eu gostaria que o display atualizase em tempo real.

e depois gostaria que este valor se tronasse um numero real, pois pretendo fazer um comparador para realização de cortes para receitas. (estou apanhando do comando atoi para o tamanho do valor final.)

Estou utilizando o display keypad e um arduino uno.

 segue o código que estou batalhando. rsr:

Desde Já agradeço!!

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int led = 13;

int contacaractere = 0; //

long dadosint ;
long dadosintm ;
int qtdecarac = 28; //quantidade de caracteres
char matriz[28];//*******
String conteudo;
String conteudom;
long indicacao = 0;
String leitura;

void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
lcd.begin(16, 2);

lcd.print("Balanca serial");
lcd.setCursor(0, 1);
lcd.print("iniciando...");
}

/**
* Função que lê uma string da Serial
* e retorna-a
*/
String leStringSerial(){
conteudo = "";
char caractere;

while(Serial.available() > 0) {
// Lê byte da serial
caractere = Serial.read();

if (contacaractere <= qtdecarac){
if (caractere != '\n'){
// Ignora caractere de quebra de linha
contacaractere ++ ;

matriz[contacaractere]= caractere;

}}

delay(10);
}

Serial.print("Recebi: ");
Serial.print(conteudo);
Serial.print(" qtde carac. ");
Serial.print(contacaractere);
Serial.print(" matriz pos. ");

leitura = String(matriz[19]) + String(matriz[20]) + String(matriz[21]) + String(matriz[22]) + String(matriz[23]) + String(matriz[24]) + String(matriz[25]);
Serial.print(leitura);

contacaractere = 0;

return conteudo;
}

void loop() {

lcd.setCursor(9, 1);
lcd.print(leitura);
if(leitura != conteudom){
lcd.setCursor(0, 1);
lcd.print(" ");
conteudom = leitura;
}

if (Serial.available() > 0){
// Lê toda string recebida
String recebido = leStringSerial();




}

Exibições: 2262

Responder esta

Respostas a este tópico

Ta bom, vou tentar estou apanhando muito , hehe
Pelo que eu entendi, o leStringSerial() esta logo apos a chave que fecha o voidsetup.
Ta bom, obrigado!
Estou achando que deva haver com o controle que define o tamanho da frase serial, algo que tenha haver com CR "carriage retirn(0x0D)" e com o LF "line feed (0x0A) , que estão no final do protocolo da balança.
Ou será que não. ...
Porem eu não seu como fazer pra testar.
Sim, como su disse anteriormente, meu código lê perfeitamente, porém não atualiza, a menos que eu pare e continue a transmissão atravez de um botão na balança.
Obrigado Teodoro, valeu pela dica!!
Te retorno coforme os resultados.

Tudo bem Lucas?

Faz um tempinho que não apareço por aqui!!

Tenta o programa abaixo fiz mas não testei OK, mas acredito que tenha que arrumar alguma coisinha no LCD. 

Abs

Mauricio Ortega

//S,BBB.BBB,TTT.TTT,LLL.LLL

#include /font>LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define DEBUG  /// Habilita debug na serial
#define led 13

byte  Index = 0;                      //Indexador para o BufRX.
const int BUFFER_SIZE = 28;           //Tamanho do buffer serial.
unsigned char BufSerial[BUFFER_SIZE]; //Buffer para armazenar os dados recebidos da serial.
const int INTERVALO = 20;             //Tempo para receber os dados seriais
bool ChegouDados = false;

String flag, pesoBruto, tara, pesoLiquido;

void setup() {
 Serial.begin(9600);
 pinMode(led, OUTPUT), digitalWrite(led, LOW);

 lcd.begin(16, 2);
 lcd.print("# Balanca serial #");
 lcd.setCursor(0, 1);
 lcd.print("iniciando");

#ifdef DEBUG
 Serial.println("iniciando Balança");
#endif

 for (int i = 0; i /font> 7; i++) {
   lcd.setCursor((i + 1), 1);
   lcd.print("*");
   delay(100);
 }
 delay(1000);
 lcd.clear();
 Serial.println("Balança iniciada");
}

void loop() {

 if (ChegouDados)
 {
   ChegouDados = false;


#ifdef DEBUG
   Serial.println((char*)BufSerial);
#endif


   String streamData    = (char*)BufSerial;
   int commaIndex       = streamData.indexOf(',');
   int secondCommaIndex = streamData.indexOf(',', commaIndex + 1);
   int thirdCommaIndex  = streamData.indexOf(',', secondCommaIndex + 1);

   flag        = streamData.substring(0, commaIndex);
   pesoBruto   = streamData.substring(commaIndex + 1, secondCommaIndex);
   tara        = streamData.substring(secondCommaIndex + 1, thirdCommaIndex);
   pesoLiquido = streamData.substring(thirdCommaIndex + 1);


#ifdef DEBUG
   Serial.println(flag);
   Serial.println(pesoBruto);
   Serial.println(tara);
   Serial.println(pesoLiquido);
#endif


   if (flag == "1")// Verifica se Peso esta estável para imprimir no LCD
   {
     digitalWrite(led, HIGH);
   }
   else
   {
     digitalWrite(led, LOW);
   }
   lcd.setCursor(0, 1);
   lcd.print("Peso L = ");
   lcd.print(pesoLiquido);

   memset(BufSerial, 0, BUFFER_SIZE - 1); //Limpa o buffer.
 }///ChegouDados

}

void serialEvent()  // Trata interrupção de serial 
{
 while (Serial.available()) //Lê dados enquanto o buffer Serial tiver dados.
 {
   static unsigned long TempoAnterior = 0;          //Inicializa em 0ms.
   unsigned long TempoCorrente = millis();            //Retorna o tempo desde que o programa foi executado.

   //Timeout para limpar o BufRX e zerar o indexador (Index), quando (TempoCorrente - TempoAnterior) for maior que INTERVALO.
   if ( (TempoCorrente - TempoAnterior) > INTERVALO)  //Executa as instruções abaixo após se passarem 20ms sem //receber dados
   {
     //TempoAnterior = TempoCorrente;
     Index = 0;                             //Inicializa ixdexador do array.
     memset(BufSerial, 0, BUFFER_SIZE - 1); //Limpa o buffer.
   }

   unsigned char SerialByte = Serial.read(); // Guarda o byte do buffer serial;

   delay(2);

   switch (SerialByte)
   {
     case '\r':  //CR.
     case '\n':  //LF.

       if (Index == 0) //Se o primeiro byte for CR ou LF, despreza-os.
       {
         return;
       }
       Index = 0;           //Zera o indexador do buffer.
       ChegouDados = true;  //Avisa que chegou Dados na serial.
       break;

     default:
       if (Index /font> BUFFER_SIZE - 1) //Checa se há espaço no buffer.
       {
         BufSerial[Index++] = SerialByte; //Armazena o byte lido pela serial, no buffer.
         TempoAnterior = TempoCorrente;
       }
   }
 }
}

Mauricio Muito obrigado pelo teu interesse em me ajudar.
ao compilar na IDE arduino, está ocorrendo um erro na primeira linha:
#include /font>LiquidCrystal.h>
Isso devido ao parâmetro /font , pesquisei na biblioteca LiquidCrystal.h mas não encontrei a solução.
será que minha biblioteca não atende?

como funciona este /font ?

Tire está parte foi erro na digitação

Maurico, o /font também e usado em outras linhas do código, eu a apaguei e fiz algumas minimas correções, porem acredito que devido ao que apaguei o Arduíno não leu a porta serial.

Por alto,e pelo pouco que eu conheço de programação que este seu código será perfeito para o que eu preciso como ponto de partida.

você entendeu muito bem minha necessidade.

pesquisei e ví outros códigos utilizando o"font", mas não encontrei explicações nos forum's de arduino da mesma forma que você utilizou .

porém eu não entendi.

 

Estou almoçando na casa de minha mãe, mais tarde eu corrijo, me mande seu email e lhe mando direto

Mauricio, muito obrigado, desculpe o incomodo.
segue meu email.

lucas.cont.automacao@gmail.com

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço