Ajuda com programa para assionamento de cofre!!!

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

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 Arduino Playground - HomePage) 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.

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 Arduino Playground - HomePage) 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.

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.

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.

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.

Sim, parece ser isso.

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(val20);
digitalWrite(ledAzul, LOW); // desligar LED
delay(7000-(val
20));
digitalWrite(ledAzul, HIGH); // ligar LED
delay(val20);
digitalWrite(ledAzul, LOW); // desligar LED
delay(7000-(val
20));
digitalWrite(ledAzul, HIGH); // ligar LED
delay(val20);
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(val20);
digitalWrite(ledAzul, LOW); // desligar LED
delay(12000-(val
20));
digitalWrite(ledAzul, HIGH); // ligar LED
delay(val20);
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(val20);
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

}

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.