Projeto de Dispenser
automático de fluídos.
De forma a buscar uma precisão maior em despejo de fluídos em recipientes e/ou automatizar como, por exemplo em uma linha de produção o enchimento de um vasilhame, os alunos Leonardo José Gembarowski e Rodolfo Kenji Iwamoto do curso de Engenharia Elétrica com ênfase em Telecomunicações da PUC-PR, com o auxílio do Professor Altair Olivo Santi do programa de aprendizagem Microprocessadores e Arquitetura de Computadores, desenvolveram um dispenser automático de fluídos, onde através de um teclado, o usuário digita o quanto em ml do fluído contido no reservatório irá dispensar no recipiente.
Figura
1: Comunicação entre os blocos de funcionamento.
O projeto consiste em capturar o valor fornecido pelo usuário através de um teclado matricial de 4 linhas por 4 colunas, o valor é mostrado de forma on-line no display, onde é mostrado no mesmo, o volume contido dentro do reservatório.
Após o usuário dar a entrada do valor, é verificado se o reservatório dispõem da quantidade solicitada, se não, é enviada uma mensagem dado a mensagem que a quantidade não é suficiente e então, pede para o usuário digitar outro valor válido, caso a quantidade solicitada esteja disponível, é aberta duas válvulas e, o display vai informando quanto do fluído já foi despejado. Quando o volume despejado estiver a 50ml de atingir o valor solicitado, uma válvula é fechada e então o enchimento é efetuado com apenas uma válvula para ter uma maior precisão no volume despejado. No momento em que é verificado que o volume despejado já corresponde o solicitado, a válvula é fechada e então, uma mensagem é mostrada no display dizendo que o despejo com completado e mostra o volume exato despejado.
Para evitar trasbordamentos no reservatório devido a alguma falha externa, como por exemplo, uma cisterna externa que enche o reservatório, é sempre verificado se o nível do reservatório está seguro, se ultrapassar este nível, é aberta uma terceira válvula com uma mangueira direcionadora para algum “ladrão” para que o fluído que transbordasse não viesse por ventura danificar algum componente externo.
Para alimentar as válvulas foi necessário uma placa de potência isolada, para proteger a parte de processamento, uma vez que as válvulas são acionadas em 127V.
As figuras abaixo mostram a interface utilizada para este acionamento e, também o esquema de ligação do pressostato (sensor de pressão), uma vez que as duas interfaces estão na mesma placa e, a mesma sendo confeccionada.
Figura
2: Esquemático da placa de interface.
Figura
3: Interface sendo confeccionada.
Os componentes utilizados para a interface foram:
-
1 Integrated Silicon Pressure Sensor On-Chip Signal Conditioned, Temperature
Compensated and Calibrated - MPVZ4006G
-
3 Triacs BT139
-
3 optoacopladores 4n25
-
3 resistores de 100Ω - 1/8W
-
4 resistores de 150Ω - 1/8W
-
3 resistored de 2k2Ω
-
2 capacitores de 20nF
-
1
capacitor de 1uF
-
1
capacitor de 1000uF
-
1
capacitor de 470nF
-
1
capacitor de 10nF
-
4 led´s
-
1 regulador de tensão 7805
-
1 transformador 12V+12V – 400mA
Figura 4 – protótipo
completo
Figura 5 – Local onde
é colocado o recipiente
Figura 6 – Interface inicial com o usuário
Figura 7 – Indicativo
de quanto foi despejado e abertura das válvulas
Figura8 – Indicativo que o reservatório está com o nível acima do limite
Figura 9 – Vávula
“ladrão” em funcionamento
Código fonte:
#include
<16F877A.h>
#device adc=10
#use delay(clock=11059200)
#byte portb=6
#ifndef
lcd_enable
#define lcd_rs pin_C0 //
pino rs do LCD
#define lcd_rw pin_C1 // pino rw do LCD
#define lcd_en pin_C2 // pino enable do
LCD
#define lcd_d0 pin_A1 // pino de dados d0 do LCD
#define lcd_d1 pin_A2 // pino de dados d1 do LCD
#define lcd_d2 pin_A3 // pino de dados d2 do LCD
#define lcd_d3 pin_A4 // pino de dados d3 do LCD
#define lcd_d4 pin_A5 // pino de dados d4 do LCD
#define lcd_d5 pin_E0 // pino de dados d5
do LCD
#define lcd_d6 pin_E1 // pino de dados d6
do LCD
#define lcd_d7 pin_E2 // pino de dados d7
do LCD
#define Enter 10
#endif
//---------------------------------------------------------------------------------------------------------------
long int z=0;
double valor1,cont,o;
//---------------------------------------------------------------------------------------------------------------
void lcd_envia( byte dado
)
{
output_low(lcd_rw);
output_high(lcd_rs);
output_bit(lcd_d0,bit_test(dado,0));
output_bit(lcd_d1,bit_test(dado,1));
output_bit(lcd_d2,bit_test(dado,2));
output_bit(lcd_d3,bit_test(dado,3));
output_bit(lcd_d4,bit_test(dado,4));
output_bit(lcd_d5,bit_test(dado,5));
output_bit(lcd_d6,bit_test(dado,6));
output_bit(lcd_d7,bit_test(dado,7));
output_high(lcd_en);
delay_us(300);
output_low(lcd_en);
delay_us(300);
}
//---------------------------------------------------------------------------------------------------------------
void lcd_envia_rs ( byte
dado)
{
output_low(lcd_rs);
output_low(lcd_rw);
output_bit(lcd_d0,bit_test(dado,0));
output_bit(lcd_d1,bit_test(dado,1));
output_bit(lcd_d2,bit_test(dado,2));
output_bit(lcd_d3,bit_test(dado,3));
output_bit(lcd_d4,bit_test(dado,4));
output_bit(lcd_d5,bit_test(dado,5));
output_bit(lcd_d6,bit_test(dado,6));
output_bit(lcd_d7,bit_test(dado,7));
output_high(lcd_en);
delay_ms(1);
output_low(lcd_en);
delay_ms(1);
}
//---------------------------------------------------------------------------------------------------------------
void lcd_numero (long int numero)
{
lcd_envia_rs(0x0c);
printf(lcd_envia, "Desejado: %ldml",numero);
}
//---------------------------------------------------------------------------------------------------------------
void lcd_tensao (double numero)
{
lcd_envia_rs(0x0c);
printf(lcd_envia, "Contendo: %1.0f ml",numero);
}
//---------------------------------------------------------------------------------------------------------------
void lcd_rest (double numero)
{
lcd_envia_rs(0x0c);
printf(lcd_envia, "Despejado:%1.0fml",numero);
}
//---------------------------------------------------------------------------------------------------------------
void recebe_valor()
{
int
x=0,l;
z=0;
while(x!=Enter)
{
output_low(pin_B0);
switch (portb)
{
case 222:
x=1;
l=1;
break;
case 190:
x=2;
l=1;
break;
case 126:
x=3;
l=1;
break;
}
output_high(pin_B0);
output_low(pin_B1);
switch (portb)
{
case 237:
x=98;
l=1;
break;
case 221:
x=4;
l=1;
break;
case 189:
x=5;
l=1;
break;
case 125:
x=6;
l=1;
break;
}
output_high(pin_B1);
output_low(pin_B2);
switch (portb)
{
case 235:
x=97;
l=1;
break;
case 219:
x=7;
l=1;
break;
case 187:
x=8;
l=1;
break;
case 123:
x=9;
l=1;
break;
}
output_high(pin_B2);
output_low(pin_B3);
switch (portb)
{
case 231:
x=97;
l=1;
break;
case 215:
x=11;
l=1;
break;
case 183:
x=0;
l=1;
break;
case 119:
x=10;
l=1;
break;
}
output_high(pin_B3);
if
(x!=10&&l==1&&x!=11)
{
z=(z*10);
z=(z+x);
l=0;
}
if
(x==11&&l==1)
{
z=(z/10);
l=0;
}
lcd_tensao(cont);
lcd_envia_rs(0xc0);
lcd_numero(z);
delay_ms(150);
lcd_envia_rs(0x01);
}
}
//---------------------------------------------------------------------------------------------------------------
void lcd_ini()
{
delay_ms(350);
output_low(lcd_rw);
output_low(lcd_rs);
lcd_envia_rs(0x30);
lcd_envia_rs(0x30);
lcd_envia_rs(0x30);
lcd_envia_rs(0x38);
lcd_envia_rs(0x01);
lcd_envia_rs(0x0c);
lcd_envia_rs(0x06);
}
//---------------------------------------------------------------------------------------------------------------
void teste_caixa()
{
if(cont>(4500))
{
while(cont>(4000))
{
output_high(pin_D2);
lcd_envia("Caixa saturada");
lcd_envia_rs(0xc0);
lcd_envia("esvaziando...");
delay_ms(250);
lcd_envia_rs(0x01);
valor1 = read_adc();
cont =
valor1 * 4 + ((int32)valor1 * 113)/128;
cont=cont-o;
cont=cont*4,043;
}
output_low(pin_D2);
}
}
//---------------------------------------------------------------------------------------------------------------
//****************************************************************************************************************
main()
{
double esp,x,y;
lcd_ini();
setup_ADC_ports(RA0_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
port_b_pullups(true);
lcd_envia("Eng. Eletrica");
lcd_envia_rs(0xc0);
lcd_envia("Telecom
PUC-PR");
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
lcd_envia_rs(0x01);
lcd_envia(" Disc.:
Micro.");
lcd_envia_rs(0xc0);
lcd_envia("Prof. Santin");
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
lcd_envia_rs(0x01);
lcd_envia(" Alunos: Leonardo");
lcd_envia_rs(0xc0);
lcd_envia("e Rodolfo
I.");
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
lcd_envia_rs(0x01);
lcd_envia(" Dispenser
auto- ");
lcd_envia_rs(0xc0);
lcd_envia("matico de fluido");
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
while
(true)
{
set_adc_channel(0);
valor1 = read_adc();
cont =
valor1 * 4 + ((int32)valor1 * 113)/128;
cont=cont-o;
cont=cont*4,043;
if(cont<0)
cont=0;
lcd_tensao(cont);
lcd_envia_rs(0xc0);
lcd_envia("Pressione F1");
delay_ms(250);
lcd_envia_rs(0x01);
teste_caixa();
output_low(pin_B0);
if(portb==238)
recebe_valor();
delay_ms(5);
output_high(pin_B0);
output_low(pin_B1);
if(portb==237)
o=cont;
delay_ms(5);
output_high(pin_B1);
if(z>cont)
{
lcd_envia_rs(0x01);
lcd_envia(" Valor desejado");
lcd_envia_rs(0xc0);
lcd_envia("maior do que o");
delay_ms(500);
delay_ms(500);
delay_ms(500);
lcd_envia_rs(0x01);
lcd_envia(" contido, digite");
lcd_envia_rs(0xc0);
lcd_envia("novamente...");
delay_ms(500);
delay_ms(500);
delay_ms(500);
z=0;
}
else
if(z>0)
{
x=cont;
y=0;
while(y<=z)
{
while(y<=(z-50))
{
output_high(pin_D0);
output_high(pin_D1);
valor1 = read_adc();
cont
= valor1 * 4 + ((int32)valor1 * 113)/128;
cont=cont-o;
cont=cont*4,043;
lcd_envia("Valvulas abertas");
lcd_envia_rs(0xc0);
y=x-cont;
lcd_rest(y);
delay_ms(250);
lcd_envia_rs(0x01);
}
while(y<=z)
{
output_high(pin_D0);
output_low(pin_D1);
valor1 = read_adc();
cont = valor1 * 4
+ ((int32)valor1 * 113)/128;
cont=cont-o;
cont=cont*4,043;
lcd_envia("Valvula aberta");
lcd_envia_rs(0xc0);
y=x-cont;
lcd_rest(y);
delay_ms(100);
lcd_envia_rs(0x01);
}
}
output_low(pin_D0);
output_low(pin_D1);
lcd_envia(" Volume desejado");
lcd_envia_rs(0xc0);
lcd_envia("foi dispensado");
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
lcd_envia_rs(0x01);
lcd_envia(" Volume
total");
lcd_envia_rs(0xc0);
lcd_rest(y);
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
lcd_envia_rs(0x01);
lcd_envia(" Retire o
");
lcd_envia_rs(0xc0);
lcd_envia("seu recipiente");
delay_ms(500);
delay_ms(500);
delay_ms(500);
delay_ms(500);
lcd_envia_rs(0x01);
z=0;
}
}
}
//*********************************************************************************************************************************