#include <EspMQTTClient.h> // EspMQTTClient
#include <ArduinoJson.h> // ArduinoJson
#include <OneWire.h>
#include <DallasTemperature.h>
/*
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_DS 33
#define PINO_ST 12
OneWire oneWire (PINO_DS);
DallasTemperature sensors(&oneWire);
float distanciaAnterior = 0.0;
float temperaturaAnterior = 0.0;
char
bool mudouValorSensores = false;
// Conexões WI-FI e MQTT
EspMQTTClient client(
"SA_AGUA_GRUPO_EU", //Rede wi-fi
"ESP32_AGUA", // Senha wi-fi
"mqtt.tago.io", // Broker
"Default", // Usuário (qq string)
"6879dd09-e266-45e5-b8a3-07a1e4e86273", // Token da plataforma Tago.io
"SA_IOT_2024" // Identificação única (qq string)
);
float arredondaFloat (float valor){
float valorSoParteInteira = (int) valor;
float soParteDecimal = valor - valorSoParteInteira;
int soParteDecimalArredondada = round (soParteDecimal*10);
return (float) valorSoParteInteira + (float) soParteDecimalArredondada/10;
}
// Define a função de callback associada ao delay
void delayedFunction() {
DynamicJsonDocument dados(1024);
String dadosJson;
// 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)
sensors.requestTemperatures();
float temperaturaAtual = sensors.getTempCByIndex(0);
float valorTemperaturaArredondado = arredondaFloat(temperaturaAtual);
analogReadResolution(10);
int analogValue = 0;
int i = 0;
int somaAnalogValue = 0;
for(i = 0; i<100; i++){
analogValue = analogRead(PINO_ST);
somaAnalogValue += analogValue;
}
Serial.println("Valor Anterior distancia....");
Serial.println(distanciaAnterior);
Serial.println("Valor Atual distancia....");
Serial.println(distanciaAtual);
Serial.println("Valor Anterior Temperatura....");
Serial.println(temperaturaAnterior);
Serial.println("Valor Atual Temperatura....");
Serial.println(temperaturaAtual);
Serial.println("Estado da água");
if(analogValue > 539){
Serial.println("LIMPA")
mudouValorSensores = true;
}
else if((analogValue >= 231) && (analogValue <= 539)){
Serial.println("UM POUCO SUJA");
mudouValorSensores = true;
}
else if(analogValue < 231){
Serial.println("MUIOT SUJA");
mudouValorSensores = true;
}
if( distanciaAtual != distanciaAnterior){
mudouValorSensores = true;
distanciaAnterior = distanciaAtual;
}
if(temperaturaAtual != temperaturaAnterior){
mudouValorSensores = true;
temperaturaAnterior = temperaturaAtual;
}
// verifica se algum dos sensores mudou valor, caso afirmativo (true), atualiza estrutura Json
if( mudouValorSensores){
char buff[7];
int arredondar = round(distanciaAtual);
// Insere os os dados do sensor de distância na estrutura Json
dados[0]["variable"] = "valor_distancia";
dados[0]["unit"] = "cm";
dados[0]["value"] = arredondar;
dados[1]["variable"] = "temperatura";
dados[1]["unit"] = "ºC";
snprintf(buff,sizeof(buff),"%.1f",temperaturaAtual);
dados[1]["value"] = buff;
dados[2]["variable"] = "turbidez";
dados[2]["unit"] = "NTU";
dados[2]["value"] = analogValue;
// 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(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
Serial.begin(115200);
sensors.begin();
}
// 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) {});
}