Pages: [1] 2   Go Down
Author Topic: Chamar Função e voltar  (Read 7716 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bom Dia, tenho uma duvida, como faço pra retornar numa função. Exemplo:


int iControl=0;  // Variavel que controla se para ou não (0-Executar 1-Parar) na função count()

void loop(){
count();  Chama função count
if(....)
{
}
resetcount();
}

void count() {
digitalWrite(reset, LOW);
Depois de fazer a ação, a minha duvida é se ele retorna lá pro loop pra proxima função, no caso a função if OU se ele vai pra função embaixo desta, no caso o while
}

while (...)
{
}

Desculpa se não fui claro
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oi

É isso mesmo, a função "volta".

Imagine como se fossem funções matemáticas. Por exemplo:

Code:
#define TREZE 13

void setup()
{
    pinMode(TREZE, OUTPUT);
}

void loop()
{
    int n;

    n = pegarNumeroAleatorio();

    acenderLedQueEstaNoPinoTrezeDuranteUmTempo(n);
}

int pegarNumeroAleatorio()
{
    static int aleatorio = 185;
    aleatorio = 61 * ((aleatorio % 100) - (aleatorio % 10)) / 10;

    return aleatorio;
}

void acenderLedQueEstaNoPinoTrezeDuranteUmTempo(int n)
{
    digitalWrite(TREZE, HIGH);
    delay(n);

    digitalWrite(TREZE, LOW);
    delay(100);
}

Funções que começam por void não precisam retornar um valor. Podem ou não ter return; no meio da função, por exemplo, o que desvia a execução do programa a partir do ponto em que está esse return;. Se não tiver return;, a execução da função acontece de cabo a rabo, isto é, do começo ao fim dela, e o compilador se encarrega de inferir o return; no final dela.

Funções que começam por int ou outro tipo precisam necessariamente retornar um int ou uma variável do tipo respectivo, como, por exemplo, return aleatorio;, como mostrado acima.
« Last Edit: March 31, 2012, 07:39:51 am by neuron_upheaval » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Legal, entendi um pouco, é necessário colocar o return ou não necessita?
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Na função com void não é obrigatório, mas se for int, float, aí precisa.
Logged

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

Na função com void não é obrigatório, mas se for int, float, aí precisa.

Na função com void não podes meter... senão o compilador dá um erro. Mas se a função tiver outro qualquer tipo de retorno (int, char, float, double e apontadores), então convém que tenha um return porque o compilador também dará um aviso para isso.
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).

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 316
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Funciona do tipo, não quero retornar nada nessa função
Code:
void NaoRetornaNada()
   {
   .
   .
   .
   }

int RetornaInt()
    {
    return 1;
    }
Então temos uma função que não vai retornar nada e uma função que vai retornar um int.
Entendendo o VOID
http://www.vivaolinux.com.br/artigo/Ponteiros-void-na-linguagem-C
Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Interessante, porem o meu problema é que coloquei um for ate que um botão fosse pressionado e executar uma tal tarefa. Porem aperto o botão e ele simplesmente não executa nada. Alguma ideia? E uma outra duvida é, que quando não fosse pressionado por exemplo uma tecla de voltar, gostaria que ele voltasse pro começo do programa. Eu fiz porem não sei se e certo.

Quote
   
   void continualam()  {                      // SALA
     lsala();
     for (int x = 0; x <= 100; x++){
       delay(10);
       if (eem == HIGH)   {
          ligasala();
       }
       if (vol == HIGH)   {
          loop();  Aqui e onde queria que voltasse pro começo do loop
       }
       if (lade == HIGH)   {
          continualam4();
       }
       if (lad == HIGH)   {
          continualam1();
       }
     }       
   }


