Go Down

Topic: ajuda com delay (Read 1 time) previous topic - next topic

rafa_mazali

pessoal fiz este programa e esta funcionando até aqui

int ldrPin = 0;
int leituraldr = 0;
int farolPin = 9;
int setaePin = 11;
int setadPin = 12;
int homecomPin = 13;
int setae = 0;
int setad = 0;
long intervalo = 30000;
void setup() {

Serial.begin(9600);
pinMode(farolPin, OUTPUT);
pinMode(setaePin, INPUT);
pinMode(setadPin, INPUT);
pinMode(homecomPin, OUTPUT);
}
void loop(){
leituraldr = analogRead(ldrPin);
setae = digitalRead(setaePin);
setad = digitalRead(setadPin);

Serial.print(leituraldr);

long tempo = millis();

if (leituraldr < 500){
  digitalWrite(farolPin, HIGH);
} else
    digitalWrite(farolPin, LOW);

if (setae == HIGH & setad == HIGH) {
digitalWrite(homecomPin, HIGH);
delay(30000)
}
else {
digitalWrite(homecomPin, LOW);
}

}

reparem onde tem um delay de 30s, eu gostaria que quando executasse aquele bloco if quando homecomPin estivesse em HIGH ele ficasse por 30s e depois apagasse, porém colocando o delay ali ele bloqueia o programa por 30s fazendo com que as outras açoes também fiquem bloqueadas e não é isso que quero,, como posso arrumar isto?

obrigado

bubulindo

existe um exemplo blink without delay...

Code: [Select]

#define TIMEOUT   30000

unsigned long on_time = 0;
unsigned char running = 0;

...

if (setae == HIGH & setad == HIGH) {
   digitalWrite(homecomPin, HIGH);
   on_time = millis();
   running = 1;
}

if (running == 1) {
   if (millis() - on_time >= TIMEOUT){ // passaram 30 segundos
      digitalWrite(homecomPin, LOW);
      running = 0;
   }
}

}


Nota que assim, só quando a condição inicial for negativa é que o programa começa a contar os 30 segundos.
Se quiseres que comece a contar logo desde que a condição passou a verdadeira, podes usar a flag running como uma detecção de flanco e evitar voltar a esse pedaço de código.

Queres explicar o que pretendes fazer com isto para podermos dar ideias melhores?
This... is a hobby.

rafa_mazali

bubulindo funcionou perfeitamente deste modo, muito obrigado..

aproveitando o tópico, sabe me dizer se attiny85 tem porta analógica e quantas? pretendo ligar um ldr nele, sera que funciona?

obrigado

bubulindo

Se quiseres usar o pino de reset, 3 portas analögicas. Se não o quiseres usar, 4.

Vê auqi http://www.atmel.com/Images/doc2586.pdf
This... is a hobby.

rafa_mazali

bubulindo me da um help aqui,,,

fiz o programa usando o pino 1 (pb5) do attiny definindo ele como output, mas só de alimentar o attiny quando o led deveria estar apagado fica um brilho beemm fraquinho nele

o que pode ser?

bubulindo

O pino 1 é o reset... e se não mudaste o fuse RSTDISBL, esse pino só serve para a funcão de reset.

Se experimentares outro pino, certamente que funciona... desde que mantenhas o pino de Reset com 5V.
This... is a hobby.

rafa_mazali

Como faço para alterar esse fuse? Preciso usar as 6 I/O do attiny

bubulindo

Isso é feito no processo de gravação do chip.

como estás a passar o programa para lá? E já agora, convém ver como usar o chip sem o Reset... eu nunca o fiz, logo não sei quais as consequências.
This... is a hobby.

rafa_mazali

Estou a usar o arduino como programmer isp

bubulindo

tenta ver como se usa um chip sem o reset... isso tem algumas implicações no processo de gravação. :\
This... is a hobby.

Go Up