Go Down

Topic: [RESOLVIDO] Código para criação de timers de modo simples. (Read 2014 times) previous topic - next topic

wizarcl

Sep 15, 2012, 07:54 pm Last Edit: Sep 17, 2012, 04:07 am by wizarcl Reason: 1
Pessoal, estou com dificuldade em criar uma função, eu quero chamar a função com um parâmetro VAR1 por exemplo e dentro da função ela carregar as demais variáveis.. tipo assim:

int xVAR1 = 1;
int yVAR1 = 2;
int zVAR1 = 3;

void setup(){
...}

int set(PARAMETRO)
{
 xPARAMETRO = 31;              // gostaria que a palavra PARAMETRO fosse substituída por VAR1
 yPARAMETRO = 50;
 zPARAMETRO = 80;
...
}

void loop(){
   set(VAR1);
}

alguem pode me ajudar? teria como criar uma função dessas semelhante para criar variáveis? No caso a função ia receber a palavra VAR1 e iria criar as variáveis xVAR1, yVAR1 e zVAR1. Tem como?
Obrigado desde já.
;)

bubulindo

procura por estruturas...

http://www.arquivodecodigos.net/dicas/c-aprenda-a-usar-estruturas-struct-em-c-2275.html
http://pt.wikibooks.org/wiki/Programar_em_C/Estruturas
http://www.dcc.fc.up.pt/~nam/aulas/9798/pi/estruturas.html

Acho que é isso que pretendes.
This... is a hobby.

wizarcl

Não sei se é bem isso, mas acho q é... só tenho q enteder agora como é que eu vou fazer isso, pq ficou um pouco confuso... hoje estou sem tempo agora, mas vou tentar e vou postar, minha intenção é facilitar para aqueles como eu que veio da programção de CLP's (em diagrama de blocos e ladder) que é mais fácil para C (que é novidade para mim ainda, mas já andei brincando com matrizes e laços no Dev)....
Mas pelo pouco que li e intendi é que do jeito que eu quero simplificar acho q n vai dar...

Vlw.

bubulindo

C é mais simples que ladder... para operações complexas.

Se juntares estruturas a ponteiros, a função faz exactamente o que pretendes.


Code: [Select]


struct point_def{
int parX;
int parY;
int parZ;
} ;


setup () {

struct point_def MyPoint;

MyPoint.parX = 1;
MyPoint.parY = 2;
MyPoint.parZ = 3;

change_par(&MyPoint);


}


change_par(struct point_def * ptr) {

ptr->parX = 5;
ptr->parY = 5;
ptr->parZ = 5;
}




This... is a hobby.

wizarcl

Obrigado bubulinho por me ajudar... lembrei me de algumas coisas quanto postou.... acho q consegui o que eu queria, da uma olhada no código e me de alguma sugestão de como posso simplificar mais... a intenção é facilitar a criação de temporizadores dentro do programa, imagino que este código seja viável quando se usar dois timers ou mais... algumas coisas não são necessárias como a função de setar e resetar e talvez nem mesmo a de criar "createTimers", pois posso declarar no global os valores das variaveis.
se voce tiver mais alguma sugestao ou alguem mais, por favor... sintam-se a vontade, estou aki para aprender e espero aprender mt.... XD

Code: [Select]
#define led 13                                // define led como pino 13
#define timers 2                              // define a quantidade de timers
boolean Tset[timers];                         // declara a variavel de set (Tset[i]) do timer[i]
boolean Tout[timers];                         // declara a variavel de saida (Tout[i]) do timer[i]
unsigned long Tstart[timers];                 // declara a variavel de ponto de partida (Tstart[i] do timer[i]
unsigned int Ttemp[timers] = {1000, 50};      // declara os tempos dos timers

void createTimers(){                          // funcao para atribuir os valores dos timers
  for (short i = 0 ; i <= timers ; i++){      // realiza a varredura de timer[i]
    Tset[i] = false;                          // atribui o valor inicial de set do timer[i] como falso
    Tout[i] = LOW;                            // atribui o valor inicial de saida do timer[i] como baixo
    Tstart[i] = 0;                            // atribui o valor inicial do tempo de partida do timer[i] como 0
  }
}

void checkTimers(){                            // funcao para verificacao dos timers
  for (short i = 0 ; i <= timers ; i++){       // realiza a varredura dos timers
    if (Tset[i] == true && Tstart[i] == 0)     // se o timer[i] estiver setado Tset[i] e seu valor inicial Tstart[i] em 0
      Tstart[i] = millis();                    // atribui o valor inicial Tstart[i] do timer[i] com valor atual de millis()
    if (Tset[i] == true && Tstart[i] != 0){    // se o timer[i] estiver setado e seu valor inicial nao for 0
      if (millis() - Tstart[i] >= Ttemp[i])    // verifica se ja trancorreu o tempo Ttemp[i] setado do timer[i]
        Tout[i] = HIGH;                        // se ja tiver transcorrido, leva a saida Tout[i] do timer[i] em nivel alto
    }
    else{                                      // se o timer[i] nao estiver setado
      Tout[i] = LOW;                           // mantem sua saida Tout[i] em nivel baixo
      Tstart[i] = 0;                           // e o tempo de partida Tstart[i] em 0
    }
  }
}

void setTimer(unsigned short i){               // funcao para setar o timer[i], recebe o numero do timer
  Tset[i] = true;                              // seta Tset[i] do timer[i] como verdadeiro
}

void resetTimer(unsigned short i){            // funcao para resetar o timer[i], recebe o numero do timer
  Tset[i] = false;                            // seta Tset[i] do timer[i] como falso
}

void setup(){               
  pinMode (led, OUTPUT);     // seta o pino 13 - led - como saida digital
  Serial.begin(9600);        // abre porta de comunicacao - para diagnose
  createTimers();            // carrega a funcao de atribuicao de valores das variaveis de cada timer
}

void loop(){
  checkTimers();            // carrega a funcao de verificacao dos timers
  setTimer(0);              // liga timer 0
  if (Tout[0] == HIGH)      // se a saida do timer 0 estiver em nivel alto
    setTimer(1);            // liga o timer 1
  if (Tout[1] == HIGH){     // se a saida do timer 1 estiver em nivel alto
    resetTimer(0);          // reseta o timer 0
    resetTimer(1);          // reseta o tmer 1
  }
  digitalWrite (led, Tout[0]);   // escreve saida digital no pino 13 como o estado da saida do timer 0
}

Fernando d'RG

Há uma maneira mais "bonita", que utiliza ponteiro. Descrevo abaixo:

1º passo: Sua função setTimer deve ficar assim:

void setTimer(boolean *timer) {
  timer = true;
}

2º passo: alterar a chamada da função setTimer para:

setTimer(&Tset[N]);
// onde N é igual à posição do timer na lista
Fernando Gonçalves (FdRG) - Business Intelligence / Data Warehouse
 - Cell: (21) 8181-8725
 - Skype: fernando.drg
 - Mail: fernandodrg@me.co

Go Up