Go Down

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

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.






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.

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.

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).


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.

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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.


Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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
   
}

Webert Oliveira

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