Falha na leitura de dados da célula de carga durante comunicação com Elipse E3

Olá, realizei uma programação do arduino para comunicar como Elipse E3 utilizando o protocolo Modbus RTU, porém, estou tendo problema para realizar a leitura dos dados da célula de carga e transferir para o elipse. Quero utilizar a célula de carga para medir nível mas os dados recebidos no Elipse E3 não condiz como os valores de gerados pela célula de carga. Estou utilizando os pino analógicos do Arduino Uno e o Módulo HX711.




//SENMETROL

/*

Serviço Nacional de Aprendizagem Industrial - SENAI DENDEZEIROS

Autor: Diego Campos

Equipe de Desenvolvedores: Diego Campos, Eduardo Rodrigues, Jailton Júnior, Washington Luís e Robson Rodrigues

Ano de desenvolvimento: 2024

SENMETROL - Medição e Controle de Nível C/ Célula de Carga e Arduino Integrado C/ ELIPESE E3 Via Protocolo ModBUS - RTU

*/

#include <HX711.h>

#include <modbus.h>

#include <modbusDevice.h>

#include <modbusRegBank.h>

#include <modbusSlave.h>

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

//Variáveis

float silo = 10;//determinar capacidade total do silo (kg) (50 = exemplo do simulador)

float nivel; //nível percentual do silo

float peso; //Indica valor atual do peso que está sendo monitorado

float valorc; //valor referência (celular 206g)

float conv = 0.00238; // Peso/Valorc (Simulador WokWi)

bool BV1; //Variavel para gravar valor do Botão que liga valvula 01

bool BV2; //Variavel para gravar valor do Botão que liga valvula 02

LiquidCrystal_I2C lcd(0x27,16,2);//Definição dos pinos LCD

HX711 scale;

modbusDevice regBank;

modbusSlave slave;

word AI1, AI0; //Pinos analógicos

void setup()

{

regBank.setId(1); //Set Slave ID, Endereço do arduino para comunicação MODBUS

//Add Digital Input registers

regBank.add(10002);

regBank.add(10003);

regBank.add(10004);

regBank.add(10005);

regBank.add(10006);

//Add Digital Output registers

regBank.add(7);

regBank.add(8);

regBank.add(9);

regBank.add(10);

regBank.add(11);

regBank.add(12);

//Analog Input registers

regBank.add(30001);

regBank.add(30002);

slave._device = &regBank;

slave.setBaud(9600); //Set BaudRate

pinMode(2, INPUT); //Chave Seletora Permissão do Sistema

pinMode(3, INPUT); //Botao Liga V1

pinMode(4, INPUT); //Desliga V1

pinMode(5, INPUT); //Botao Liga V2

pinMode(6, INPUT); //Botao Desliga V2

pinMode(7, OUTPUT); //LED Sistema

pinMode(8, OUTPUT); //LED V1

pinMode(9, OUTPUT); //LED V2

pinMode(10, OUTPUT); //V1

pinMode(11, OUTPUT); //V2

pinMode(12, OUTPUT); //SISTEMA ENERGIZADO

digitalWrite(7, HIGH);

digitalWrite(8, HIGH);

digitalWrite(9, HIGH);

digitalWrite(10, HIGH);

digitalWrite(11, HIGH);

digitalWrite(12, LOW); //Sistema Energizado

Serial.begin(9600);

lcd.init(); // Inicia o Display

lcd.backlight();

// Mensagem de Inicialização

lcd.setCursor(0,0);

lcd.print(“SENAIDENDEZEIROS”);

lcd.setCursor(1,1);

lcd.print(“AUTOMACAO IND”);

delay(5000);

lcd.clear();

lcd.setCursor(0,0);

lcd.print(“TURMA 85363”);

lcd.setCursor(0,1);

lcd.print(“TURNO MATUTINO”);

delay(5000);

lcd.clear();

lcd.setCursor(3,0);

lcd.print(“SENMETROL”);

lcd.setCursor(3,1);

lcd.print(“SENAI DEN”);

delay(5000);

lcd.clear();

scale.begin(AI0, AI1); //inicializando os pinos do HX711

scale.set_scale(); // Setando valor de calibração

}

void loop() {

// Chave Seletora: Quando em ON(1) Permite Operação do sistema e Led Run Liga

byte selet = digitalRead(2);

if (selet >= 1) {

digitalWrite(7, LOW);

regBank.set(10002, 1);

} else {

digitalWrite(7, HIGH);

regBank.set(10002, 0);

}

//Realiza a leitura do estado do botao e transmite para o Elipse

bool btligav1 = digitalRead(3);

if (btligav1 == HIGH) {regBank.set(10003, 1);}

if (btligav1 == LOW) {regBank.set(10003, 0);}

//Liga Válvula 01

if (btligav1 == HIGH && BV2 == 1 && selet >= 1) {

BV1 = 0;

digitalWrite(8, BV1);

digitalWrite(10, BV1);

regBank.set(8, 1);

regBank.set(10, 1);

}

//Realiza a leitura do estado do botao e transmite para o Elipse

bool btdesligav1 = digitalRead(4);

if (btdesligav1 == HIGH) {regBank.set(10004, 1);}

if (btdesligav1 == LOW) {regBank.set(10004, 0);}

//Desliga Válvula 01

if (btdesligav1 == HIGH) {

BV1 = 1;

digitalWrite(8, BV1);

digitalWrite(10, BV1);

regBank.set(8, 0);

regBank.set(10, 0);

}

//Realiza a leitura do estado do botao e transmite para o Elipse

bool btligav2 = digitalRead(5);

if (btligav2 == HIGH) {regBank.set(10005, 1);}

if (btligav2 == LOW) {regBank.set(10005, 0);}

//Liga Válvula 02

if (btligav2 == HIGH && BV1 == 1 && selet >= 1) {

BV2 = 0;

digitalWrite(9, BV2);

digitalWrite(11, BV2);

regBank.set(9, 1);

regBank.set(11, 1);

}

//Realiza a leitura do estado do botao e transmite para o Elipse

bool btdesligav2 = digitalRead(6);

if (btdesligav2 == HIGH) {regBank.set(10006, 1);}

if (btdesligav2 == LOW) {regBank.set(10006, 0);}

//Desliga Válvula 02

if (btdesligav2 == HIGH) {

BV2 = 1;

digitalWrite(9, BV2);

digitalWrite(11, BV2);

regBank.set(9, 0);

regBank.set(11, 0);

}

//Leitura dos pinos analógicos

AI0 = analogRead(0);//Realiza a leitura do valor do pino analógico

delay(10);

AI0 = analogRead(0);

regBank.set(30001, (word) AI0);//Grava o lido no registrador

delay(10);

AI1 = analogRead(1);

delay(10);

AI1 = analogRead(1);

regBank.set(30002, (word) AI1);

delay(10);

//Conversão do valores lidos no pino analógico para escala em Kilogramas e Nível Percentual

//Calculando e convertando valorc em peso (kg)

peso = AI1 * conv;

//Calculando nivel percentual através do peso (kg)

nivel = peso / silo * 100 ;

Serial.print("AI1: ");

Serial.print(AI1, 3);

Serial.println();

slave.run();

//Exibindo Nível e peso no display lcd

lcd.setCursor(0,0);

lcd.print("Nivel: ");

lcd.print(nivel);

lcd.print(" % ");

lcd.setCursor(0,1);

lcd.print("Peso: ");

lcd.print(peso);

lcd.print(" Kg ");

}