#include "SerialService.h" #include "Pinout.h" #ifndef SensorFluxoModel #define SensorFluxoModel class SensorFluxo { public: static void InicializarLista(std::vector& lista, const String& parametros, const String& Mod_ID); SensorFluxo(String _modID, String _id) { Mod_ID = _modID; _ID = _id; } // Definições String Mod_ID = ""; String _ID; PinoModel _pino; unsigned long tempoAnterior = 0; unsigned int _Pulsos = 0; unsigned long _PeriodoTotal = 0; bool ultimaLeitura = false; bool Iniciado = false; // Consumo unsigned int _PulsosLeitura = 0; unsigned long _PeriodoTotalLeitura = 0; void Inicializar() { if (Iniciado) { PrintTela(_ID + " ja inicializado"); return; } _pino.Conectar(); ResetarEstado(); PrintTela(_ID + " Iniciado"); Iniciado = true; } void Desligar() { if (!Iniciado) { PrintTela(_ID + " nao esta inicializado"); return; } // Redefinir as configurações para os valores iniciais _pino.Desconectar(); ResetarEstado(); PrintTela(_ID + " Desligado"); Iniciado = false; } void AtualizarLeitura() { _PulsosLeitura = _Pulsos; _PeriodoTotalLeitura = _PeriodoTotal; ReiniciarAmostragem(); } // Método principal de leitura void Loop() { if (!Iniciado) { return; } bool Leitura = _pino.get() == 1; if (Leitura != ultimaLeitura) { if (Leitura && !ultimaLeitura) { unsigned long tempoAtual = millis(); unsigned long intervalo = (unsigned long)(tempoAtual - tempoAnterior); // Garante cálculo correto tempoAnterior = tempoAtual; _Pulsos++; _PeriodoTotal += intervalo; } ultimaLeitura = Leitura; } } private: // Reseta o estado do sensor void ResetarEstado() { _Pulsos = 0; _PeriodoTotal = 0; tempoAnterior = millis(); ultimaLeitura = _pino.get() == 1; } // Reinicia amostragem void ReiniciarAmostragem() { // Reseta os valores para a próxima amostragem _Pulsos = 0; _PeriodoTotal = 0; } }; // Função para inicializar os sensores de fluxo com IDs e pinos específicos void SensorFluxo::InicializarLista(std::vector& lista, const String& parametros, const String& Mod_ID) { // Verifica se há sensores já na lista if (!lista.empty()) { PrintTela("Limpando lista de sensores de fluxo existente..."); for (auto* sensor : lista) { sensor->Desligar(); // Desliga cada sensor antes de remover PrintTela("Sensor de Fluxo " + sensor->_ID + " desligado."); delete sensor; } lista.clear(); // Limpa a lista após desligar todos os itens } if (parametros.length() > 0) { std::vector _config = SplitString(parametros, SplitConfig); // Divide a configuração por vírgulas for (const String& config : _config) { std::vector partes = SplitString(config, SplitSubParams); // Divide cada configuração pelo '-' if (partes.size() == 4) { String id = partes[0]; bool conectar = partes[1] == "1"; TiposBarramentos pinoB = (TiposBarramentos)partes[2].toInt(); int pino = partes[3].toInt(); if (conectar) { SensorFluxo* sensor = new SensorFluxo(Mod_ID, id); sensor->_pino = PinoModel(pino, pinoB, _INPUT, DIGITAL); sensor->Inicializar(); lista.push_back(sensor); PrintTela("Sensor de fluxo " + id + " inicializado no pino " + String(pino)); } } else { PrintTela("Configuração inválida para sensor de fluxo: " + config); } } } else { PrintTela("Configuração de sensor de fluxo não encontrada."); } } #endif