#include <EspMQTTClient.h> // EspMQTTClient
#include <ArduinoJson.h> // ArduinoJson
#include <OneWire.h> //OneWire
#include <DallasTemperature.h> // DallasTemperature
/*
Projeto SA – MEDIDOR DE QUALIDADE DA ÁGUA
29.04.2024 - V1.0 - Implementando o sensor ultrassônico.
12.05.2024 - V2.0 - Publicando valores arrendondados e consertando o inscrever e desinscrever toda hora.
14.05.2024 - V3.0 - Implementando o sensor de temperatura e publicando temperatura.
// Corrigir problema ao publicar distância...
*/
// portas em que estão conectados no ESP32
#define PINO_TRIG 33
#define PINO_ECHO 32
#define PINO_LED 12
#define PINO_DQ 4
#define PORTA_ANALOGICA 35 //Sensor de Turbidez
OneWire oneWire(PINO_DQ);
DallasTemperature sensors(&oneWire);
float distanciaAnterior=0.0;
float temperaturaAnterior = 0.0;
bool mudouValorSensores = false;
// Conexões WI-FI e MQTT
EspMQTTClient client(
"Athos", //Rede wi-fi
"fodasse.", // Senha wi-fi
"mqtt.tago.io", // Broker
"Default", // Usuário
"a7fc654a-b690-4643-91ec-be4809813652", // Token da plataforma Tago.io
"ESP32_Tutorial" // Identificação única
);
// Define a função de callback associada ao delay
void delayedFunction() {
DynamicJsonDocument dados(1024);
String dadosJson;
sensors.requestTemperatures();
// 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)
int distanciaArredondada = round(distanciaAtual);//Arredonda a distância
float temperaturaAtual = sensors.getTempCByIndex(0);// Recebe a temperatura em °C (graus celsius) do sensor
/**
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
}
**/
int analogValue = 0;
int i = 0;
int somaAnalogValue = 0;
for (i = 0; i < 99; i++)
{
// Read the analog value from GPIO 35 0...1023
analogValue = analogRead(PORTA_ANALOGICA);
somaAnalogValue += analogValue; // soma valores
}
analogValue = somaAnalogValue/100; // valor médio
float valorTurbidezNTU = 0.0;
valorTurbidezNTU = 0,00050637*(analogValue*analogValue) − 6,3297*(analogValue) + 2989,9;
//Serial.println("Valor Anterior turbidez....");
//Serial.println(turbidezAnterior);
Serial.println("Valor Atual Turbidez....");
Serial.println(analogValue);
//Serial.println("Valor Anterior distancia....");
//Serial.println(distanciaAnterior);
Serial.println("Valor Atual distancia....");
Serial.println(distanciaArredondada);
//Serial.println("Valor Anterior Temperatura....");
//Serial.println(temperaturaAnterior);
Serial.println("Valor Atual Temperatura....");
Serial.println(temperaturaAtual);
if( distanciaAtual !=distanciaAnterior){
mudouValorSensores = true;
distanciaAnterior = distanciaAtual;
}
if (temperaturaAtual != temperaturaAnterior){
mudouValorSensores = true;
temperaturaAnterior = temperaturaAtual;
}
if ( != temperaturaAnterior){
mudouValorSensores = true;
temperaturaAnterior = temperaturaAtual;
}
// verifica se algum dos sensores mudou valor, caso afirmativo (true), atualiza estrutura Json
if(mudouValorSensores){
char buff_temperature[7];
// Insere os os dados do sensor de distância na estrutura Json
dados[0]["variable"] = "valor_distancia";
dados[0]["unit"] = "cm";
dados[0]["value"] = distanciaArredondada;
dados[1]["variable"] = "valor_temperatura";
dados[1]["unit"] = "°C";
snprintf(buff_temperature, sizeof(buff_temperature), "%.1f", temperaturaAtual);
dados[1]["value"] = buff_temperature;
dados[2]["variable"] = "valor_turbidez";
dados[2]["unit"] = "NTU";
dados[2]["value"] = valorTurbidezNTU;
// conversão da estrutura de dados (JSON) para string
serializeJson(dados, dadosJson);
// client.subscribe("le_dados_qualidade_agua", [] (const String &payload) {});
// 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);
// client.unsubscribe("le_dados_qualidade_agua");
}
// 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(2048);
// 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);
// inicializa o sensor de temperatura
sensors.begin();
analogReadResolution(10);
}
// 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) {});
}