Bom dia a todos. Estou desenvolvendo uma aplicação para medir volume e vazão num trabalho em grupo na faculdade. Mas o fato de eu ser leigo em ambos não esta ajudando em nada kkkkkk(cada k é uma lágrima de desespero).A despeito de vários problemas que estamos encontrando o que gostaria de ajuda no momento é o fato do ScadaBr não estar atualizando periodicamente os valores. Tem uma hora que o mesmo congela. Desconfio que o culpado seja o delay(). Se for mesmo, tem alguma forma de substitui-ló?

Eis o código do Arduino.

//Adicionar vazão
//Arrumar a concatenação e pontuação
#include <SimpleModbusSlave.h>
#define trig 9 //Saída de Trigger
#define echo 8 //Entrada de Echo
#define buzz 13 //Pino do Buzz
//Definição das medidas do tanque
#define tank_a 20.65
#define tank_r 5.4
#define tank_R 6.9

//Definição das variáveis que passa comunicação para o ScadaBR
enum
{
VOLUME,
VAZAO,
HOLDING_REGS_SIZE
};

unsigned int holdingRegs[HOLDING_REGS_SIZE];

//Variáveis globais
volatile int flow_frequency;
volatile int flow_frequencyB;
unsigned int l_hora; // Litros p/Hora
unsigned int l_horaB; // Litros p/Hora segundo sensor
unsigned char flowmeter = 2;
unsigned char flowmeterB = 3;// numero do pino do arduino conectado a saida do segundo sensor
unsigned long currentTime;
unsigned cloopTime;
char tempo_h;
char tempo_l;
char distancia_cm;
/*char distancia_mm;*/
unsigned int periodo;
long int volume_ml;
void trigPulse(); // Função que gera o Pulso

float pulse;
float dist_cm;

void setup() {
// put your setup code here, to run once:

pinMode(trig, OUTPUT); // Pino de trigger sera saida digital
pinMode(echo, INPUT); // pino do echo sera entrada digital
pinMode(buzz,OUTPUT);
pinMode(flowmeter,INPUT);
digitalWrite(trig, LOW); //Saida inicia em nivel baixo

//Parametros de comuniação com o ScadaBR
modbus_configure(&Serial, 9600, SERIAL_8N1, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
modbus_update_comms(9600, SERIAL_8N1, 1);

Serial.begin(9600); //Inicia comunicação serial
attachInterrupt(0,flow,RISING); //Configura a interrupção externa pelo pino de entrada
attachInterrupt(1,flow,RISING);
sei();
currentTime = millis();
cloopTime = currentTime;
}

void loop() {
// put your main code here, to run repeatedly:
//Transferência dos valores trasmitidos pelo Arduíno
modbus_update();
holdingRegs[VAZAO] = analogRead(A0);
holdingRegs[VOLUME] = analogRead(A1);

trigPulse(); //Aciona o trigger do modulo ultrassonico

pulse = pulseIn(echo,HIGH); //Mede o tempo que o pulso echo fica em nivel alto

dist_cm = pulse/58.82; //Valor de distancia em centimetros

/*Se a distancia medida for menor que a altura do recipiente, faz o processo normal,
se for igual a altura do recipiente considera a caixa como vazia
e se for maior notifica erro no sensor*/
if((dist_cm > tank_a && dist_cm <= tank_a + 0.1) || (dist_cm < tank_a && dist_cm >= tank_a - 0.1) || (dist_cm == tank_a))
{

Serial.println(dist_cm);
Serial.println("A Caixa d'Agua esta vazia");
digitalWrite(buzz,HIGH); //Coloca o Buzzer em nível alto
tone(13,262,200); // Parametros do buzzer (pino,frequencia em Hz, duração)

//Serial.println("Testando");
}
else if((dist_cm > tank_a))
{
Serial.println(dist_cm);
Serial.println("Verificar a distancia do Sensor");

}
else
{
//Volume Tronco de Cone
volume_ml = ((3.14 *( tank_a - dist_cm))/3)*((pow(tank_r,2) + tank_r * tank_R + pow(tank_R,2)));
//Gambiarra!
volume_ml = volume_ml-16;
//Volume Cilindro
//volume_ml = 3.14 *(tank_r*tank_r)*(tank_a - dist_cm);
Serial.println("Mililitros: ");
Serial.println(volume_ml);
Serial.println(dist_cm);
//---> VAZÃO <----
currentTime = millis();
//A cada segundo, calcula e mostra na serial o valor litros por hora
if(currentTime >= (cloopTime+1000))
{
cloopTime = currentTime;
//Frequencia dos pulsos (Hz) = 7.5Q, Q é o fluxo em L/min. (Resulta em +/- #% de precisão
l_hora= (flow_frequency * 60 / 7.5); // (Frequencia dos pulsos * 60 min) /7.5q = Fluxo em L/hora
flow_frequency = 0; //Reinicia o contador
Serial.print(l_hora,DEC); //Envia pela porta serial o valor
Serial.println(" L/hora");
//Sensor B
cloopTime = currentTime;
l_horaB = (flow_frequencyB * 60);
flow_frequencyB = 0;
Serial.print(l_horaB,DEC);
Serial.println(" L/hora");

}
else
{
Serial.println("Verificar os sensores");
}
}

}
void trigPulse(){
digitalWrite(trig, HIGH); //Pulso de trigger em nivel alto
delay(3000); //duração de 10 micro segundos
digitalWrite(trig, LOW); // Pulso de trigger em nivel baixo
}
void flow() // Interrupção p/calculo dos litros por hora
{
flow_frequency++;
}

Exibições: 319

As respostas para este tópico estão encerradas.

Respostas a este tópico

Bom dia , 

Se quer aprender, sugiro que entenda o que cada linha do seu programa faz e insira um comentário ao lado de cada linha. A linha que não entender, nos informe.

Por exemplo, explique o que essa linha faz:

if((dist_cm > tank_a && dist_cm <= tank_a + 0.1) || (dist_cm < tank_a && dist_cm >= tank_a - 0.1) || (dist_cm == tank_a))

Se interessar, finalmente consegui criar um método para inserir código de Arduino nos Tópicos do Lab De Garagem :

  • Copie o código da IDE Arduino como "copiar como HTML" 
  • cole na janela  da direita em https://html-online.com/editor/
  • copie o código já  formatado (da janela esquerda) - select all e copy 
  • e cole no tópico do LabdeGaragem (usando a opção  - Editor de HTML) 
  • depois faça uns pequenos ajustes de formatação nos comentários

Entendido. Sou novo aqui, obrigado pelas sugestões. Vou dar uma melhorada na minha bagunça e voltar a responder

Rapaz, eu mesmo acabei me perdendo na bagunça. E eu criei ela. Vou me organizar com calma, levando as dicas em consideração e criar um novo tópico.

Obrigado.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço