Duvida com funções

boa tarde, estou tentando adaptar um codigo para funções, porem não esta funcionando, estou criando um teclado com arduino leonardo, estou passando os parametros para função e buscando no return, mas não esta funcionando.
desde ja agradeço.`

#include "Keyboard.h" // inclui a biblioteca de controle do teclado
int chave = 10;
int estado = 0;

   
//declaraçao de variaveis

unsigned long lastmillis1 = 0;
unsigned long lastmillis2 = 0;
unsigned long lastmillis3 = 0;

bool lastRead1 = 0;
bool lastRead2 = 0;
bool lastRead3 = 0;

bool buttonState1 = 0;
bool buttonState2 = 0;
bool buttonState3 = 0;

//tempo para evitar interferencia
#define debounceDelay 50

void setup() {
  //declara os pinos dos botoes como entrada

  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(10, INPUT);
  Serial.begin(9600);

  Keyboard.begin(); // inicia a keyboard

}

void loop() {


    int leitura1 = digitalRead(3);
    int leitura2 = digitalRead(4);
    int leitura3 = digitalRead(5);


  estado = digitalRead(chave);
  if (estado == HIGH) {

    //armazena os valores dos botoes
  
    //verifica a quanto tempo foi pressionado pela ultima
    if (leitura1 != lastRead1) {
      lastmillis1 = millis();
      botao1(leitura1 , lastRead1, lastmillis1 );
    }

    if (leitura2 != lastRead2) {
      lastmillis2 = millis();
      botao2(leitura2 ,lastRead2, lastmillis2);
    }

    if (leitura3 != lastRead3) {
      lastmillis3 = millis();
      botao3(leitura3 ,lastRead3, lastmillis3  );
    }

  }
}


unsigned long botao1(int leitura1, bool lastRead1, unsigned longlastmillis1) {
  if ((millis() - lastmillis1) > debounceDelay) { //se ja faz 50 milisegundos
    if (leitura1 != buttonState1) {// e o botao foi precionado ou mudou de estado
      buttonState1 = leitura1;

      if (buttonState1 == HIGH) { // e tiver em high
        Keyboard.press(KEY_LEFT_CTRL); // pressiona a tecla ctrl
        Keyboard.press('c'); // preciona a tecla c
        delay(500); // espera 500 ms
        Keyboard.releaseAll(); // solta os botoes

        Serial.println("ctrl c");
      }
    }
    
  }

  lastRead1 = leitura1;// atribui para o valor anterior
  //return leitura1;
  return lastRead1;
  return lastmillis1;
}
//repete esse mesmo processo para os outros botoes

unsigned long botao2(int leitura2, bool lastRead2, unsigned longlastmillis2) {
  if ((millis() - lastmillis2) > debounceDelay) {
    if (leitura2 != buttonState2) {
      buttonState2 = leitura2;

      if (buttonState2 == HIGH) {
        Keyboard.press(KEY_LEFT_CTRL);
        Keyboard.press('v');
        delay(500);
        Keyboard.releaseAll();

        Serial.println("ctrl v");
      }
    }
  }

  lastRead2 = leitura2;
  //return leitura2;
  return lastRead2;
  return lastmillis2;
}

unsigned long botao3(int leitura3, bool lastRead3, unsigned longlastmillis3) {
  if ((millis() - lastmillis3) > debounceDelay) {
    if (leitura3 != buttonState3) {
      buttonState3 = leitura3;

      if (buttonState3 == HIGH) {
        Keyboard.press(KEY_LEFT_CTRL);
        Keyboard.press('a');
        delay(500);
        Keyboard.releaseAll();

        Serial.println("ctrl a");
      }
    }
  }

  lastRead3 = leitura3;
  //return leitura3;
  return lastRead3;
  return lastmillis3;
}

Olá @junior_jr

  1. Para obter o resultado retornado por uma função você precisa ter uma variavel para receber este resultado.

Ex:
variavelX = botao2(leitura2 ,lastRead2, lastmillis2);
variavely = botao3(leitura3 ,lastRead3, lastmillis3 );

no caso das suas funções a variaveX e a variavelY deverão ser do tipo indicado pela função, que no seu código é "unsigned long".

  1. Uma variável só retorna um valor por vez.
    Assim, estes 2 returns das suas funções, só o primeiro valor retornará,
    pois no primeiro return a função termina e não executa o segundo:

return lastRead2; <<< só este retornará nesta função
return lastmillis2;:

return lastRead3; <<< só este retornará nesta função
return lastmillis3;

RV mineirin

O que pretendes fazer?

bom dia RV, obrigado pela resposta, estou buscando um pouco mais de conhecimento sobre funções, fiz uma adaptação no código, agora não de nenhum return, (tambem não saboia que é somente um return por função). porem acho que o codigo não ficou enxuto (parece meio poluído) porem esta funcional.

#include "Keyboard.h" // inclui a biblioteca de controle do teclado
int chave = 13;
int estado = 0;

//declaraçao de variaveis

unsigned long lastmillis1 = 0;
unsigned long lastmillis2 = 0;
unsigned long lastmillis3 = 0;

bool lastRead1 = 0;
bool lastRead2 = 0;
bool lastRead3 = 0;

bool buttonState1 = 0;
bool buttonState2 = 0;
bool buttonState3 = 0;

//tempo para evitar interferencia
#define debounceDelay 50

void setup() {
  //declara os pinos dos botoes como entrada

  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(10, INPUT);
  Serial.begin(9600);

  Keyboard.begin(); // inicia a keyboard

}

void loop() {

  estado = digitalRead(chave);
  if (estado == HIGH) {

    //armazena os valores dos botoes
    bool leitura1 = digitalRead(3);
    bool leitura2 = digitalRead(4);
    bool leitura3 = digitalRead(5);

    //verifica a quanto tempo foi pressionado pela ultima
    if (leitura1 != lastRead1) {
      lastmillis1 = millis();
    }
    if (leitura2 != lastRead2) {
      lastmillis2 = millis();
    }
    if (leitura3 != lastRead3) {
      lastmillis3 = millis();
    }

    if ((millis() - lastmillis1) > debounceDelay) { //se ja faz 50 milisegundos
      if (leitura1 != buttonState1) {// e o botao foi precionado ou mudou de estado
        buttonState1 = leitura1;

       botao1();
      }
    }

    lastRead1 = leitura1;// atribui para o valor anterior

    //repete esse mesmo processo para os outros botoes

    if ((millis() - lastmillis2) > debounceDelay) {
      if (leitura2 != buttonState2) {
        buttonState2 = leitura2;

       botao2();
      }
    }

    lastRead2 = leitura2;

    if ((millis() - lastmillis3) > debounceDelay) {
      if (leitura3 != buttonState3) {
        buttonState3 = leitura3;

        botao3();
      }
    }

    lastRead3 = leitura3;
  }
}

void botao1() {
  if (buttonState1 == HIGH) { // e tiver em high
    Keyboard.press(KEY_LEFT_CTRL); // pressiona a tecla ctrl
    Keyboard.press('c'); // preciona a tecla c
    delay(500); // espera 500 ms
    Keyboard.releaseAll(); // solta os botoes

    Serial.println("ctrl c");
  }
}


void botao2() {
  if (buttonState2 == HIGH) {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('v');
    delay(500);
    Keyboard.releaseAll();

    Serial.println("ctrl v");
  }
}


void botao3() {
  if (buttonState3 == HIGH) {
    Keyboard.press(KEY_LEFT_CTRL);
    Keyboard.press('a');
    delay(500);
    Keyboard.releaseAll();

    Serial.println("ctrl a");
  }
}

bom dia bubulindo, estou criando um atalho para Windows, e do código original, estava tentando separar partes do código(funções) para ficar visivelmente melhor. porem sem êxito. o primeiro que fiz compilava, porem não funcionava, esse segundo é funcional, porem acho que esta um pouco desorganizado ainda, pretendia fazer toda a parte do millis dentro de uma função, porem estava tendo dificuldades com a mesma

ola novamente, fiz algumas mudanças como vc comentou, um programa simples, somente para fixar suas novas considerações, fiz algumas coisas totalmente diferente do que vc recomendou, funcionou, porem acredito que em um programa mais complexo poderia dar problemas.
se possível gostaria de algumas observações sobre isso, a fim de evitar futuros problemas nos códigos.
Fiz os comentários no código, das partes que me geraram duvidas.
desde ja, novamente grato

int result1 = 0; // declaraçao de variaveis
int result2 = 0;

void setup() {

  Serial.begin(9600);
}

void loop() {

  incrementa(); // criei a função, porem não criei uma variavel para ele ex "varx =incrementa()"
  Serial.print("primeiro resultado >> ");
  Serial.println(result1);   // imprime resultado 1
  Serial.print("segundo resultado >> ");
  Serial.println(result2); //imprime resultado 2
  Serial.println(""); // pula linha
  Serial.println(""); // pula linha
  delay(3000);
}

void incrementa() { // executei a função com um void, e mesmo assim ela me retornou o valor
  result1 = 1 + 1; // atribui a result1 (1+1)
  result2 = 2 + 2; // atribui a result2 (2+2)
  return result1;   // obtive o return do resultado 1;
  return result2;   // obtive o return do resultado 1;
// no teste os 2 return funcionaram normalmente, mas isso poderia gerar algum conflito de informação?
  
}

Ola,
minha sugestão:
Estude C++.
Aqui tem um bom curso: www.learncpp.com

RV mineirin

Acho que deves estudar um pouco sobre funções.

Vê aqui:

https://www.inf.pucrs.br/~pinho/LaproI/Funcoes/AulaDeFuncoes.htm

perfeito RV, obrigado pelo link, vou estudar :+1: :+1:

show, obrigado por compartilhar o link, vou estudar sim :+1: :+1: