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: 221

Responder esta

Respostas a este tópico

Penso que sua função String leStringSerial() deveria estar fora do setup ?

tente declarar ela fora e verifica o comportamento.

Ta bom, vou tentar estou apanhando muito , hehe
Pelo que eu entendi, o leStringSerial() esta logo apos a chave que fecha o voidsetup.

esta correto agora coloquei o code na IDE. Estou tentando entender...

Ta bom, obrigado!

o retorno da sua função "conteudo" não usa em lugar nenhum

vc faz duas chamadas de Serial.available()

dá para enxugar esse código

vc precisa disso http://cleitonbueno.com/arduino-entendendo-e-usando-o-serialevent/

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.

quem envia está a 9600?

Serial.begin(9600);

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.
Lucas
Faça outro programa e pegue toda a mensagem e fique dando prints somente e observe o comportamento. Se funcionar dessa forma tem algum erro na sua lógica, caso contrário, tem mais algum detalhe a ser configurado.
Para esse teste não utilize LCD apenas prints
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;
       }
   }
 }
}

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço