LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: Sextafeira em 30 de Maio de 2012, 00:12
-
Boas noites
antes demais peço desculpa por criar este tópico.
já vi e vi alguma informações sobre temporizador do arduino mas não percebi nada...:S
o meu problema é o seguinte....
eu carrego num botão para o led ligar, e ele permanece ligado.
para desligar tenho de carregar noutro botão é ele desliga.
mas agora queria implementar o seguinte, quando carrega se no botão para ligar o led, ao mesmo tempo liga-se um temporizador e ao fim de "x" tempo se não carrega-se no botão para desligar o led, o temporizador
desligava-o.
isto não é para 1 led mas sim, 16 led's
também já li uma informações sobre interrupts, mas não percebi nada...é que para eu entende tem de ser passo a passo, com legendas e desenhos xD
desde já obrigado
cumps
-
ninguém pode dar uma mãozinha
-
Podes usar mais ou menos o conceito do blinky without delay, que usa o milis.
Em pseudo-código fazes algo assim:
if(butãoLed1 == HIGH){
led1 = HIGH;
tempoLed1 = milis();
}
//algures no main fazes
if(milis() - tempoLed1 > (1000*16)){ //1000ms * 16 = 16s
led1 = LOW;
}
-
int entrabaixo=0; // Variavel de entrada
int entracima=0; // Variavel de Saida
int LDR=A0; // Variavel que contem o valor do LDR
int Sensorentra=0;
int Sensorsai=0;
const int tim=650;
long temp;
void setup() {
Serial.begin(9600);
pinMode(14, INPUT); // Sensor Entrada Escada
pinMode(16, INPUT); // Sensor Saida Escada
pinMode(22, OUTPUT); // Saida Reles ( LED'S)
pinMode(23, OUTPUT); // Saida Reles ( LED'S)
pinMode(24, OUTPUT); // Saida Reles ( LED'S)
pinMode(25, OUTPUT); // Saida Reles ( LED'S)
pinMode(26, OUTPUT); // Saida Reles ( LED'S)
pinMode(27, OUTPUT); // Saida Reles ( LED'S)
pinMode(28, OUTPUT); // Saida Reles ( LED'S)
pinMode(29, OUTPUT); // Saida Reles ( LED'S)
pinMode(30, OUTPUT); // Saida Reles ( LED'S)
pinMode(31, OUTPUT); // Saida Reles ( LED'S)
pinMode(32, OUTPUT); // Saida Reles ( LED'S)
pinMode(33, OUTPUT); // Saida Reles ( LED'S)
pinMode(34, OUTPUT); // Saida Reles ( LED'S)
pinMode(35, OUTPUT); // Saida Reles ( LED'S)
pinMode(36, OUTPUT); // Saida Reles ( LED'S)
}
void loop() {
//Variaveis Sensor
Sensorentra = digitalRead(14);
Sensorsai= digitalRead(16);
// ENTRADA EM BAIXO
if (Sensorentra == LOW && entrabaixo==0){
entrabaixo=1;
entra_baixo();
temp=millis();
}
// SAIDA EM CIMA
if (Sensorsai == LOW && entrabaixo==1){
entrabaixo=0;
sai_cima();
}
// ENTRADA EM CIMA
//SAIDA EM BAIXO
//TEMPORIZADOR
if(millis() - temp > (1000*30)){ //1000ms * 16 = 16s
entrabaixo=0;
entracima=0;
dslg_td();
}
}
/////////////////////////////////////////////////////////////
// //
// SUBROTINAS //
// //
////////////////////////////////////////////////////////////
///////////////////////////////////////////
// ENTRADA EM BAIXO
///////////////////////////////////////////
void entra_baixo(){
digitalWrite(22, HIGH);
delay(tim);
digitalWrite(23, HIGH);
delay(tim);
digitalWrite(24, HIGH);
delay(tim);
digitalWrite(25, HIGH);
delay(tim);
digitalWrite(26, HIGH);
delay(tim);
digitalWrite(27, HIGH);
delay(tim);
digitalWrite(28, HIGH);
delay(tim);
digitalWrite(29, HIGH);
delay(tim);
digitalWrite(30, HIGH);
delay(tim);
digitalWrite(31, HIGH);
delay(tim);
digitalWrite(32, HIGH);
delay(tim);
digitalWrite(33, HIGH);
delay(tim);
digitalWrite(34, HIGH);
delay(tim);
digitalWrite(35, HIGH);
delay(tim);
digitalWrite(36, HIGH);
delay(tim);
}
///////////////////////////////////////////
// SAIDA EM CIMA
///////////////////////////////////////////
void sai_cima(){
digitalWrite(22, LOW);
delay(tim);
digitalWrite(23, LOW);
delay(tim);
digitalWrite(24, LOW);
delay(tim);
digitalWrite(25, LOW);
delay(tim);
digitalWrite(26, LOW);
delay(tim);
digitalWrite(27, LOW);
delay(tim);
digitalWrite(28, LOW);
delay(tim);
digitalWrite(29, LOW);
delay(tim);
digitalWrite(30, LOW);
delay(tim);
digitalWrite(31, LOW);
delay(tim);
digitalWrite(32, LOW);
delay(tim);
digitalWrite(33, LOW);
delay(tim);
digitalWrite(34, LOW);
delay(tim);
digitalWrite(35, LOW);
delay(tim);
digitalWrite(36, LOW);
delay(tim);
}
///////////////////////////////////////////
// ENTRADA EM CIMA
///////////////////////////////////////////
void entra_cima(){
digitalWrite(36, HIGH);
delay(tim);
digitalWrite(35, HIGH);
delay(tim);
digitalWrite(34, HIGH);
delay(tim);
digitalWrite(33, HIGH);
delay(tim);
digitalWrite(32, HIGH);
delay(tim);
digitalWrite(31, HIGH);
delay(tim);
digitalWrite(30, HIGH);
delay(tim);
digitalWrite(29, HIGH);
delay(tim);
digitalWrite(28, HIGH);
delay(tim);
digitalWrite(27, HIGH);
delay(tim);
digitalWrite(26, HIGH);
delay(tim);
digitalWrite(25, HIGH);
delay(tim);
digitalWrite(24, HIGH);
delay(tim);
digitalWrite(23, HIGH);
delay(tim);
digitalWrite(22, HIGH);
delay(tim);
}
///////////////////////////////////////////
// SAIDA EM CIMA
///////////////////////////////////////////
void sai_baixo(){
digitalWrite(36, LOW);
delay(tim);
digitalWrite(35, LOW);
delay(tim);
digitalWrite(34, LOW);
delay(tim);
digitalWrite(33, LOW);
delay(tim);
digitalWrite(32, LOW);
delay(tim);
digitalWrite(31, LOW);
delay(tim);
digitalWrite(30, LOW);
delay(tim);
digitalWrite(29, LOW);
delay(tim);
digitalWrite(28, LOW);
delay(tim);
digitalWrite(27, LOW);
delay(tim);
digitalWrite(26, LOW);
delay(tim);
digitalWrite(25, LOW);
delay(tim);
digitalWrite(24, LOW);
delay(tim);
digitalWrite(23, LOW);
delay(tim);
digitalWrite(22, LOW);
delay(tim);
}
void dslg_td (){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
}
desde já obrigado pela resposta.
já tentei colocar no programa e também adicionei lhe uns if's mas agora removi ... :S
isso já desligou a fim de 30s , mas depois não liga mais....
eu coloquei ai o código desculpem o tamanho
-
Ok, estive a ver no simulador e parece que o problema e que volta a zero cada vez que acaba o loop...
Nao tenho bem a certeza mas acho que tens que criar um variavel para o estado do botao, de forma a que quando volte a zero por causa dos millis, possa ser resetado, para voltar a poder ser activado... Faz sentido !?
Nao sou o melhor para explicar isto ja que nao e o meu forte... Nisto sou apenas um autodidata !! Alguem mais credenciado tem que explicar melhor lol
Eu consigo ver o problem, mas nao consigo explicar bem como o resolver...
PS- Estive a ver com calma e o que se passa e o seguinte- So qdo os dois botoes estao high e que a luz acende ou apaga... Se os dois estiverem low ao mesmo tempo, a unica coisa que acontece e euma intemitencia , se calhar rapida demais para perceberes ai, mas que acontece......
E so volta acender depois de se auto apagar, se os dois estiverem high, e desligares o Sensor Entrada Escada; Se o fizeres com o outro nao acontece nada ! mas se estiver so o outro ligado, a intermitencia para !
Epero que isso ajude a resolver !! Como nao percebo bem o que estas a tentar fazer nem sei como queres, e melhor abster-me de fazer suposicoes especificas... Mas a minha ideia e que faz falta mudares o estado da luz, atraves da criacao de uma variavel que quando mudar com um botao, e actualizada
1Que tipo de sensores tem ligados ?!? press to make ou switches tipo rocker ?!?
e como e que tens eles ligados ?!? So o sensor entrada escada e que o liga, mas tem que estar ambos HIGH. Por isso tens que usar um pull up resistor em ambos se forem momentaneos. Porque se os tiveres em float, talvez seja esse o teu problema, por isso e melhor pores mais detalhes sobre como tens ligado a questao...So o codigo nao chega, porque tanto quanto vejo, ate pare estar a trabalhar, se tiveres ligado de uma certa maneira....Para outro tipo de ligacao , nao estaria a trabalhar...
Para este codigo trabalhar, terias que ter botoes momentaneos, com pul upp resistors, que quebrem quando primes...So assim ele trabalha da maneira que eu percebi pelo codigo e tua breve explicacao.
Nao tenho a certeza, ja que nao sei bem o que tens ligado para ai, mas em relacao ao que disse era a isto que me referia
if (buttonState == HIGH)
{
}
else if (buttonState == HIGH)
{
}
else
{
}
-
Ta aqui um video para veres que trabalha se tiveres pull up resistors com botoes momentaneos (press to make). Se for assim...Senao teras que mudar ou o codigo ou a configuracao !!
PS- mudei os pins para usar numa UNO e so tenho uma saida para leds, para efeitos de simulacao. O tempo tb mudei porque isto simula por ciclos o pino 2 no video e o Sensor Entrada Escada
lusorobotica Arduino simulation (http://www.youtube.com/watch?v=F5o_o5k6CJc#)
-
boas
desde já obrigado por responderes, estou a perceber o que esta a dizer, vou tentar fazer...
Quanto ao que quero fazer, é um projecto para as minhas escadas de casa, quando alguém entre nas escadas em baixo os led's acendem progressivamente (baixo para cima), e quando saio mas escadas os led's irão apagar se pela ordem que acenderam.
Quando alguém entrar em cima e sair em baixo faz a mesma coisa mas acende os led's de cima para baixo.
O porque do temporizador? Quero o temporizador, para poupar energia, ou seja , quando entras em baixo, actuas o sensor, ao mesmo tempo corres um temporizador, se em x tempo não saíres em cima ele desliga os led's todos
O sensor que estou a usar é o que vez na imagem em anexo, é um IR com emissão e recepção trabalha a 5v, tem três fios, ele esta sempre a deixar passar 5v para o arduino, so quando passas a mão ele deixa de passar os 5v, vai a 0v,
Também podes ver na imagem que eu estou a testar directamente liguei um fio a entrada do arduino 14 e 16.
Eu testei varias coisas ontem a noite o codigo que coloquei era um backup porque o outros estava um confusão.
obrigado
cumps
-
Entao e suposto trabalhar trabalhar... o codigo trabalha se fosse de quebra momentanea. Tens um Osciloscopio ?!? Pode estar a demorar bastante tempo ate estabilizar...
Como e que o Interruptor IR trabalha? ja que nao sei... Talvez tenhas que usar interrupts e especificar em rising ou falling
-
Se o problema é bouncing, é fazer deboucing, tanto ao sensor como aos botões.
Para além de que tens para ai delays que nunca mais acabam, usa o conceito do blinky without delays para ter esse código todo sem delays.
-
Sim parece que o problema e o bouncing( ja me custa a explicar em portugues, meu!! Muitas vezes comecam-me a faltar os termos, especialmente se forem termos tecnicos ou detalhados...INCRIVEL !!) ; Porque o codigo trabalha so com um Led! Mas o Senso tem razao , se quiseres fazer o efeito de led por led, tens que usar o millis(), porque se quiseres apagar tems que esperar que a sequencia acabe...
E ele so tem os sensores pelo que vejo, Senso. Nao tem botoes !! Eu e que assumi que fossem botoes em vez de sensores !
-
Entao e suposto trabalhar trabalhar... o codigo trabalha se fosse de quebra momentanea. Tens um Osciloscopio ?!? Pode estar a demorar bastante tempo ate estabilizar...
Como e que o Interruptor IR trabalha? ja que nao sei... Talvez tenhas que usar interrupts e especificar em rising ou falling
desde já obrigado a todos pelo tempo despendido e pelas dicas
por acaso não tenho osciloscópio, mas queria ver se arranjava um...
em principio esta funcionar :D mas agora vai ficar em aguas de bacalhau...por um mês, nao vou ter muito tempo para isto, e também de falta chegar algum material.
o problema deveria ser de estar a testar com fio, liguei os sensores e trabalha bem
cumps
-
Eu pretendo deixar a sirene da minha escola automática, e eu acho que é meio parecido com esse aqui, mas eu quero colocar um temporizador. Alguém poderia me ajudar?