#include "SerialService.h" #include "Pinout.h" #include "Utils.h" #include #ifndef SensorPressaoModel #define SensorPressaoModel class SensorPressao { public: static void InicializarLista(std::vector& lista, const String& parametros, const String& Mod_ID); SensorPressao(String _modID, String _id) { Mod_ID = _modID; _ID = _id; } // Definições String Mod_ID = ""; String _ID; int ID_Num; PinoModel _pino; double _Vmin = 0.0; double _Vmax = 4.5; double _Pmax = 174.045; double leitura = 0; double Pressao = 0; SimpleKalmanFilter filtro = SimpleKalmanFilter(2, 2, 0.01); bool Iniciado = false; void Inicializar() { if (Iniciado) { PrintTela(_ID + " ja inicializado"); return; } leitura = 0; _pino.Conectar(); // Conecta o pino antes de criar a tarefa Iniciado = _pino.Definido(); if (Iniciado) { PrintTela(_ID + " iniciado"); } else { PrintTela(_ID + " nao iniciado"); } } void Desligar() { if (!Iniciado) { PrintTela(_ID + " nao esta inicializado"); return; } _pino.Desconectar(); // Desconecta o pino Iniciado = false; PrintTela(_ID + " Desligado"); } void RequisitarDados() { AferirPressao(); } std::vector MontarMensagemCAN() { std::vector data; data.push_back(ID_Num); // Byte 0 - ID do sensor data.push_back(Iniciado ? 1 : 0); // Byte 1 - Status uint16_t pressaoEscalada = (uint16_t)(Pressao * 100); data.push_back(pressaoEscalada >> 8); data.push_back(pressaoEscalada & 0xFF); return data; } private: void AferirPressao() { if (Iniciado) { leitura = _pino.get(); double leituraPressao = filtro.updateEstimate(leitura); double tensao = fmap(leituraPressao, 0.0, 4095.0, 0.0, 3300.0) / 1000.0; Pressao = fmap(tensao, _Vmin, _Vmax, 0.0, _Pmax); } } }; // Função para inicializar os sensores de pressao com IDs e pinos específicos void SensorPressao::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 pressao existente..."); for (auto* sensor : lista) { sensor->Desligar(); // Desliga cada sensor antes de remover PrintTela("Sensor de Pressao " + 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() == 7) { String id = partes[0]; bool conectar = partes[1] == "1"; TiposBarramentos pinoB = (TiposBarramentos)partes[2].toInt(); int pino = partes[3].toInt(); double Vmin = partes[4].toDouble(); double Vmax = partes[5].toDouble(); double Pmax = partes[6].toDouble(); if (conectar) { SensorPressao* sensor = new SensorPressao(Mod_ID, id); sensor->_Vmin = Vmin; sensor->_Vmax = Vmax; sensor->_Pmax = Pmax; sensor->_pino = PinoModel(pino, pinoB, _INPUT, ANALOGICO); sensor->Inicializar(); lista.push_back(sensor); PrintTela("Sensor de pressao " + id + " inicializado no pino " + String(pino)); } } else { PrintTela("Configuração inválida para sensor de pressao: " + config); } } } else { PrintTela("Configuração de sensor de pressao não encontrada."); } } #endif