Alguém sabe como fazer um temporizador sem usar o delay ??

Exibições: 19469

Responder esta

Respostas a este tópico

Oi Ramon.

Uma maneira é iniciar uma interrupção por timer. Por exemplo, gerar uma interrupção do  timer1 a cada 1 mseg.

Dentro da rotina de interrupção decremente contadores para cada função desejada.

No loop(), seta um valor em milisegundos e espere chegar a zero. Use o led para testar o funcionamento da int.

ISR(TIMER1_COMPA_vect)   // roda a cada 1 mseg

{

   if (contador_função_0) { contador_função_0--;  }

}

void SetupTimer1(void)
{                                 // eu usei 26.0625useg, ajuste o divisor para 1mseg 
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
                      // f_int = 16MHz/ prescaler / DIVISOR
                      // T = prescaler * DIVISOR / 16MHz
                      // T = 1 * DIVISOR / 16MHz                Tminimo = 0,0625useg
                      // DIVISOR = f * T / 1
                      // DIVISOR = 16 E6 * 26.0625 E-6 / 1 = 417
OCR1A = 417; // 26.0625useg
TCCR1B |= (1 WGM12);              // CTC mode
TCCR1B |= (1 CS10);                 // 001 = 1 prescaler
TIMSK1 |= (1 OCIE1A);              // enable timer compare interrupt
}

bro se quiser alguma coisa mais "ROOTS" e com menos precisão cria uma variável int, incrementada a cada ciclo, e uma função if:

int var = 0;

if ( var > "n ciclos"){ // > para executar rotina após o "timer", e < para executar a rotina dentro do "timer"

sua rotina

}

if ( var <= "n ciclos"){

var++;

}

lembrando que desta forma vc não terá um controle preciso do tempo do temporizador, pois ele será em função do tempo de execução do seu loop

PS:o segundo if tem a função apenas de não permitir que a variável cresça infinitamente.

e também será necessário um comando para zerar o contador quando quiser que ele seja reiniciado

var=0;

Ola Ramon eu costumo usar assim:
 
#include "TimerOne.h"
  • int cont = 0; 
  • int var =0; // esta seria sua variavel de comparação onde você definiria o valor por modo externo.
  • void setup()
  • {
  •   pinMode(10, OUTPUT);
  •   Timer1.initialize(500000);         // Neste caso ele chama a rotina a cada  1/2 segundo, você pode alterar este valor
  •     Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
  • }
  •  
  • void callback()
  • { // aqui vocé pode usar um contador como seu delay veja o exemplo.
  • if( condição que você quer para ele iniciar a contagem)
  • { cont = cont++;}
  • else{ cont =0;}
  •   digitalWrite(10, digitalRead(10) ^ 1);
  • }
  •  
  • void loop()
  • {
  • if ( cont>= var){ // acione minha saida.
  • }
  •   // seu programa
  • }

 

Claro isto é so uma ideia não sei se pra você atenderia.

Muito Obrigado Pela Ajuda.

Ramon ou Rodrigo, poderiam me ajudar?

Estou procurando a forma de fazer um programinha parecido com este seu, só que precisava além de ver o tempo num Lcd, poder incrementar ou diminuir o tempo(min) por exemplo, 5min, 7min para acionar o tempo de funcionamento de um motorzinho.

Já tentei vários links mas não estou conseguindo....

Já coloquei o display pra funcionar, o motorzinho, mas não consigo por as 2 chaves de incremento e decremento pra funcionar.

grato,

Pedro Morais

Ola, Pedro me passa o que você quer fazer, e como deve funcionar, que eu monto o programa pra vc e coloco uns comentarios pra você entender.. me envie email para rodrigo.rja@hotmail.com ai depois que eu montar e testar posto aqui pra você.

 

Abraço....

Rodrigo, desculpe o abuso !!!

Mas vc poderia me ajudar também?

Comprei o Arduino UNO R3, LCD KeyPad Shield e um Rele Shield de 2 saída + um buzzer...

Fiz alguns teste de SOM em alguns exemplos que encontrei aqui no labdegaragem, mas ainda não consegui chegar onde Eu quero...

Estou tentando algo parecido como o do RAMON... mas no meu caso, quero apenas um temporizador que eu possa colocar um tempo ex. 30min, 45min.... e chegando no final de 20 seg... ele começe a tocar um bip. qdo chegar a 00:00:00 o alarme toca a sirene...

Peguei um exemplo de menu que aparece, Estado: Ligado ou Desligado... mas quem diz q eu consigo fazer funcionar com tudo ligado.. rssss

Pode me ajudar?

Obrigado ... 

Alexandre

Boa Noite Pedro.

Esses dia eu encontrei esse exemplo de menu.  eu acho que pode te ajudar 

no lugar do variável  você troca pelo a variável do seu projeto .



#include <LiquidCrystal.h>


#define Buzzer 6
#define Display 7
#define bMenu A0 // Os pinos analógicos podem ser
#define bChange A1 // usados como digitais, bastando
#define bUp A2 // referenciá-los por A0, A1..
#define bDown A3

#define bMenu0 90 // Valor de referência que a
#define bChange0 91 // função CheckButton() passa
#define bUp0 92 // indicando que um botão foi
#define bDown0 93 // solto

boolean aMenu, aChange, aUp, aDown; // Grava o ultimo valor lidos nos botões.
// Utilizado pela função Checkbutton p/ identificar quando há uma alteração no estado do pino dos botões

int variavel; // variavel a ser alterada pelo menu

char state=1; // variável que guarda posição atual do menu
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Declaração do objeto tipo lcd

//============================================== SETUP
void setup()
{
lcd.begin(128, 64);

pinMode(Display,OUTPUT); // Luz de fundo do display
pinMode(Buzzer, OUTPUT); // Buzzer
pinMode(bMenu, INPUT); // Botões
pinMode(bChange,INPUT);
pinMode(bUp, INPUT);
pinMode(bDown, INPUT);

digitalWrite(bMenu, HIGH); // Aciona o pull-up interno
digitalWrite(bChange,HIGH); // dos botões
digitalWrite(bUp, HIGH);
digitalWrite(bDown, HIGH);
digitalWrite(Display,HIGH); // Liga a luz do display.
}

//==============================================
//============================================== LOOP
void loop()
{
switch (state) {

case 1:
switch (CheckButton()) {
case bMenu:
lcd.clear(); variavel++;
break;
case bChange:
lcd.clear(); variavel--;

if(variavel > 4000) {
variavel= 0;
}
else if (variavel < 0) {
variavel= 5000;
}
break;
case bUp:
lcd.clear(); Set_state(2);
break;
default:
Set_state(1);
}
break;

case 2:
switch (CheckButton()) {
case bMenu:
lcd.clear(); variavel++;
break;
case bChange:
lcd.clear(); variavel--;
break;
case bUp:
lcd.clear(); Set_state(1);
break;
case bDown:
lcd.clear(); Set_state(3);
break;
default:
Set_state(2);
}
break;

case 3:
switch (CheckButton()) {
case bMenu:
lcd.clear(); variavel++;
break;
case bChange:
lcd.clear(); variavel--;
break;
case bUp:
lcd.clear(); Set_state(2);
break;
case bDown:
lcd.clear(); Set_state(4);
break;
default:
Set_state(3);
}
break;

case 4:
switch (CheckButton()) {
case bMenu:
lcd.clear(); variavel++;
break;
case bChange:
lcd.clear(); variavel--;
break;
case bUp:
lcd.clear(); Set_state(3);
break;
case bDown:
lcd.clear(); Set_state(1);
break;
default:
Set_state(4);
}
break;

default: ;
}
}
//============================================== FIM da função LOOP
//==============================================

//============================================== CheckButton
char CheckButton() {
if (aMenu!=digitalRead(bMenu)) {
aMenu=!aMenu;
if (aMenu) return bMenu0; else return bMenu;
} else
if (aChange!=digitalRead(bChange)) {
aChange=!aChange;
if (aChange) return bChange0; else return bChange;
} else
if (aUp!=digitalRead(bUp)) {
aUp=!aUp;
if (aUp) return bUp0; else return bUp;
} else
if (aDown!=digitalRead(bDown)) {
aDown=!aDown;
if (aDown) return bDown0; else return bDown;
} else
return 0;
}

