Go Down

Topic: Ajuda com programa para assionamento de cofre!!! (Read 2142 times) previous topic - next topic

felipevbastos

Ola pessoal, meu nome é Felipe, sou novo aqui e comecei com a arduino a uma semana. To precisando de um programa que para a maioria de vocês é molesa, mas para mim ainda esta complicado.
Preciso que funcione da seguinte forma: preciono um botão, o tempo em que ele fique precionado (exemplo 30 segundos), seja armazenado e acione um rele por esses 30 segundos de 8 em 8h. Caso apos uma semana eu precione esse botão por 20s ele ira acionar o rele a cada 8h por 20s. Ou seja, o botão serve para programar o tempo em que o rele ficara acionado.

Espero que eu tenha sido claro, e desde já agradeço.

Felipe Bastos

Nodeps

Felipe,

Também sou noob, mas esse seu circuito não me parece tão simples assim
Pelo linha que segui ... envolve um relogio rtc , rele  e gravacao de variavel em eprom,Não sei oque voce ja começou a fazer, mas minha dica é começar pelas partes e depois juntar tudo.

Tipo faça um circuito de rtc(tem varios exemplos no http://arduino.cc/playground)  para acionar um led de 8 em 8h por 10s  (aqui ja vai gastar um tempinho hehe), construa o circuito de rele para ser acionado pelo pinos do led , depois conte o tempo que o botao fica acionado e guarde em variavel ...substitua o tempo do acionamento pela var e se quiser "lembrar" qual o tempo que foi pressionado, guarde em eeprom.

Espero ter ajudado,

Abraço e boa sorte.





felipevbastos


Felipe,

Também sou noob, mas esse seu circuito não me parece tão simples assim
Pelo linha que segui ... envolve um relogio rtc , rele  e gravacao de variavel em eprom,Não sei oque voce ja começou a fazer, mas minha dica é começar pelas partes e depois juntar tudo.

Tipo faça um circuito de rtc(tem varios exemplos no http://arduino.cc/playground)  para acionar um led de 8 em 8h por 10s  (aqui ja vai gastar um tempinho hehe), construa o circuito de rele para ser acionado pelo pinos do led , depois conte o tempo que o botao fica acionado e guarde em variavel ...substitua o tempo do acionamento pela var e se quiser "lembrar" qual o tempo que foi pressionado, guarde em eeprom.

Espero ter ajudado,

Abraço e boa sorte.






Para simplificar, ao invez do relogio eu posso utilizar o delay de 8h - a variavel (tempo que o rele ficara acionado), assim não vai perder o horario. Quanto ao rele, eu comprei aquele modulo pronto. Ja fiz o sistema funcionar com um potenciometro e com o led (simular o rele). O potenciometro regula o tempo em que o led fica acionado. Mas eu queria fazer isso com um botão, pois com o potenciometro, qualquer esbarrada nele, ja vai alterar o tempo em que o rele ficara acionado.

bubulindo

Para teres uma ideia da magnitude das coisas... um delay de 8 horas tem 8 * 60 * 60 = 28800 segundos. Ou seja, cerca de 29 milhões de mili segundos.

Um arduino a correr a 16MHz executa cada operação (não é relacionado com o código em C e muito menos do Arduino) a cada 1,3 micro segundos.
Logo, guardar 8 horas com os temporizadores internos do Arduino não é de todo fácil, nem tão pouco será preciso.

Então, vais mesmo precisar dum RTC para fazer algo decente. A beleza é que grande parte dos RTCs já trazem memória, logo não vais precisar de escrever na EEPROM. Se bem que também podes fazê-lo.

Então para medires os segundos que o relé vai estar accionado, podes usar o RTC, ou podes usar a função millis(). Tudo depende se a temporização vai estar em segundos ou em mili-segundos. Se for sempre em segundos, o RTC é melhor.

This... is a hobby.

felipevbastos


Para teres uma ideia da magnitude das coisas... um delay de 8 horas tem 8 * 60 * 60 = 28800 segundos. Ou seja, cerca de 29 milhões de mili segundos.

Um arduino a correr a 16MHz executa cada operação (não é relacionado com o código em C e muito menos do Arduino) a cada 1,3 micro segundos.
Logo, guardar 8 horas com os temporizadores internos do Arduino não é de todo fácil, nem tão pouco será preciso.

Então, vais mesmo precisar dum RTC para fazer algo decente. A beleza é que grande parte dos RTCs já trazem memória, logo não vais precisar de escrever na EEPROM. Se bem que também podes fazê-lo.

Então para medires os segundos que o relé vai estar accionado, podes usar o RTC, ou podes usar a função millis(). Tudo depende se a temporização vai estar em segundos ou em mili-segundos. Se for sempre em segundos, o RTC é melhor.




Não existe outra forma de temporizar? Não preciso saber a hora, so preciso que se eu ligar ele hoje as 10h, daqui um mes ele continue acionando as 10h.

bubulindo

O problema é que o cristal que está no Arduino não é de todo o melhor para manter tempo. É possível, mas o código tem de ser muito bem feito (ou seja, nada de usar o Arduino) e ainda assim não existem garantias que vá sair bem.

Se tiveres um dos tipos do Arduino Mega, podes ligar um cristal de 32,768kHz (muito mais preciso) num dos temporizadores externos e contar o tempo com aquele cristal e executar o código com o cristal de 16MHz. O problema é que segundo me lembro o Arduino Mega, não disponibiliza estes pinos... logo ficas apenas com a opção de usar um RTC.

Então, para ter algo mesmo decente, o RTC é mesmo a melhor opção.
This... is a hobby.

felipevbastos

Esse seria o RTC?



e a programação com ele fica complicado?

Amanha posto o exemplo do programa que estou fazendo, so que com delay, agora com o RTC não sei como ficara.


bubulindo

This... is a hobby.

felipevbastos

Estou utilizando esse programa abaixo, no caso o led azul seria o comando de abertura. E com o RTC não sei como eu faria.

int ledAzul = 13; // escolha o pino para o LED (comando do motor, ira mudar para um pino PWM
int ledVerm = 12; // escolha o pino para o LED
int ledVerd = 11; // escolha o pino para o LED
int bot1 = 2;   // escolha o pino para botão
int bot2 = 3;   // escolha o pino para botão
int bot3 = 4;   // escolha o pino para botão
int bot4 = 5;   // escolha o pino para botão
int val01 = 0;     // variável para ler o estado do botão
int val02 = 0;     // variável para ler o estado do botão
int val03 = 0;     // variável para ler o estado do botão
int val04 = 0;     // variável para ler o estado do botão
int potPin = 2;    // escolha o pino do potenciômetro
int val = 0;       // variável para ler o potenciometro


void setup() {
  pinMode(ledVerm, OUTPUT);  // declara-se o LED como saída
  pinMode(ledAzul, OUTPUT);  // declara-se o LED como saída
  pinMode(ledVerd, OUTPUT);  // declara-se o LED como saída
  pinMode(bot1, INPUT);    // declara-se o interruptor como entrada
  digitalWrite(bot1, HIGH);  // coloca a entrada em nivel alto, dispensando o resistor
  pinMode(bot2, INPUT);    // declara-se o interruptor como entrada
  digitalWrite(bot2, HIGH);  // coloca a entrada em nivel alto, dispensando o resistor
  pinMode(bot3, INPUT);    // declara-se o interruptor como entrada
  digitalWrite(bot3, HIGH);  // coloca a entrada em nivel alto, dispensando o resistor
  pinMode(bot4, INPUT);    // declara-se o interruptor como entrada
  digitalWrite(bot4, HIGH);  // coloca a entrada em nivel alto, dispensando o resistor
}

void loop() {
INICIO:
  val01 = digitalRead(bot1);  // le o estado do botão
  if (val01 == LOW) goto BOTAO1;
 
  val02 = digitalRead(bot2);  // le o estado do botão
  if (val02 == LOW) goto BOTAO2;
 
  val03 = digitalRead(bot3);  // le o estado do botão
  if (val03 == LOW) goto BOTAO3;
 
  val04 = digitalRead(bot4);  // le o estado do botão
  if (val04 == LOW) goto TESTE;
   
  goto INICIO;
 
BOTAO1: // 3 vezes ao dia
    digitalWrite(ledVerm, HIGH);
  val = analogRead(potPin);    // ler o valor do potenciômetro
    digitalWrite(ledAzul, HIGH);  // ligar LED
    delay(val*20);
    digitalWrite(ledAzul, LOW);  // desligar LED
    delay(7000-(val*20));
    digitalWrite(ledAzul, HIGH);  // ligar LED
    delay(val*20);
    digitalWrite(ledAzul, LOW);  // desligar LED
    delay(7000-(val*20));
    digitalWrite(ledAzul, HIGH);  // ligar LED
    delay(val*20);
    digitalWrite(ledAzul, LOW);  // desligar LED
    delay(10000-(val*20));
    goto BOTAO1;
   

BOTAO2: // 2 vezes ao dia
    digitalWrite(ledVerd, HIGH);
  val = analogRead(potPin);    // ler o valor do potenciômetro
    digitalWrite(ledAzul, HIGH);  // ligar LED
    delay(val*20);
    digitalWrite(ledAzul, LOW);  // desligar LED
    delay(12000-(val*20));
    digitalWrite(ledAzul, HIGH);  // ligar LED
    delay(val*20);
    digitalWrite(ledAzul, LOW);  // desligar LED
    delay(12000-(val*20));
    goto BOTAO2;
   
   
BOTAO3: // 1 vez ao dia
    digitalWrite(ledVerd, HIGH);
    digitalWrite(ledVerm, HIGH);
  val = analogRead(potPin);    // ler o valor do potenciômetro
    digitalWrite(ledAzul, HIGH);  // ligar LED
    delay(val*20);
    digitalWrite(ledAzul, LOW);  // desligar LED
    delay(24000-(val*20));
    goto BOTAO3;
   
   
TESTE:
  val = analogRead(potPin);    // ler o valor do potenciômetro
    digitalWrite(ledAzul, HIGH);  // ligar LED
    delay(val*20);
    digitalWrite(ledAzul, LOW);  // desligar LED
   
}

wertoliveira

Oi Felipe, acho que foi de mim que vc comprou o rele.
Mas vamos ao que interessa.
o Delay não serve para contar tempo nesse teu caso.
Quando usa um delay, ele para o codigo, netão se você apertar outro botão o arduino não responderá.
E outra coisa se der um pico de ennergia, seu cofre pode ABRIR.
Aconselho fazer o seguinte coloque o RTC como o amigo lhe falou e use uma cartão SD de LOG.
Caso o arduino seja reiniciado ou trave, ele busca a ultima programação salva no cartão e voltar a funcionar para acionamento no horário exato.

Espero que tenha lhe ajudado.

Go Up