Pages: [1]   Go Down
Author Topic: [RESOLVIDO] Código para criação de timers de modo simples.  (Read 1503 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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á.
 smiley-wink
« Last Edit: September 16, 2012, 09:07:46 pm by wizarcl » Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3107
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3107
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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


Code:

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;
}




Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.... smiley-lol

Code:
#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
}
Logged

Brazil (CE)
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Um guitarrista de sistemas ou, se preferir, um analista de guitarras.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Fernando Gonçalves (FdRG) - Business Intelligence / Data Warehouse
 - Cell: (21) 8181-8725
 - Skype: fernando.drg
 - Mail: fernandodrg@me.co

Pages: [1]   Go Up
Jump to: