[RESOLVIDO] Contador regressivo por leitura analógica

Boa noite garagistas,

Me vi penando em um problema relacionado a programação extremamente simples, mas que não consegui resolvê-lo. Seguinte, estou construindo um simples circuito (no futuro controlado por uma ATtiny) onde a ATmega lê uma entrada de um potênciômetro e atribui um valor de 0 a 1023. Pretendo pegar este valor e "salvá-lo" para ao pressionar de um botão, ele "travar" este valor (ou seja, se eu mexer no potênciometro não altera) e começar uma contagem regressiva até chegar no 0 e apitar um buzzer. A saída seria em 3 displays de 7 segs.

Minha grande dúvida reside em como salvar este valor e atribuí-lo a função de contagem (entre um for e  um while, qual o melhor?). E como posso converter o valor em segundos para minutos e segundos restantes? Eu pensei em fazer esta última parte como dividir o valor por 60, usar como minuto, pegar o resto e fazer uma regra de três para chegar aos segundos.

Perdoem pela minha jeguice em uma coisa tão tola! Agradeço todas as ideias!

(para os que viram meu post sobre robô de vigilância, estou apenas esperando as peças, não achem que simplesmente descartei toda a ajuda recebida =D)

Valeu

Exibições: 1694

Responder esta

Respostas a este tópico

se vc considerar que a sua leitura vai de 0a1019 vc tera um maximo de 1020pasos para a contagem

considerando que 1020/60 é 17 voce tera uma programação de até 17 minutos.

o que vc deve fazer é o seguinte:

int x = leitura inicial capturada
int y = x
int min = 0
int seg = 0

While (seg>59){
  min = min + 1
  seg = seg - 60
}

while (min > 0 and seg > 0) {
  delay 1 seg
  seg = seg--
  if (min > 0 and seg = 0) {
    min = min--
    seg = 60
  }
}



deixo pra vc arrumar a linguagem de programação mas acredito que consiga entender.

Isso é que é nome Italiano hein????

o pior é que eu sou Chileno filho de Brasilera com Chileno e ambos filhos de italianos

Vittorio, agradeço sua ajuda, mas ainda assim não consegui implantar este seu código. Por enquanto estou encalhado com isso (as printadas seriais são para conferir se o map estava funfando, ajeitei para 5 minutos senão o potênciometro tornava-se pouco preciso):

int potpin = 0;
int ledPin = 13;
int Botao = 2; //botao no pino 2
int EstadoBotao = 0; //Variavel para ler o status do pushbutton
int potvalor = 0;
int minutostotal = 0;
int segundostotal = 0;
int seg = 0;
int min = 0;
void setup(){
   pinMode(ledPin, OUTPUT); //Pino do led será saída
   pinMode(Botao, INPUT); //Pino com botão será entrada
   Serial.begin(9600);
}
void countdown(){
   while(min!=0&&sec!=0) {
      delay 1000ms;
      sec=sec--;
      if(sec>1)
         {
          min=min--;
if(min>1)
{
min=59;
if (min!=0)
{
sec=60;
}
}
}
}
if(min==0&&sec--0){
digitalWrite(12, HIGH);
}

void loop(){
EstadoBotao = digitalRead(Botao);

if (EstadoBotao == HIGH){ //Se botão estiver pressionado (HIGH)
digitalWrite(ledPin, HIGH);// acende o led do pino 13.
potvalor = map(analogRead(potpin), 0, 1023, 0, 300);
delay(500);
minutostotal = potvalor /60;
Serial.println(potvalor);
Serial.print("Minutos: ");
Serial.println(minutostotal);
segundostotal = potvalor %60;
Serial.print("Segundos: ");
Serial.println(segundostotal);

}

}

que bagunça!!

tenta este código, ai vc acerta o tempo

int potpin = 0;
int ledPin = 13;
int Botao = 2; //botao no pino 2
int EstadoBotao = 0; //Variavel para ler o status do pushbutton
int potvalor = 0;
int minutos = 0;
int segundostotal = 0;
int segundos = 0;

void setup(){
   pinMode(ledPin, OUTPUT); //Pino do led será saída
   pinMode(Botao, INPUT); //Pino com botão será entrada
   digitalWrite(Botao, HIGH); //Ativa Pull-up
   Serial.begin(9600);
}

void countdown(){
  while (segundos > 0 || minutos > 0){
    delay(1000);
    Serial.print("Tempo: ");
    Serial.print(minutos);
    Serial.print(":");
    Serial.println(segundos);
    segundos = segundos--;
    if (segundos == 0){
      if (minutos > 0){
        minutos = minutos--;
        segundos = 60;
      }
      else {
        Serial.println("Acabou!!");
        digitalWrite(ledPin, LOW);
      }
    }
  }
}

void loop(){
  EstadoBotao = digitalRead(Botao);
  if (EstadoBotao == LOW){ //Se botão estiver pressionado (LOW)
    digitalWrite(ledPin, HIGH);// acende o led do pino 13.
    potvalor = map(analogRead(potpin), 0, 1023, 0, 300);
    delay(500);
 
    segundostotal = potvalor;
    minutos = segundostotal / 60;
    segundos = segundostotal - (minutos*60);
        
    Serial.print("analogRead: ");
    Serial.println(analogRead(potpin));
    
    Serial.print("potvalor: ");
    Serial.println(potvalor);
        
    Serial.print("Segundos: ");
    Serial.println(segundostotal);
    Serial.println();

    Serial.print("Tempo: ");
    Serial.print(minutos);
    Serial.print(":");
    Serial.println(segundos);
    
    countdown();
  }
}

Boa noite! 

Então, consegui fazer progresso em vários aspectos. Agora, o valor do pot já é mostrado "ao-vivo"e  corrigi um bug de tempo negativo. Quanto ao software, estou com isto atualmente: http://pastebin.com/uK5qbY84

Minhas dúvidas no software são as seguintes: Como faço para que a saída pro 7seg seja uma variável de duas? Por exemplo, ele exibe apenas uma variável, e como tenho os minutos e segundos, como faço para transformar o valor em uma só?

Outra coisa: por incrível que pareça, este código acima funciona, mas não exibe o tempo atual na tela (por exemplo, ele aparece o valor do pot, mas qdo aperto o botão para contar, ele não exibe mais o valor atual da contagem)

Quando mexo no valor do pot, em algumas horas ele para em algum valor que é exibido em uma sobreposição. Por exemplo, se estou em 001 e mexo um pouco, ao invés de pular para 002 fica aparecendo os dois valores ao mesmo tempo. Caso eu mexa mais um pouco ele vai normal para o 002. O que pode ser isso? Como posso fazer aparecer um valor por vez?

Quanto ao hardware, outras coisas me intrigam: 

Ao ligar o display de 7seg, os outros LEDs do display, que deveriam estar apagados, ficam acesos bem fracos, mas chegando a dificultar a leitura do número. Se eu toco no resistor de alimentação, ele apaga "completamente". Caso eu coloque resistores para fazer a ligação com o 595, isso iria acontecer? Conforme a foto abaixo:

Agradeço a ajuda de todos!

Abraços

Então, acabei! Depois de 20h de trabalho, 5m de fios e um tubinho de solda, finalmente acabei! Logo postarei um vídeo de seu funcionamento. Para quem quiser consultar o código usado: http://pastebin.com/uK5qbY84

Foto do protótipo:

Fotos do modelo final:

Enfim, gostaria de agradecer muito a todos que me ajudaram, ficou um negócio bacana!

Um obrigado também para o Ricardo Pedroso, que deu um help generoso!

Valeu gente, até o próximo projeto!

Abração

Parabens !!!!

Realmente tu és um cara "corajoso". Montou um Arduino ao lado de seu projeto...

Agora, gostaria de saber para que pretende usar este temporizador?

Valeu Euclides!

Corajoso? Porque? Botei a Arduino ali para ser standalone, hehe. E é uma 328, minha ATmega8 teimou em funcionar!

Este é o Ovômetro, um aparelho para auxiliar no cozimento de ovos. Só os verdadeiros chefs sabem o tempo perfeito de cozimento para que a gema fique mais mole ou mais dura, dependendo da aplicação do ovo. Com este aparelho, qualquer um pode ter o ovo perfeito no seu café da manhã, almoço, jantar ou lanche noturno!

Brincadeiras a parte, é exatamente isso. Simplesmente um contador regressivo com tempo ajustável. Pretendo integrar um barômetro para sugerir os tempos de cozimento (baseado em tempo até a água ferver muda em função de altitude) para uma gema "mole" ou uma "normal".

É para presente, hehe

Mas então, se vc. agregar o barômetro, o potenciômetro não será mais necessário. Pois o barômetro fará o ajuste de escala de tempo em relação a altitude e pressão atmosférica. O difícil será achar uma "fórmula" que agrade gregos e troianos quando ao estado do ovo, depois de cozido. Agora só falta vender este item para os fabricantes de microondas que sabem cozinhar ovos. Boa !!!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço