#include <EspMQTTClient.h> // EspMQTTClient
#include <ArduinoJson.h> // ArduinoJson
/*
Projeto SA – MEDIDOR DE QUALIDADE DA ÁGUA
29.04.2024 - V1.0 – Implementando o sensor ultrassônico
*/
#define PINO_TRIG 4
#define PINO_ECHO 2
#define PINO_LED 5
DynamicJsonDocument dados(1024);
String dadosJson;
float distanciaAnterior=0.0;
bool mudouValorSensores = false;
// Conexões WI-FI e MQTT
EspMQTTClient client(
"Wokwi-GUEST", //Rede wi-fi
"", // Senha wi-fi
"mqtt.tago.io", // Broker
"Default", // Usuário (qq string)
"6a6f4dcb-73dc-492a-9eeb-9ff001314953", // Token da plataforma Tago.io
"SA_IOT_2024" // Identificação única (qq string)
);
// Define a função de callback associada ao delay
void delayedFunction() {
// le distância do sensor HC-SR04
mudouValorSensores = false;
digitalWrite(PINO_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PINO_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PINO_TRIG, LOW);
long duracao = pulseIn(PINO_ECHO, HIGH); // Mede o tempo de resposta do ECHO
float distanciaAtual = (duracao * 0.0343) / 2;// Calcula a distância usando a velocidade do som (aproximadamente 343 m/s)
if (distanciaAtual <= 10 || distanciaAtual > 399 ) // quando estiver menor ou igual a 10 cm enviará um alerta. ** Valor editável para a distância preferir.
{
digitalWrite(PINO_LED, HIGH); // Acende o LED se a distância for menor ou igual a 10 cm
} else {
digitalWrite(PINO_LED, LOW); // Desliga o LED caso contrário
}
if( distanciaAtual !=distanciaAnterior){
mudouValorSensores = true;
distanciaAnterior = distanciaAtual;
}
// verifica se algum dos sensores mudou valor, caso afirmativo (true), atualiza estrutura Json
if( mudouValorSensores){
// Insere os os dados do sensor de distância na estrutura Json
dados[0]["variable"] = "valor_distancia";
dados[0]["unit"] = "cm";
dados[0]["value"] = distanciaAtual;
// conversão da estrutura de dados (JSON) para string
serializeJson(dados, dadosJson);
// MQTT (Publish) e controle (alteração de valores)
Serial.println("Publicando a leitura dos sensores de qualidade da água....");
Serial.println(dadosJson);
client.publish("le_dados_qualidade_agua", dadosJson);
}
// chama novamente função de callback
client.executeDelayed(5000, delayedFunction);
}
// Setup
void setup() {
// alteração dos parâmetros default por causa das desconexões frequentes
// do wifi dummy do wokwi
client.enableMQTTPersistence();
client.setMqttReconnectionAttemptDelay(2000);
client.setWifiReconnectionAttemptDelay(3000);
client.setKeepAlive(20);
//habilita msgs de debug
client.enableDebuggingMessages(true);
client.setMaxPacketSize(256);
// delay com callback, não posso usar delay(x ms)
// devido a conexão wifi
client.executeDelayed(5000, delayedFunction);
// configura pinos do sensor HC-SR04
pinMode(PINO_TRIG, OUTPUT); // Configura o pino TRIG como saída
pinMode(PINO_ECHO, INPUT); // Configura o pino ECHO como entrada
pinMode(PINO_LED, OUTPUT); // Configura o pino LED como saída
Serial.begin(115200);
}
// Loop
void loop() {
client.loop();
}
// MQTT (Subscribe)
void onConnectionEstablished() {
Serial.println("Conexao com tago.io estabelecida, assinando topicos...");
Serial.println("Assinando o topico que atualiza os dados de qualidade da água.....");
client.subscribe("le_dados_qualidade_agua", [] (const String &payload) {
});
}