Boa tarde.
Estou desenvolvendo um projeto em grupo para faculdade que faz uso dos dois. Como não temos aula de nenhum estamos tendo problemas.
Eis o código abaixo. No Scada não esta atualizando os contadores. Tipo, os gráficos atualizam de 30 em 30 segundos, mesmo tendo colocado na criação que era para de ser de 5 em 5. Os gráficos estão estáticos. Ao invés de passar uma porta, posso passar uma variável para preencher os HOLDING? Se não puder, Então tenho como usar mais pinos para o Serial? O uno tem o A0 e A1, mas eu estou utilizando 3 sensores que totalizam 4 pinos para entrada de e saída de informações.
Grato desde já pela atenção.
//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++;
}