Aqui esta o inicio do programa:
Quote
void loop()  {
   lcd.print("   Boa Tarde   ");
   delay(1);
   lcd.setCursor(2,1);            //(0[Coluna],2[Linha])
   lcd.print("  LuquiinhaaS  ");
   lcd.home();                    //(0[Coluna],1[Linha])
   delay(10);
Logged

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

A função loop está sempre a correr e todas as funções após terminarem, retornam à loop.

Neste caso, se pretendes que a tua função retorne à loop() fazes return. Tens de alterar o tipo de retorno para int ou char e a instrução será return 0;

No entanto, neste caso o que está a passar é que o ciclo for não é a melhor maneira para fazer o que pretendes.
Repara que o ciclo espera 100 * 10 milisegundos. Isso é o tempo de perceberes que o Arduino fez reset e quando carregas na tecla, já o programa não está à espera. O ideal para estas situações é usar a função millis() e um ciclo while.

Importas-te de colocar o código todo que tens e uma descrição do que pretendes para podermos aconselhar-te melhor? O código que mostraste nos posts anteriores não faz muito sentido. smiley-sad
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
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

então, o programa que quero fazer é para um controle de automação residencial. Onde de inicio tera 8 teclas e um LCD 16x2, depois desejo transformar isso tudo em uma tela touch. Porém to começando do básico. O Seguinte, resumindo muito bem, o programa inicia e aparece uma tela de inicio. Dai ao pressionar uma tecla, vai fazer uma determinada função.

Code:
#include <LiquidCrystal.h>
// Definindo os botões do controle
const int lampada = 29;
const int aparelho = 30;
const int cima = 31;
const int ladoe = 32;
const int enteremenu = 33;
const int ladod = 34;
const int baixo = 35;
const int voltar = 36;
int lam = 0;
int apa = 0;
int cim = 0;
int lad = 0;
int bai = 0;
int lade = 0;
int eem = 0;
int vol = 0;
  
// Definindo os pinos do LCD 16x2
//LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal lcd(28, NULL, 27, 26, 25, 24, 23); // Criando Variaveis para o LCD

void setup() {
lcd.clear();                   // Limpa LCD durante SETUP
lcd.begin(16,2);               // Definindo LCD como 16x2
pinMode(lampada, INPUT);  
pinMode(aparelho, INPUT);
pinMode(cima, INPUT);
pinMode(ladod, INPUT);
pinMode(baixo, INPUT);
pinMode(ladoe, INPUT);
pinMode(enteremenu, INPUT);
pinMode(voltar, INPUT);
}

void loop()  {
   lcd.print("   Boa Tarde   ");
   delay(1);
   lcd.setCursor(2,1);            //(0[Coluna],2[Linha])
   lcd.print("  LuquiinhaaS  ");
   lcd.home();                    //(0[Coluna],1[Linha])
   delay(10);
  
  
   lam = digitalRead(lampada);
   apa = digitalRead(aparelho);
   cim = digitalRead(cima);
   lad = digitalRead(ladod);
   bai = digitalRead(baixo);
   lade = digitalRead(ladoe);
   eem = digitalRead(enteremenu);
   vol = digitalRead(voltar);
  
   delay(20);  
  
   if (lam == HIGH)   {
      continualam();
     }
    
   if (apa == HIGH)   {
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Pressionado  ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("    Aparelho   ");         //Imprime
      delay(100);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
    }
  
   if (cim == HIGH)   {
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Pressionado  ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("     Cima      ");         //Imprime
      delay(100);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
    }
  
    if (lad == HIGH)   {
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Pressionado  ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print(" Lado Direito  ");         //Imprime
      delay(100);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
     }
  
    if (bai == HIGH)   {
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Pressionado  ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("     Baixo     ");         //Imprime
      delay(100);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
     }
  
    if (lade == HIGH)   {
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Pressionado  ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print(" Lado Esquerdo ");         //Imprime
      delay(100);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
     }
  
    if (eem == HIGH)   {
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Pressionado  ");
      delay(10);                     //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("  Enter e Menu ");         //Imprime
      delay(100);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
     }
  
    if (vol == HIGH)   {
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Pressionado  ");
      delay(10);                     //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("    Voltar     ");  //Imprime
      delay(100);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
     }
 
}
  
    
   void continualam()  {                      // SALA
     lsala();
     for (int x = 0; x <= 100; x++){
       delay(10);
       if (eem == HIGH)   {
          ligasala();
       }
       if (vol == HIGH)   {
          loop();
       }
       if (lade == HIGH)   {
          continualam4();
       }
       if (lad == HIGH)   {
          continualam1();
       }
     }      
   }
  
   void continualam1()  {                      // COZINHA
     lcozi();
       delay(10);
       if (eem == HIGH)   {
          ligacozi();
       }
       if (vol == HIGH)   {
          loop();
       }
       if (lade == HIGH)   {
          continualam();
       }
       if (lad == HIGH)   {
          continualam2();
       }      
   }
 
    void continualam2()  {                      // BANHEIRO
     lbanh();
       delay(10);
       if (eem == HIGH)   {
          ligaban();
       }
       if (vol == HIGH)   {
          loop();
       }
       if (lade == HIGH)   {
          continualam1();
       }
       if (lad == HIGH)   {
          continualam3();
       }      
   }  
 
    void continualam3()  {                      // QUARTO 1
     lquar1();
       delay(10);
       if (eem == HIGH)   {
          ligaq1();
       }
       if (vol == HIGH)   {
          loop();
       }
       if (lade == HIGH)   {
          continualam2();
       }
       if (lad == HIGH)   {
          continualam4();
       }      
   }  
 
    void continualam4()  {                      // QUARTO 2
     lquar2();
       delay(10);
       if (eem == HIGH)   {
          ligaq2();
       }
       if (vol == HIGH)   {
          loop();
       }
       if (lade == HIGH)   {
          continualam3();
       }
       if (lad == HIGH)   {
          continualam1();
       }      
   }    
  
  
      
    

    

  


    void lsala()  {
      lcd.home();                    //(0[Coluna],1[Linha])  
      lcd.print("    Lampada    ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("     Sala      ");         //Imprime
    }
    
    void lcozi()  {
      lcd.home();                    //(0[Coluna],1[Linha])  
      lcd.print("    Lampada    ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("  da Cozinha   ");         //Imprime      
    }
    
    void lbanh()  {
      lcd.home();                    //(0[Coluna],1[Linha])  
      lcd.print("    Lampada    ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("  do Banheiro  ");         //Imprime
    }
    
    void lquar1()  {
      lcd.home();                    //(0[Coluna],1[Linha])  
      lcd.print("    Lampada    ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("  do Quarto 1  ");         //Imprime  
    }
    
    void lquar2()  {
      lcd.home();                    //(0[Coluna],1[Linha])  
      lcd.print("    Lampada    ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("  do Quarto 2  ");         //Imprime  
    }
      
      
  
    void ligasala()  {
      delay(10);
      lcd.home();                    //(0[Coluna],1[Linha])
      lcd.print("  Ligar a luz  ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("    da Sala    ");         //Imprime
      delay(1000);                    //Aguarda
      lcd.clear();                   //Apaga tudo no LCD, porém continua na 2ª segunda linha
   }

Desculpa se alguém não entendeu.
Logged

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

Desculpa perguntar isto... já alguma vez programaste microcontroladores?

O teu código está muito confuso relativamente ao que pretendes fazer e a maneira como chamas loop() demonstra que não dominas alguns conceitos de programação.

Repara, ao chamares a função continualam(), 

Code:
   if (lam == HIGH)   {
      continualam();  //Ao chamar esta função...
     }

O código vai correr essa função.

Code:
void continualam()  {                      // SALA
     lsala();
     for (int x = 0; x <= 100; x++){
       delay(10);
       if (eem == HIGH)   {
          ligasala();
       }
       if (vol == HIGH)   {
          loop();
       }
       if (lade == HIGH)   {
          continualam4();
       }
       if (lad == HIGH)   {
          continualam1();
       }
     }       
   }
Terminada a função, ela retorna à função loop() automaticamente e não precisas de chamar a função. Eu suspeito que o código da maneira como tens ao fim de alguns ciclos e carregares de tecla baralha a stack toda.
Se quiseres ficar a correr a função continualam até alguém carregar na tecla vol, tens de fazer um ciclo while até que essa tecla seja carregada.

Outro pormenor... se fizeres lcd.clear(), depois escusas de usar uma string com espaços. Por exemplo:

Code:
//isto...
      lcd.home();                    //(0[Coluna],1[Linha])   
      lcd.print("    Lampada    ");
      delay(10);                    //Aguarda
      lcd.setCursor(0,1);            //(0[Coluna],2[Linha])
      lcd.print("     Sala      ");         //Imprime

//ficaria isto:

      lcd.clear();
      lcd.setCursor(3,0);
      lcd.print("Lampada");
      delay(10);                    //Aguarda
      lcd.setCursor(4,1);            //(0[Coluna],2[Linha])
      lcd.print("Sala");         //Imprime

A vantagem é a poupança de memória de programa que pode ser pouca para aplicações maiores.
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
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Interessante, porém é apenas um começo. E tive programação de C, porém o básico dos básicos. Estou aprendendo mais e mais a cada dia. Valeu pelas dicas.

Uma pergunta, seria legal eu chamar as funções, digo, colocar os void's. Ou simplesmente faço tudo ao decorrer do programa evitando de usar void.
« Last Edit: April 02, 2012, 11:58:55 am by Legius » Logged

0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
Desenvolvimento de Projeto Eletronico
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu tenho algumas regras de programação que acabo usando e me facilitam a vida depois de algum tempo , pois como faço muitos programas em pouco tempo esqueço do programa que fiz:

- padronize nomes e coloque algo que tenha significado, tipo vCtxxx e uma variavel de contagem de algo, coXXX são constantes;
- torne o dados estanque em alguma struct Umidade, exemplo: tem relação com sensor de umidade - cria uma struct sensor de umidade.;
- não uso void e sempre retorno no minimo 1 (sucesso) ou - 0 falha, memo não tendo sentido no momento, no futuro pode ser util;
- crio lib´s em arquivos separados de forma a poderem ser usadas por outros programas, exemplo, le sensor de temperatura, fica em uma lib com o nome do componente;

Mas são coisas pessoais que me ajudam.

Edson

Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

É isso mesmo, a função "volta".

Por falar em volta, voltou Marcelo, tava sumido hein!
Logged

????????????????????

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vixi homi, eu tava sumido, mas agora vortei
Vortei até para Pinhais city!

Tamos na área vlw
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Na função com void não é obrigatório, mas se for int, float, aí precisa.

Na função com void não podes meter... senão o compilador dá um erro.
Pode, sim senhor, por return; no meio de uma função void. Por exemplo:
Code:
void ligarPinoDozeSePinoTrezeEstiverOn() {
    if (digitalRead(13) == LOW) {
        return;  // o fluxo de execução do programa retorna para o loop() neste ponto
    };

    digitalWrite(12, HIGH); // o fluxo de execução do programa chega aqui só se não passar por dentro do if anterior
}
Logged

Pages: [1] 2   Go Up
Jump to: