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ávulaladrãoem 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;

         }

      }

 

}

//*********************************************************************************************************************************