LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: vdr em 10 de Fevereiro de 2010, 01:18
-
Boas noites, este é o meu primeiro post no lusorobotica ^^
Amanha chegará o meu Arduino ;D, e como projecto inicial decidi fazer um temporizador de contagem regressiva, nada muito complicado, é algo que se faz bem em linguagem C, penso que passar passar para o arduino não será muito complicado.
Pensei em utilizar dois botões de pressão para fazer o SetAlarm.
Em que quando são pressionados os dois ao mesmo tempo, inicia-se a definição do tempo. Um dos botões fica responsável pelo incremento e o outro para alterar entre os horas/minutos/segundos.
Pensei em utilizar o ecrã dum nokia 3310, não tendo assim de comprar um display.
As minha dúvidas começam pelo material necessário além do arduino, dos botões e do LCD, visto que quero utilizar o temporizador fora do arduino, por exemplo para não deixar queimar o arroz xD.
Outra questão é saber quantos clocks ocorrem num segundo, será esta o melhor método para saber que passou um segundo?
-
Outra questão é saber quantos clocks ocorrem num segundo, será esta o melhor método para saber que passou um segundo?
Não precisas de nenhum temporizador externo. Tu podes defenir a periodicidade em que executas o código, basta adicionares um delay().
Se meteres o código todo, com um delay(1000) asseguras que o código irá correr a cada segundo.
-
procura no forum que comecei um projecto parecido, so não o acabei porque aranjei o temp de um microondas ;D
-
Então podia ficar por exemplo assim:
Depois de ler os dados do utilizador,
seg_total=SEC+MIN*60+HOR*3600;
while( seg_total > 0) {
delay(1000);
SEC++;
if(SEC==0) {
if(MIN==0)
if(HOR==0){
return;
}
else {
MIN=59;
SEC=59;
HOR--;
}
else {
MIN--;
SEC=59;
}
}
}
ghostbuster, não encontrei o tópico que referiste.
Cumprimentos.
-
Outra questão é saber quantos clocks ocorrem num segundo, será esta o melhor método para saber que passou um segundo?
Não precisas de nenhum temporizador externo. Tu podes defenir a periodicidade em que executas o código, basta adicionares um delay().
Se meteres o código todo, com um delay(1000) asseguras que o código irá correr a cada segundo.
Eu conheço a função delay do avr-gcc e essa função serve para fazer um atraso de x milisegundos, ou seja, durante os x milisegundos que metes como parametro na função, o processador não fará mais nada a não ser nop's, logo se ele mete um delay e depois código a seguir não sabe quanto tempo demora o código dele a ser executado.
A maneira mais simples de fazer um relógio será usar um timer e definir um pre-scaler para obter um numero inteiro de clocks para cada segundo e a partir dai pode usar incrementação de variáveis para gerar os minutos, horas e etc. Enquanto o timer fica a fazer mais um "ciclo" dá tempo para escrever o que é preciso para o alarme, mas nunca fará nada quando chega ao valor predefinido para incrementar o valor dos minutos e/ou das horas.
Se for preciso algo realmente preciso o melhor é usar um rtc e a cada par de horas reacertar as variáveis que estão no processador para manter o relógio correcto e sem erros.
-
Como ainda não tenho os botões para testar, deixo aqui o código que fui fazendo.
O objectivo é iniciar o setAlarm quando os dois botões são pressionados. Depois, um dos botões serve como incremento da hora/minuto/segundo enquanto que o 2º botão serve para mudar de hora/minuto/segundo.
int switch1pin = 2;
int switch2pin = 3;
int switchState[2]={0};
int SW1=0;
int SW2=0;
int i;
void setup () {
Serial.begin(9600);
pinMode(switch1pin, INPUT);
pinMode(switch2pin, INPUT);
}
void loop () {
//Get Data
switchState[0]= digitalRead(switch1pin);
switchState[1]= digitalRead(switch2pin);
//se os dois botões estão pressionados...
if(switchState[0]==1 && switchState[1]==1) {
//start setTime
for(i=0; i<2 ; i++) {
//enquanto o 2º botão não for pressionado
while(switchState[1]==0) {
switchState[0]= digitalRead(switch1pin);
if(switchState[0]==1)
SW1++;
switchState[1]= digitalRead(switch2pin);
}
//Chega aqui quando o 2º botão for pressionado
crono[i]=SW1; //guardar o numero de incrementos
SW1=0; //reset à variavel
}
}
-
Olha este link, diz precisamente como fazer um temporizador correctamente com incrementos de 1 segundo, simlpes e com código que podes copiar/tirar ideias
-
Esqueceste-te do link :P
-
ups, peço desculpa:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1167000525 (http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1167000525)