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();
}
Tags:
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?
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por