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 = ®Bank;
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 ");
}