Conexão mqtt e sensor clap

Me ajudem por favor tenho 2 codigos 1 faz o clap funcionar e o outro faz a conexão via mqtt mas quando implemento os 2 o clap não funciona mais e o mqtt não conecta.

/* ******************** Interruptor Clap Manual do Mundo ********************

Criado por: Fernando A Souza
Rev.: 01
Data: 03.08.2019

Guia de conexão:

Arduino:
SENSOR SOM OUT: Pino Digital 3
RELÉ IN1: Pino Digital 4
RELÉ IN2: Pino Digital 5
RELÉ IN3: Pino Digital 6
RELÉ IN4: Pino Digital 7

Sensor de Som (Módulo LM393):
GND: GDN Arduino
VCC: 5V Arduino

Módulo Relé:
GND: GDN Arduino
VCC: 5V Arduino

OBS.:

  • Além das ligações com o Arduino também devem ser conectadas ao módulo relé as cargas que serão controladas por ele.
    A entrada acontece pelo borne central de cada relé e a saída pelos laterais, variando entre direita ou esquerda conforme a necessidade de ligar(normalmente aberto) ou desligar(normalmente fechado).
  • Observe o consumo de corrente dos aparelhos que serão controlados pelos relés, normalmente o limite deles varia de 10A até 15A.

***************************************************************************** */

/**************************** DEFINIÇÕES ************************************* */

// Os números associados a cada variável seguem o guia de conexões e representam as portas digitais usadas.
#define releUm 4
#define releDois 5
#define releTres 6
#define releQuatro 7
#define sensorSom 3

/***************************************************************************** */

/************************ VARIÁVEIS AUXILIARES ******************************* */

// Essas variáveis definem alguns parâmetros do programa e auxiliam na detecção e contagem das palmas.
int delayfinal = 100; //Valor representa um tempo em milissegundos, esse tempo é aguardado pelo programa para que se inicie novamente o loop.
int duracaoPalma = 200; //Valor representa um tempo em milissegundos, é o tempo que dura o som de uma palma, precisa ser calibrado entre 100 e 250.
int intervaloPalmas = 500; //Valor representa um tempo em milissegundos, é o intervalo máximo permitido entre uma sequência de palmas.
int quantidadePalmas = 0; //Quantidade de palmas registradas.
long momentoPalma = 0; //Marcador usado para a detecção das palmas, será utilizado junto com a função millis.
long esperaPalmas = 0; //Marcador usado para contagem dos intervalos de tempo, será utilizado junto com a função millis.

/***************************************************************************** */

/******************* CONFIGURAÇÕES INICIAIS DO CÓDIGO ************************ */

void setup() {

// Definição da função de cada pino, se vão receber (INPUT) ou enviar (OUTPUT) informações.
pinMode(sensorSom,INPUT);
pinMode(releUm,OUTPUT);
pinMode(releDois,OUTPUT);
pinMode(releTres,OUTPUT);
pinMode(releQuatro,OUTPUT);

// Inicia todos os relés na posição na qual os contatos estão desligados. Nosso módulo relé tem a lógica invertida HIGH desliga as portas, verifique se o usado por você também apresenta a mesma lógica.
digitalWrite(releUm,HIGH);
digitalWrite(releDois,HIGH);
digitalWrite(releTres,HIGH);
digitalWrite(releQuatro,HIGH);

}

/***************************************************************************** */

/********************* EXECUÇÃO DO CÓDIGO QUE SE REPETE ********************** */

void loop() {

//Faz a leitura digital do sensor de som, quando este sensor detecta som ele desliga a porta de entrada, mudando seu estado para LOW e quando não detecta mantem em HIGH.
int leituraSom = digitalRead(sensorSom);

//Ações quando o sensor detectar som, ou seja, entrar em LOW.
if (leituraSom == LOW) {

 //Marca o momento da palma, soma a quantidade de palmas e aguarda um intervalo para não marcar a mesma palma mais de uma vez. 
 if (momentoPalma == 0) {
    momentoPalma = esperaPalmas = millis();
    quantidadePalmas = quantidadePalmas + 1; 
 } else if ((millis() - momentoPalma) >= duracaoPalma) {
    momentoPalma = 0;
 }

}

//Verifica se nenhuma palma mais pode ser dada, e em seguida faz o acionamento dos relés conforme o número de palmas já registrado.
if (((millis() - esperaPalmas) > intervaloPalmas) && (quantidadePalmas != 0)) {

if(quantidadePalmas == 1){
   digitalWrite(releUm, !digitalRead(releUm));          //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }
if(quantidadePalmas == 2){
   digitalWrite(releDois, !digitalRead(releDois));      //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }  
if(quantidadePalmas == 3){
   digitalWrite(releTres, !digitalRead(releTres));      //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }
if(quantidadePalmas == 4){
   digitalWrite(releQuatro, !digitalRead(releQuatro));  //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }


 delay(delayfinal);     //Tempo de espera para continuar o programa, esse tempo é importante para evitar efeitos de possiveis detecções truncadas de ecos e reverberações no som. 
 quantidadePalmas = 0;  //Retoma a condição inicial da quantidade de palmas. 

}

}

/***************************************************************************** */
esse é o codigo do sensor de palma.

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Endereçamento IP utilizado para o cliente e servidor
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 50);
IPAddress server(192, 168, 1, 54);

EthernetClient ethClient;
PubSubClient client(ethClient);

// Os números associados a cada variável seguem o guia de conexões e representam as portas digitais usadas.
#define releUm 4
#define releDois 5
#define releTres 6
#define releQuatro 7
#define sensorSom 3

// Essas variáveis definem alguns parâmetros do programa e auxiliam na detecção e contagem das palmas.
int delayfinal = 100; //Valor representa um tempo em milissegundos, esse tempo é aguardado pelo programa para que se inicie novamente o loop.
int duracaoPalma = 200; //Valor representa um tempo em milissegundos, é o tempo que dura o som de uma palma, precisa ser calibrado entre 100 e 250.
int intervaloPalmas = 500; //Valor representa um tempo em milissegundos, é o intervalo máximo permitido entre uma sequência de palmas.
int quantidadePalmas = 0; //Quantidade de palmas registradas.
long momentoPalma = 0; //Marcador usado para a detecção das palmas, será utilizado junto com a função millis.
long esperaPalmas = 0; //Marcador usado para contagem dos intervalos de tempo, será utilizado junto com a função millis.

//Função callback chamada quando uma mensagem for recebida para subscrições:
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i=0;i<length;i++) {
Serial.print((char)payload[i]);
}
Serial.println();

if ((char)payload[0] == '1') {
Serial.print("Equipamento ligado");
} else if ((char)payload[0] == '0') {
Serial.print("Equipamento Desligado");
}
}

void setup(){

// Definição da função de cada pino, se vão receber (INPUT) ou enviar (OUTPUT) informações.
pinMode(sensorSom,INPUT);
pinMode(releUm,OUTPUT);
pinMode(releDois,OUTPUT);
pinMode(releTres,OUTPUT);
pinMode(releQuatro,OUTPUT);

// Inicia todos os relés na posição na qual os contatos estão desligados. Nosso módulo relé tem a lógica invertida HIGH desliga as portas, verifique se o usado por você também apresenta a mesma lógica.
digitalWrite(releUm,HIGH);
digitalWrite(releDois,HIGH);
digitalWrite(releTres,HIGH);
digitalWrite(releQuatro,HIGH);

Serial.begin(57600);

client.setServer(server, 1883);
client.setCallback(callback);

Ethernet.begin(mac, ip);
delay(5000); // Allow the hardware to sort itself out

delay(10000);

}

void loop(){

// Aguarda conexão
while (!client.connected()) {
//Faz a leitura digital do sensor de som, quando este sensor detecta som ele desliga a porta de entrada, mudando seu estado para LOW e quando não detecta mantem em HIGH.
int leituraSom = digitalRead(sensorSom);

//Ações quando o sensor detectar som, ou seja, entrar em LOW.
if (leituraSom == LOW) {

 //Marca o momento da palma, soma a quantidade de palmas e aguarda um intervalo para não marcar a mesma palma mais de uma vez. 
 if (momentoPalma == 0) {
    momentoPalma = esperaPalmas = millis();
    quantidadePalmas = quantidadePalmas + 1; 
 } else if ((millis() - momentoPalma) >= duracaoPalma) {
    momentoPalma = 0;
 }

}

//Verifica se nenhuma palma mais pode ser dada, e em seguida faz o acionamento dos relés conforme o número de palmas já registrado.
if (((millis() - esperaPalmas) > intervaloPalmas) && (quantidadePalmas != 0)) {

if(quantidadePalmas == 1){
   digitalWrite(releUm, !digitalRead(releUm));          //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }
if(quantidadePalmas == 2){
   digitalWrite(releDois, !digitalRead(releDois));      //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }  
if(quantidadePalmas == 3){
   digitalWrite(releTres, !digitalRead(releTres));      //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }
if(quantidadePalmas == 4){
   digitalWrite(releQuatro, !digitalRead(releQuatro));  //O sinal de exclamação inverte a condição do relé, se estava ligado será desligado e vice versa. 
   }


 delay(delayfinal);     //Tempo de espera para continuar o programa, esse tempo é importante para evitar efeitos de possiveis detecções truncadas de ecos e reverberações no som. 
 quantidadePalmas = 0;  //Retoma a condição inicial da quantidade de palmas. 

}

Serial.print("Attempting MQTT connection...");

//Mensagem lastWill
byte willQoS = 0;
const char* willTopic = "arduino/status";
const char* willMessage = "OFF_LINE";
boolean willRetain = true;
//Conexão
if (client.connect("arduinoClient", willTopic, willQoS, willRetain, willMessage)) {
  Serial.println("connected");
  //Uma vez conectado publica status
  char* message = "ON_LINE";
  int length = strlen(message);
  boolean retained = true; //Retain message
  client.publish("arduino/status", (byte*)message, length, retained);
  // ... and resubscribe
  client.subscribe("arduino/Palma");
} else {
  Serial.print("failed, rc=");
  Serial.print(client.state());
  Serial.println(" try again in 5 seconds");
  delay(5000);
}

}
//Uma vez conectado client.loop() deve ser chamada periodicamente para manter conexão
//e aguardar recebimento de mensagens
client.loop();{

}

}
e esse é ele implementado no codigo de conexão com o mqtt o que esta errado ???

Olá,

Para facilitar a compreensão do problema edita a mensagem/post inicial colocando o código de cada ficheiro num bloco de código (neste caso 2 blocos de código, 1 para cada ficheiro).

Para fazer um bloco de código na mensagem/post basta clicar no botão </> numa linha nova e colar o código ou digitar três acentos graves seguidos, no inicio e no fim de cada bloco de código.

Um esquema do circuito geralmente também ajuda muito a compreender como o circuito está montado. Basta uma foto do esquema desenhado em papel. Um esquema simples em papel pode ser feito em 5 minutos...

Qual o Arduino que estás a usar? Arduino Uno? Com o Ethernet shield?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.