// Inclusão de bibliotecas
#include <WiFi.h>
#include <time.h>
#include <AsyncTCP.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <Adafruit_BME280.h>
#include <Adafruit_INA219.h>
// LED onboard para DOIT ESP32 DEVKIT v1
#define boardLED 2
// Crie um ID para o seu módulo
const char* ID = "SolarSense01";
const char* SensorID = "BME280SS";
// Credenciais WiFi para uso no Wokwi
const char* SSID = "Wokwi-GUEST";
const char* PASSWORD = "";
// Configurações MQTT
const char* BROKER_MQTT = "74.179.84.66";
int BROKER_PORT = 1883;
const char* mqttUser = "gs2024";
const char* mqttPassword = "q1w2e3r4";
#define TOPICO_SUBSCRIBE "GS_2TDSPK"
#define TOPICO_PUBLISH "GS_2TDSPK"
WiFiClient espClient;
PubSubClient MQTT(espClient);
// Instância de sensores
Adafruit_BME280 bme;
Adafruit_INA219 ina219;
// Variáveis para medições
float tensaoSolar = 0.0;
float correnteSolar = 0.0;
float potenciaSolar = 0.0;
float energiaGerada = 0.0;
float temperatura = 0.0;
float umidade = 0.0;
float pressao = 0.0;
// Variáveis para cálculo de energia
unsigned long ultimoTempo = 0;
unsigned long deltaTempo = 0;
// Pino analógico para leitura de tensão solar
#define PINO_TENSAO 34
// Função para inicializar o Wi-Fi
void initWiFi(){
WiFi.begin(SSID, PASSWORD);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("---------------------");
Serial.println("WiFi conectado... ");
Serial.println("---------------------");
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress());
Serial.print("Conectado a rede ");
Serial.println(SSID);
Serial.print("O endereço IP é: ");
Serial.println(WiFi.localIP());
}
void reconectWiFi(){
WiFi.begin(SSID, PASSWORD);
delay(3000);
Serial.println("---------------------");
Serial.println("WiFi conectado... ");
Serial.println("---------------------");
Serial.print("Conectado em: ");
Serial.println(SSID);
Serial.print("Endereço IP: ");
Serial.println(WiFi.localIP());
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress());
Serial.println("----------------------");
}
// Função para inicializar o MQTT
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
while (!MQTT.connected()) {
Serial.println("Conectando ao Broker MQTT...");
if (MQTT.connect(SensorID, mqttUser, mqttPassword)) {
Serial.println("Conectado ao Broker MQTT!");
} else {
Serial.print("Falha na conexão. Estado: ");
Serial.println(MQTT.state());
delay(2000);
}
}
}
// Função para inicializar sensores
void initSensors() {
if (!bme.begin()) {
Serial.println("Erro ao iniciar BME280");
while (1);
}
if (!ina219.begin()) {
Serial.println("Erro ao iniciar INA219");
while (1);
}
}
// Função para ler os dados do sensor BME280
void leDadosBME280() {
temperatura = bme.readTemperature();
umidade = bme.readHumidity();
pressao = bme.readPressure() / 100.0F;
Serial.printf("Temperatura: %.2f°C, Umidade: %.2f%%, Pressão: %.2f hPa\n", temperatura, umidade, pressao);
}
// Função para ler a tensão solar
void leTensaoSolar() {
tensaoSolar = analogRead(PINO_TENSAO);
tensaoSolar = (tensaoSolar * 3.3) / 4095.0;
Serial.printf("Tensão solar: %.2f V\n", tensaoSolar);
}
// Função para ler a corrente solar
void leCorrenteSolar() {
correnteSolar = ina219.getCurrent_mA();
Serial.printf("Corrente solar: %.2f mA\n", correnteSolar);
}
// Função para calcular a potência solar
void calculaPotenciaSolar() {
potenciaSolar = tensaoSolar * (correnteSolar / 1000.0); // Corrente convertida para Amperes
Serial.printf("Potência solar: %.2f W\n", potenciaSolar);
}
// Função para calcular a energia gerada
void calculaEnergiaGerada() {
unsigned long tempoAtual = millis();
deltaTempo = tempoAtual - ultimoTempo;
ultimoTempo = tempoAtual;
// Converte deltaTempo para horas (1 segundo = 0.000277 horas)
float deltaTempoHoras = deltaTempo / 3600000.0;
energiaGerada += potenciaSolar * deltaTempoHoras; // Energia acumulada em kWh
Serial.printf("Energia gerada: %.4f kWh\n", energiaGerada);
}
// Função para enviar dados via MQTT
void enviaDadosMQTT() {
StaticJsonDocument<200> doc;
doc["TensaoSolar"] = tensaoSolar;
doc["CorrenteSolar"] = correnteSolar;
doc["PotenciaSolar"] = potenciaSolar;
doc["EnergiaGerada"] = energiaGerada;
doc["Temperatura"] = temperatura;
doc["Umidade"] = umidade;
doc["Pressao"] = pressao;
String payload;
serializeJson(doc, payload);
MQTT.publish(TOPICO_PUBLISH, payload.c_str());
Serial.println("Dados enviados via MQTT!");
}
// Função para verificar conexões WiFi e MQTT
void verificaConexoes() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Reconectando ao Wi-Fi...");
initWiFi();
}
if (!MQTT.connected()) {
Serial.println("Reconectando ao Broker MQTT...");
initMQTT();
}
}
// Função para callback do MQTT
void callbackMQTT(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensagem recebida no tópico: ");
Serial.println(topic);
payload[length] = '\0';
Serial.printf("Payload: %s\n", (char*)payload);
}
// Função de configuração
void setup() {
Serial.begin(115200);
pinMode(boardLED, OUTPUT);
digitalWrite(boardLED, LOW);
initWiFi();
initSensors();
initMQTT();
MQTT.setCallback(callbackMQTT);
ultimoTempo = millis(); // Inicializa o tempo para cálculo de energia
}
//Função: inicializa parâmetros de conexão MQTT
// (endereço do broker, porta e função de callback)
void initMQTT()
{
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
while (!MQTT.connected())
{
Serial.println("Conectando ao Broker MQTT...");
if(MQTT.connect(SensorID, mqttUser, mqttPassword ))
{
Serial.println("Conectado!!");
}
else
{
Serial.print("failed with state ");
Serial.print(MQTT.state());
delay(2000);
}
}
// Loop principal
void loop() {
verificaConexoes();
MQTT.loop();
// Lê os sensores e calcula os valores
leTensaoSolar();
leCorrenteSolar();
leDadosBME280();
calculaPotenciaSolar();
calculaEnergiaGerada();
// Envia os dados via MQTT
enviaDadosMQTT();
// Intervalo de 10 segundos entre as leituras
delay(10000);
}