//Bibliotecas
#include <ArduinoJson.h>
#include "DHT.h"
#include <Wire.h>
//Server
#include <WiFi.h>
#include <PubSubClient.h>
/***********************
* CONFIGURAÇÕES MQTT
***********************/
const char* default_SSID = "Wokwi-GUEST";
const char* default_PASSWORD = "";
const char* default_BROKER_MQTT = "44.223.43.74";
const int default_BROKER_PORT = 1883;
const char* default_TOPICO_SUBSCRIBE = "/TEF/device009/cmd";
const char* default_TOPICO_PUBLISH_1 = "/TEF/device009/attrs";
const char* default_TOPICO_PUBLISH_2 = "/TEF/device009/attrs/p";
const char* default_ID_MQTT = "fiware_009";
const int default_D4 = 2;
const char* topicPrefix = "device009";
// Variáveis editáveis
char* SSID = const_cast<char*>(default_SSID);
char* PASSWORD = const_cast<char*>(default_PASSWORD);
char* BROKER_MQTT = const_cast<char*>(default_BROKER_MQTT);
int BROKER_PORT = default_BROKER_PORT;
char* TOPICO_SUBSCRIBE = const_cast<char*>(default_TOPICO_SUBSCRIBE);
char* TOPICO_PUBLISH_1 = const_cast<char*>(default_TOPICO_PUBLISH_1);
char* TOPICO_PUBLISH_2 = const_cast<char*>(default_TOPICO_PUBLISH_2);
char* ID_MQTT = const_cast<char*>(default_ID_MQTT);
int D4 = default_D4;
WiFiClient espClient;
PubSubClient MQTT(espClient);
char EstadoSaida = '0';
// SENSORES
#define DHTPIN 15
#define DHTTYPE DHT22
#define SENSOR_CARDIACO_POT 34
const int trigPin = 2;
const int echoPin = 4;
// VARIÁVEIS
int VALOR_BRUTO_SENSOR = 0;
int VALOR_CONVERTIDO_BPM = 0;
float duration, distance;
String presenca = "Ausente";
DHT dht(DHTPIN, DHTTYPE);
// Inicialização
void initSerial() {
Serial.begin(9600);
}
void reconectWiFi() {
if (WiFi.status() == WL_CONNECTED) return;
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("\nConectado ao Wi-Fi. IP: " + WiFi.localIP().toString());
digitalWrite(D4, LOW);
}
void initWiFi() {
delay(10);
Serial.println("------Conexao WI-FI------");
reconectWiFi();
}
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
}
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.print("Tentando conectar ao broker...");
if (MQTT.connect(ID_MQTT)) {
Serial.println("Conectado!");
MQTT.subscribe(TOPICO_SUBSCRIBE);
} else {
Serial.println("Falha! Tentando em 2s.");
delay(2000);
}
}
}
void VerificaConexoesWiFIEMQTT() {
if (!MQTT.connected()) reconnectMQTT();
reconectWiFi();
}
//Setup
void setup() {
initSerial();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
initWiFi();
initMQTT();
dht.begin();
}
// Loop
void loop() {
VerificaConexoesWiFIEMQTT();
MQTT.loop();
// Medições dos Sensores
// DHT
float umidade = dht.readHumidity();
float temperatura = dht.readTemperature();
// BPM
VALOR_BRUTO_SENSOR = analogRead(SENSOR_CARDIACO_POT);
VALOR_CONVERTIDO_BPM = map(VALOR_BRUTO_SENSOR, 0, 4095, 0, 220);
// ULTRASSOM
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2;
if (distance < 100) presenca = "Presente";
else presenca = "Ausente";
// JSON PARA MQTT
StaticJsonDocument<256> doc;
doc["umidade"] = umidade;
doc["temperatura"] = temperatura;
doc["bpMin"] = VALOR_CONVERTIDO_BPM;
doc["presenca"] = presenca;
char buffer[256];
serializeJson(doc, buffer);
MQTT.publish(TOPICO_PUBLISH_2, buffer);
Serial.print("JSON enviado: ");
Serial.println(buffer);
delay(1000);
}