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
Tags:
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>" target="_blank">http://www.hobbytronics.co.uk/arduino-timer-interrupts>
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.
Pessoal...o dosador seria conforme o modelo do video acima.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por