Fusão de Códigos

Olá, primeiramente peço desculpas se houver equívoco na postagem

Sou iniciante em arduino e estou fazendo um projeto de automação residencial.

Desejo fazer o arduino acender lampadas através do sensor de som e também através de software de inteligência artificial "jarvis".

Não consigo juntar os dois códigos, já li que devo agrupar as "funções" em um só código como por exemplo

Void Setup do código 1

bababa

Void Setup do código 2

bebebe

Fusão dos dois ficaria

Void Setup

bababa
bebebe

Porém ao tentar fazer isso estou recebendo erros de declaração em escopo.

Segue código 1:

#define Rele1 2// Define o pino de saida para o rele 1
#define Rele2 3
#define Rele3 4

int st1 = 0;// Indica o estado comum da porta.
int st2 = 0;
int st3 = 0;

void setup() {

Serial.begin(9600) ; //Define a taxa de transmissão dos dados.

pinMode(Rele1, OUTPUT) ; //Defie o pino como saida
pinMode(Rele2, OUTPUT) ;
pinMode(Rele3, OUTPUT) ;
}

void loop() {

char c = Serial.read();// Analiza os dados recebidos
if (c == 'a') {
  if (st1 == 0) {
    digitalWrite (Rele1, HIGH) ;
    st1 = 1;
    Serial.print (" O rele da sala esta Ligado ");
  }else{
    digitalWrite(Rele1, LOW);
    st1 = 0;
    Serial.print (" O rele da sala esta Desligado ");
    delay(5000);
  }

if (c == 'b') {
  if (st2 == 0) {
    digitalWrite (Rele2, HIGH) ;
    st2 = 1;
    Serial.print (" O rele da Varanda  esta Ligado ");
  }else{
    digitalWrite(Rele2, LOW);
    st2 = 0;
    Serial.print (" O rele da Varanda esta Desligado ");
    delay(5000);
  }

if (c == 'c') {
  if (st3 == 0) {
    digitalWrite (Rele3, HIGH) ;
    st3 = 1;
    Serial.print (" O rele do Quarto  esta Ligado ");
  }else{
    digitalWrite(Rele3, LOW);
    st3 = 0;
    Serial.print (" O rele do Quarto esta Desligado ");
    delay(5000);
  }
}
}
}
}

Código 2;

#define pinSom 7
#define pinRele1 2
#define pinRele2 3
#define pinRele3 4
#define pinRele4 5
#define tempoMaximoDeUmaPalma  150 //milisegundos
#define tempoMaximoEntrePalmas 500 //milisegundos

int contaPalmas = 0;
long tempoEspera = 0;
long tempoEsperaEntrePalmas = 0;

void executarAcao();

void setup() {
pinMode(pinSom, INPUT);
pinMode(pinRele1, OUTPUT);
pinMode(pinRele2, OUTPUT);
pinMode(pinRele3, OUTPUT);

}

void loop() {
//verifica o estado do sensor de som (ele fica normalmente com a porta ligada. Quando ouver uma palma, ele desliga momentaneamente a porta)
int sensorSom = digitalRead(pinSom);

//se o sensor detectou palmas
if (sensorSom == LOW) {

   //espera um tempo para nao detectar a mesma palma mais de uma vez 
   if (tempoEspera == 0) {
      tempoEspera = tempoEsperaEntrePalmas = millis(); 
      contaPalmas++;
   } else if ((millis() - tempoEspera) >= tempoMaximoDeUmaPalma) {
      tempoEspera = 0;
   }
}

//caso exceda o tempo maximo entre palmas, zera o contador de palmas
if ( (contaPalmas != 0) && ((millis() - tempoEsperaEntrePalmas) > 500) ) {
   executarAcao();
   contaPalmas = 0;
   tempoEsperaEntrePalmas = millis();
}

}


void executarAcao() 
{

switch (contaPalmas) {
  case 1: 
     digitalWrite(pinRele1, !digitalRead(pinRele1));
     break;
  case 2:
     digitalWrite(pinRele2, !digitalRead(pinRele2));
     break;
  case 3:
     digitalWrite(pinRele3, !digitalRead(pinRele3));
     break;

}
}

Como faço para juntar os dois?

Desde já agradeço, sou iniciante e não entendo nada de programação.

Que erros de declaração estás a receber?

Muito provavelmente o teu erro é que não estás a copiar também a definição das variáveis ou instruções de compilador.

Por exemplo, a tua função setup() como explicaste seria algo como a que está em baixo.

void setup() {

Serial.begin(9600) ; //Define a taxa de transmissão dos dados.

pinMode(Rele1, OUTPUT) ; //Defie o pino como saida
pinMode(Rele2, OUTPUT) ;
pinMode(Rele3, OUTPUT) ;
//setup do código dois
pinMode(pinSom, INPUT);
pinMode(pinRele1, OUTPUT);
pinMode(pinRele2, OUTPUT);
pinMode(pinRele3, OUTPUT);

}

No entanto, se copiaste o código do ficheiro dois para o ficheiro um, o compilador ao chegar à linha:

pinMode(pinSom, INPUT);

não vai saber o que é o símbolo pinSom porque a definição do mesmo está num ficheiro diferente que não copiaste para o ficheiro 1.
Assim sendo, para te veres livres desses erros tens de copiar a definição do símbolo.

Ou seja, o pedaço de código em baixo:

#define pinSom 7
#define pinRele1 2
#define pinRele2 3
#define pinRele3 4
#define pinRele4 5
#define tempoMaximoDeUmaPalma  150 //milisegundos
#define tempoMaximoEntrePalmas 500 //milisegundos

int contaPalmas = 0;
long tempoEspera = 0;
long tempoEsperaEntrePalmas = 0;

void executarAcao();

Nota que tens também de copiar as funções todas.

Em resumo, o que te disseram não é exactamente correcto. A maneira correcta de dizer como juntar os códigos é:

  • Copia o conteúdo do ficheiro 2 para dentro do ficheiro 1. Isto vai deixar-te com duas funções setup e duas funções loop.
  • Copia o conteúdo duma das funções loop para dentro da outra e o mesmo para a função de setup.
  • Adapta o conteúdo da função loop para a aplicação que queres. Por vezes algumas instruções têm de ser chamadas antes de outras ou algo assim.

Experimenta como disse e reporta se tiveres mais problemas.