//========================================================
//============================================== Set_state
void Set_state(char index) {
state = index; // Atualiza a variável state para a nova tela
switch (state) { // verifica qual a tela atual e exibe o conteúdo correspondente
case 1: //==================== state 1
lcd.setCursor(0,0);
lcd.print("Segundos:");
lcd.setCursor(0,1);
lcd.print( millis()/1000 , DEC); // mostra os segundos na tela
lcd.print(" s");
break;
case 2: //==================== state 2
lcd.setCursor(0,0);
lcd.print("Beep!");
break;
case 3: //==================== state 3
lcd.setCursor(0,0);
lcd.print(" Aperte para");
lcd.setCursor(0,1);
lcd.print(" apagar");
break;
case 4: //==================== state 4
lcd.setCursor(0,0);
lcd.print("Variavel:");
lcd.setCursor(0,1);
lcd.print(variavel, DEC); // mostra o valor de "variavel"
break;
default: ;
}
}

Espero ter ajudado 

att Ramon

Ajudado não sei Ramon, mas que eu vou testar isso eu vou.... qq coisa posto aqui para todos ficarem sabendo.... 

Muito obrigado desde já...

Pedro Morais

Pedro segue o programa conforme comentado...

#include <LiquidCrystal.h>
#include <TimerOne.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);


boolean up = 8;// Botão de incrementa o valor da variavel minuto.
boolean dow = 10;// Botão de decrementa a variavel minuto.
boolean start = 9; // Botão que da a partida na contagem de tempo regrecivo.
boolean saida = 13; // Saida onde você pode ligar seu motor ou um Buzzer.
byte minuto = 0;
byte segundo = 0;
boolean stats = 0;
byte time =0;


void setup() {
 // Serial.begin(9600);

  lcd.begin(16, 2);
   Timer1.initialize(1000000); // O valor entre parenteses equivale a 1 segundo e você pode alteralo como quiser.
   Timer1.attachInterrupt(interrup); // Chama a função a ser tratada pela interrupção.
 
    pinMode(up, INPUT);
    digitalWrite(up, HIGH);
    pinMode(dow, INPUT);
    digitalWrite(dow, HIGH);
    pinMode(start, INPUT);
    digitalWrite(start, HIGH);
    pinMode(saida , OUTPUT);
    
}


void interrup()// esta é a interrupção responsavel pela contagem do tempo.
{
 if(stats ==1 && segundo == 0){segundo = 59;minuto = minuto --;}
 if(stats ==1 && segundo > 0){segundo = segundo--;}
   if(stats == 1 && minuto ==0 && segundo == 0){digitalWrite(saida, LOW); stats = 0;}
 
}
void loop()
{

  if(digitalRead(start) == LOW){stats = 1;}
  if(stats == 1) {digitalWrite(saida, HIGH);}
  if(digitalRead(up) == LOW) {minuto = minuto ++;}
  if(digitalRead(dow) == LOW) {minuto = minuto --;}

  lcd.setCursor(3,0);
  lcd.print("Delay off");
  lcd.setCursor(6,1);
  lcd.print(minuto),lcd.print(":"),lcd.print(segundo),lcd.print(" ");
  delay(500);/*
  Serial.print("Tempo");
  Serial.print(minuto);
  Serial.print(":");
  Serial.println(segundo);*/
}

Espero ter ajudado.

Poxa.... pessoal.... muito obrigado pela ajuda mesmo....

Infelizmente ainda não tive tempo para testar....

a ansiedade é grande, mas só amanhã, sábado, e ainda por cima só a tarde terei um tempinho livre.

postarei aqui qualquer novidade.

desde já agradeço a todos a colaboração

Pedro Morais

Boa Tarde Pedro

Tenho um projeto com temporizador parecido com o que voce deseja mas porem eu uso um teclado 4x3

http://labdegaragem.com/forum/topics/temporizador-com-lcd-16x2-e-te...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço