#include <EspMQTTClient.h> // EspMQTTClient
#include <ArduinoJson.h> // ArduinoJson
#include <OneWire.h>
#include <DallasTemperature.h>
#define PINO_TRIG 4
#define PINO_ECHO 2
#define ONE_WIRE_BUS 23
float distanciaAnterior = 0.0;
bool mudouValorSensores = false;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
// 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)
"1c7a6dfc-1e76-45ca-af13-e6e93536edd0", // Token da plataforma Tago.io
"SA_IOT_2024" // Identificação única (qq string)
);
// Função para arredondar um número float para uma casa decimal específica
float arredondar(float numero, int casasDecimais) {
float multiplicador = pow(10, casasDecimais);
int parteInteira = (int)numero;
float parteDecimal = numero - parteInteira;
int parteDecimalArredondada = round(parteDecimal * multiplicador);
float valorArredondado = parteInteira + parteDecimalArredondada / multiplicador;
return valorArredondado;
}
// Define a função de callback associada ao delay
void delayedFunction() {
DynamicJsonDocument dados(1024);
String dadosJson;
// Leitura da 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)
// Leitura da temperatura do sensor DS18B20
sensors.requestTemperatures();
float temperaturaC = sensors.getTempCByIndex(0);
// Arredondamento dos valores para uma casa decimal
float distanciaAtualizada = valor(distanciaAtual, 1);
float temperaturaAtualizada = valor(temperaturaC, 1);
// Verifica se algum dos sensores mudou valor, caso afirmativo (true), atualiza estrutura Json
if (distanciaAtualizada != distanciaAnterior) {
mudouValorSensores = true;
distanciaAnterior = distanciaAtualizada;
}
// Verifica se algum dos sensores mudou valor, caso afirmativo, atualiza a estrutura Json
if (mudouValorSensores) {
// Insere os dados do sensor de distância na estrutura Json
JsonObject distancia = dados.createNestedObject();
distancia["variable"] = "distancia_valor";
distancia["unit"] = "cm";
distancia["value"] = distanciaAtualizada;
// Insere os dados do sensor de temperatura na estrutura Json
JsonObject temperatura = dados.createNestedObject();
temperatura["variable"] = "temperatura_valor";
temperatura["unit"] = "C°";
temperatura["value"] = temperaturaAtualizada;
// 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 a função de callback após um intervalo de tempo
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
// Start the Serial Monitor
Serial.begin(115200);
// Start the DS18B20 sensor
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) {
// Add code here if you want to process the subscribed messages
});
}
float arredondaFloat(float valor){
float valorSoParteInteira = (int) valor;
float soParteDecimal = valor - (float) valorSoParteInteira;
int soParteDecimalArredondada = round(soParteDecimal*10);
return float(valorSoParteInteira)+(float) soParteDecimalArredondada/10;
}