LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: amando96 em 19 de Junho de 2010, 14:39
-
Boas, estou por aqui a inventar com o arduino, e chegou-me um problema, e para ultrapassa-lo preciso de pausar uma função(preciso que ele pare de de fazer seja o que for) durante um certo tempo(que irá depender de uma variavel), como faço?
void loop()
{
count();
resetcount();
}
void count(){
digitalWrite(reset, LOW);
for(i=0;i<N;i++){
digitalWrite(countPin, HIGH);
delay(100);
digitalWrite(countPin, LOW);
delay(100);
}
N = um numero qualquer e quero pausar o void count() quando N for diferente do valor anterior que estava atribuido a ele. preciso que o código corra N vezes, e quando chegar a N("última volta") pare, até N mudar.
exemplo em portugues:
N = 5, o código corre 5 vezes, e na 5 vez pára, não faz mais nada, depois N passa a 3 por exemplo, depois faz resetcount() o código corre 3 vezes, e á terceira pára, até N mudar novamente.
Obrigado :)
-
Assim rapidamente lembrei-me disto:
int iControl=0; // Variavel que controla se para ou não (0-Executar 1-Parar) na função count()
void loop(){
count();
resetcount();
}
void count() {
digitalWrite(reset, LOW);
for(i=0;i<N;i++) {
while (iControl==1) {
//Isto faz uma pausa na função
// Para retomar basta colocar a variavel iControl=0 dentro deste ciclo;
}
digitalWrite(countPin, HIGH);
delay(100);
digitalWrite(countPin, LOW);
delay(100);
}
}
-
while(N != M){};
Se fizeres isto ele pára, mas depois só com um interrupt é que saltas desse loop para alterar um dos valores
-
M será o que?
Agora só não sei como guardar o valor de N anterior, pecisarei de outra variavel, "previousN" mas não sei como lhe dar esse valor.
E no inicio confundi-me, preciso que o código corra N vezes, e quando chegar a N("última volta") pare, até N mudar.
-
O M seria o teu previousN.
Para guardar o novo N, fazes:
If(previousN != N){
previousN = N;}
Acho eu lol, estou a pensar só a meio %, já agora, diz qual é o objectivo de parar o programa, se calhar existe uma maneira melhor de fazer o que queres fazer.
-
Usando vários CD4026 controlar uns quantos displays de 7 segmentos, usando só dois pinos do arduino.
O cd4026 recebe um pulso, e vai incrementando o numero que aparece no display a cada pulso, e tem tmb um reset que faz voltar a 0(o resetcount() activa-o)
Código todo até agora:
int icontrol = 0;
int countPin = 13;
int reset = 12;
int i = 0;
int N = 10;
void setup() {
Serial.begin(9600);
pinMode(countPin, OUTPUT);
pinMode(reset, OUTPUT);
}
void loop()
{
count();
resetcount();
}
void count(){
digitalWrite(reset, LOW);
while(icontrol == 1){
for(i=0;i<N;i++){
digitalWrite(countPin, HIGH);
delay(100); // estes delays vão ser muito menos no final, desta maneira é mais fácil debug, e ver o que se passa
digitalWrite(countPin, LOW);
delay(100);
}
}
}
void resetcount(){
if (i = N){
digitalWrite(reset, HIGH);
} else{
digitalWrite(reset, LOW);
}
}
-
O que queres é após ele ter contado até N parar e so recomeçar a contar quando indicares outro N? E ao mesmo tempo, e durante a contagem, permitires pause/continue?
Alguns bitaites:
- onde estás a alterar o valor da variável icontrol? da maneira que tens, está sempre a zero
- a variavel icontrol poderia ter 3 significados: pause (pausa a contagem), continue (continua a contagem), set (quando a contagem anterior acabou, define novo N)
- usar interrupção para definir o valor de N, e fazer icontrol=1 e i=0 (inicio de uma contagem)
- o ciclo for ficaria "for(; i < N && icontrol == 1; i++)"
- quando acaba este ciclo, mesmo que icontrol == 1 nao há mais contagem uma vez que i == N
- dá-se início a nova contagem quando voltas a carregar no botão, ocorre a interrupção (que neste caso signfinica "set")
- a função atribuida à interrupção teria que conhecer o estado do contador (através dos valores de i, N e icontrol, sabes isso facilmente)
Espero ter ajudado.
Se não for isto que querias diz que tento ajudar melhor.
-
após ele ter contado até N parar e so recomeçar a contar quando indicares outro N
Certo, durante a contagem não usarei o pause/continue.
onde estás a alterar o valor da variável icontrol? da maneira que tens, está sempre a zero
vai depender do N, e previousN, mas ainda não descobri como fazer o previousN, por isso de momento só está ali, não faz nada.
O próprio N vai ser controlado pelo arduino, quero fazer isto para poder ter mostrador de numeros de várias coisas, neste caso queria fazer um conta rotações.