Bom dia Pessoal!

Ainda estou engatinhando com as programações no Arduino.

Será que poderiam me auxiliar com a confecção de um código para realizar as funções abaixo:

Seria um dosador para três líquidos.

O Arduino teria que acionar três relés distintos em tempos diferentes.

Também teria um display que que mostraria os seguintes dizeres:

BOMBA 1 (do lado contaria os segundos que dosaria)

Em outra tela após a bomba 1 apareceria:

BOMBA 2 (do lado contaria os segundos que dosaria)

E assim por diante com a bomba 3.

Após a 3 voltaria para 1. Se alguém puder me ajudar.

Basicamente é um temporizador com display dizendo o que está fazendo.

Se alguém puder me ajudar ficaria muito grato.

Abraço

Exibições: 1681

Responder esta

Respostas a este tópico

Caro Renan, eu tentaria resolver por software o problema assim (pois o acionamento de cada relê me parece trivial, seja usando transístores pnp ou npn, ou mesmo um til 111 ou moc3021, etc.):

Use um temporizador para contar um tempo que é divisor comum dos três, digamos, tempoComum, i.e.

int tempoComum= 34286;  // Este valor depende do seu problema no caso digamos representando meio segundo

Use um vetor para estabelecer o limite de cada relê com referência ao tempo comum. Se

#define NUMRELES 3

// portas dos reles

int ligueRele[NUMRELES]={10,11,12};

int limiteDeCadaRele[NUMRELES]= {6,6,6};

Use outro vetor para o contador de tempo de cada relê, digamos

int contadorDeCadaRele[NUMRELES]={0,0,0};

E também um vetor de flags para saber que contador está ativado, por exemplo:

byte releAtivado[NUMRELES]={false,false,false};

Agora faça uma função para ativar a contagem de um relê, tipo:

void ativeRele(int rele)

 {

  if(rele < NUMRELES)

   {

     if(releAtivado[rele])

      return;           // caso já tenha ativado

     // desative interrupções

     noInterrupts();

     releAtivado[rele] = true;

     contadorDeCadaRele[rele]=0;

    // reative interrupçoes

     interrupts();

   }

 }

// Faça uma função para desativar relês

void desativeRele(int rele)

 {

  if(rele < NUMRELES)

   {

     if(!releAtivado[rele])

      return;           // caso o rele não esteja ativo

     // desative interrupções

     noInterrupts();

     releAtivado[rele] =false;

     contadorDeCadaRele[rele]=0;

    // reative interrupçoes

     interrupts();

   }

 }

// Agora use o codigo baixado em 6/11/2014, 16:35, do site a href="http://www.hobbytronics.co.uk/arduino-timer-interrupts&gt" target="_blank">http://www.hobbytronics.co.uk/arduino-timer-interrupts&gt;

modificando-o para contemplar seu problema

/*  Example Timer1 Interrupt Flash LED every second */ 

#define ledPin 13
int timer1_counter;
void setup()
{
int i;
for(i=0;i<NUMRELES; i++)
pinMode(ligueRele[i],OUTPUT);
//pinMode(ledPin, OUTPUT);
// initialize timer1
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
// Set timer1_counter to the correct value for our interrupt interval

//timer1_counter = 64886; // preload timer 65536-16MHz/256/100Hz

//timer1_counter = 64286; // preload timer 65536-16MHz/256/50Hz
//timer1_counter = 34286; // preload timer 65536-16MHz/256/2Hz

TCNT1 = tempoComun; // timer1_counter; // preload timer
TCCR1B |= (1 CS12); // 256 prescaler
TIMSK1 |= (1 TOIE1); // enable timer overflow interrupt
interrupts(); // enable all interrupts
}

// a rotina do serviço é modificada por mim assim:


ISR(TIMER1_OVF_vect) // interrupt service routine
{

int i;

TCNT1 = tempoComun; // timer1_counter; // preload timer
// digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
for(i=0;i<NUMRELES; i++)
if(releAtivado[i])
{
if(++contadorDeCadaRele[i] >=limiteDeCadaRele[i])
{
contadorDeCadaRele[i]=0;
digitalWrite(ligueRele[i],HIGH); // USANDO UM ACIONAMENTO EM ALTA
// Se tiver que desligar a bomba depois de uma certa contagem de tempo o código deve ser modificado
}
}
}


void loop() { // your program here... }

Finalmente, na minha sugestão acima não estou controlando o tempo que cada bomba dosaria mas a ativação de cada uma pelos relês.

S.M.J.

Obrigado,
Professor Almir

Boa tarde Prof Almir!

Estou meio confuso com tanta informação. rsrs

Mas será que o Sr. não pode me ajudar no código abaixo.

Estou fazendo código para aparecer no LCD. Fiz o loop conforme segue abaixo. Porém ele aparece no LCD Dosando Bomba 1 e o tempo tudo ok. Porém quando chega no 5 ele "zera" conforme tinha que zerar mas não vai para bomba 2 e sim bomba 1 novamente. Pode me ajudar no caso. 

void loop()
{

lcd.setCursor(0, 0);         //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
lcd.print("DOSANDO");    //Escreve no LCD "DOSANDO"
lcd.setCursor(0, 1);          //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD
lcd.print("BOMBA 1:");      //Escreve no LCD "Bomba 1:"
lcd.setCursor(13, 1);        //Posiciona o cursor na décima quarta coluna(13) e na segunda linha(1) do LCD
lcd.print(temp);               //Escreve o valor atual da variável de contagem no LCD
delay(1000);                  //Aguarda 1 segundo
temp++;                       //Incrementa variável de contagem

if(temp == 5) //Se a variável temp chegar em 5 segundos,...
{
lcd.clear();
temp = 0;
lcd.setCursor(0, 0);             //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
lcd.print("DOSANDO");       //Escreve no LCD "DOSANDO"
lcd.setCursor(0, 1);             //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD
lcd.print("BOMBA 2:");         //Escreve no LCD "BOMBA 2:"
lcd.setCursor(13, 1);           //Posiciona o cursor na décima quarta coluna(13) e na segunda linha(1) do LCD
lcd.print(temp);                 //Escreve o valor atual da variável de contagem no LCD
temp++;                         //Incrementa variável de contagem
}

Gostaria que quando acabasse a contagem da BOMBA 1, fosse para BOMBA 2.

//Caro Renan. O problema da não impressão da BOMBA2 está no fato de que após a impressão você zera temp e não //faz um delay. Aproveitando seu código eu faria assim:

int temp=0;
int bomba=1; // controle da bomba ativa

void loop()
{
lcd.clear();
lcd.setCursor(0, 0); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
lcd.print("DOSANDO"); //Escreve no LCD "DOSANDO"
lcd.setCursor(0, 1); //Posiciona o cursor na primeira coluna(0) e na segunda linha(1) do LCD
lcd.print("BOMBA "); //Escreve no LCD "Bomba "
lcd.print(bomba); //Imprime o número da bomba
lcd.print(":");
lcd.setCursor(13, 1); //Posiciona o cursor na décima quarta coluna(13) e na segunda linha(1) do LCD
lcd.print(temp); //Escreve o valor atual da variável de contagem no LCD
delay(1000); //Aguarda 1 segundo
temp++; //Incrementa variável de contagem

if(temp == 5) //Se a variável temp chegar em 5 segundos,...
{
temp = 0;
if(bomba==1)
bomba=2;
else
bomba=1;
}

S.M.J.

Obrigado.

Professor Almir

Pessoal...o dosador seria conforme o modelo do video acima. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço