Sensor de som não funciona

Tenho um projeto com ESP32 para ler o valor de um sensor de som e enviar uma mensagem via wifi caso a condição seja satisfeita. A lógica como um todo funciona, mas o sensor fica com a leitura fixada em 0.

#include "HardwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <WiFi.h>    
#include <HTTPClient.h>
#include <UrlEncode.h>

//
const byte RXD2 = 16; // Connects to module's RX 
const byte TXD2 = 17; // Connects to module's TX 

const char* ssid = "WiFI_name";
const char* password = "00000000";

String phoneNumber = "+550012345678";
String apiKey = "00000000";

HardwareSerial dfSD(1); // Use UART channel 1
DFRobotDFPlayerMini player;

int analog = 13; // O pino 13 contem o sensor de som
//int  valor_A0 = 0; // Cria uma variável do tipo inteiro(int) chamada valor_A0 e atribui-lhe o valor 0
int n = 0;



void setup() 
{
  Serial.begin(9600);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
  
  pinMode(analog, INPUT); // Define o pino 13 como saída
  dfSD.begin(9600, SERIAL_8N1, RXD2, TXD2);  // 16,17
  delay(5000);

  if (player.begin(dfSD)) 
  {
    Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(20); //30 is very loud
  } 
  else 
  {
    Serial.println("Connecting to DFPlayer Mini failed!");
  }
}

void loop() 
{
  int valor_A0 = analogRead(analog);// A variavel  valor_A0 recebe a leitura digital do pino 13 onde o sensor esta
  Serial.print("\nSaida A0: "); // Imprime no serial monitor "\nSaida A0: "
  Serial.print(valor_A0); // Imprime no serial monitor o valor que a variável valor_A0 recebeu

  if (valor_A0 < 900) {
  Serial.println("Playing #1");
  player.play(1);
  Serial.println("play start");
  delay(3000);
  Serial.println("played");
  delay(1000);
  n = n+1;
  Serial.println(n);
  }

  if (n == 3) {
      sendMessage("Muito barulho!!");
      n = 0;
  }
}

//função para enviar mensagem
void sendMessage(String message){

  // Data to send with HTTP POST
  String url = "https://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&text=" + urlEncode(message) + "&apikey=" + apiKey;    
  HTTPClient http;
  http.begin(url);

  // Specify content-type header
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  
  // Send HTTP POST request
  int httpResponseCode = http.POST(url);
  if (httpResponseCode == 200){
    Serial.print("Message sent successfully");
  }
  else{
    Serial.println("Error sending the message");
    Serial.print("HTTP response code: ");
    Serial.println(httpResponseCode);
  }

  // Free resources
  http.end();
}

O detalhe é que removendo as funções referentes a comunicação wifi, o sensor funciona normalmente

#include "HardwareSerial.h"
#include "DFRobotDFPlayerMini.h"

//
const byte RXD2 = 16; // Connects to module's RX 
const byte TXD2 = 17; // Connects to module's TX 

HardwareSerial dfSD(1); // Use UART channel 1
DFRobotDFPlayerMini player;


int analog = 13; // O pino 13 contem o sensor de som
int  valor_A0 = 0; // Cria uma variável do tipo inteiro(int) chamada valor_A0 e atribui-lhe o valor 0

void setup() 
{
  Serial.begin(19200);
  pinMode(analog, INPUT); // Define o pino 13 como saída
  dfSD.begin(9600, SERIAL_8N1, RXD2, TXD2);  // 16,17
  delay(5000);

  if (player.begin(dfSD)) 
  {
    Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(20); //30 is very loud
  } 
  else 
  {
    Serial.println("Connecting to DFPlayer Mini failed!");
  }
}

void loop() 
{
  valor_A0 = analogRead(analog);// A variavel  valor_A0 recebe a leitura digital do pino 13 onde o sensor esta
  Serial.print("\nSaida A0: "); // Imprime no serial monitor "\nSaida A0: "
  Serial.print(valor_A0); // Imprime no serial monitor o valor que a variável valor_A0 recebeu

  if (valor_A0 < 900) {
  Serial.println("Playing #1");
  player.play(1);
  Serial.println("play start");
  delay(100000);
  Serial.println("played");
  delay(1000);
  }
}

Alguém consegue ver o problema?

Para que serve a variável n?

E se tirares as funções de leitura do sensor, as mensagens funcionam?

A variável n é um contador
A mensagem só será enviada se o limite de som for ultrapassado 3 vezes.

Sim, apenas enviando a mensagem funciona normalmente.

A mensagem só será enviada se o limite de som for ultrapassado 3 vezes.

Errado. A mensagem será enviada se a leitura for menor que 900 por mais de 12 segundos... Não é a mesma coisa que 3 vezes.

Que placa ao certo estás a utilizar? Como a estás a alimentar?

Pelo que vi no monitor serial, quando uma leitura é identificada abaixo de 900, o programa "pausa" as leituras para reproduzir o áudio (que equivale aos 4 segundos) e depois volta a ler constantemente.

Estou usando o esp32 nodeMCU e a alimentação é pela própria porta USB.

Só para constar, essa é a resposta no monitor serial:

12:46:03.671 -> Saida A0: 0Playing #1
12:46:03.671 -> play start
12:46:06.670 -> played
12:46:07.703 -> 1
12:46:07.703 -> 
12:46:07.703 -> Saida A0: 0Playing #1
12:46:07.703 -> play start
12:46:10.698 -> played
12:46:11.698 -> 2
12:46:11.698 -> 
12:46:11.698 -> Saida A0: 0Playing #1
12:46:11.698 -> play start
12:46:14.689 -> played
12:46:15.673 -> 3
12:46:17.829 -> Message sent successfully

A lógica é exatamente essa, só o sensor que está lendo 0 constantemente.
Troquei o pino analógico e também não resolveu.

Pergunta estupida, mas nao tens outro ESP32 onde testar? Que sensor e esse? Estou so a pensar que no que toca ao código não me parece haver nada de óbvio que explicaria isto. A única coisa é mesmo se a alimentação fraqueja quando o Wi Fi é utilizado, mas em principio não deveria causar isto. Deveria ser mais instabilidade.

Ok. Isto e interessante...

Segundo a documentação e este post:

That means you can't use the ADC on any of the ADC2 channels while WiFi is on: GPIO4, GPIO0, GPIO2, GPIO15, GPIO13, GPIO12, GPIO14, GPIO27, GPIO25 and GPIO26.

But you can use ADC1, which uses pins GPIO36, GPIO37, GPIO38, GPIO39, GPIO32, GPIO33, GPIO34 and GPIO35.

Tens o pinout da tua placa? Parece-me estranho que isto aconteça, mas pode ser uma possibilidade para o que estás a ver e não é qualquer pino que funciona.

Uma coisa que ponderei também no teu código que eventualmente te vai dar chatices é que tu assumes que o ESP32 vai estar continuamente ligado à tua rede WiFi. Eventualmente a ligação vai cair e não tens uma provisão no teu código para voltar a ligar. Assim sendo, estou a pensar se a tua função de envio da mensagem poderia também ligar à tua rede WiFi e depois da mensagem enviada, desligar. Assim garantias que a leitura do pino funciona E que não terias problemas do sistema deixar de funcionar.

1 Like

Funcionou! Usei o pino 34 e o problema foi resolvido.

Boa sugestão, movi o trecho de conexão WiFi para a condição " if (n == 3)".

Agradeço pela solução!!

Na boa. Eu também não sabia deste "problema" do chip.

1 Like

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