#include "Enuns.h" #include "SerialService.h" #include "I2CService.h" #ifndef Pinout #define Pinout #define PINO_INVALIDO 0xFF class PinoModel { public: int num; TiposBarramentos barramento; TiposPinos tipo; TiposLeituras leitura; PinoModel(int numero = PINO_INVALIDO, TiposBarramentos barr = CONTROLADOR, TiposPinos tp = _INPUT, TiposLeituras lt = DIGITAL) : num(numero), barramento(barr), tipo(tp), leitura(lt) { } bool Definido() { return num != PINO_INVALIDO; } void Conectar(bool statusInicial = false) { if (Definido()) { if (barramento == CONTROLADOR) { if (tipo == _INPUT) { pinMode(num, INPUT); } else if (tipo == _OUTPUT) { pinMode(num, OUTPUT); set(statusInicial); } } else if (barramento == EXPANSOR_GPIO) { if (I2CService::McpIniciado) { I2CService::SolicitarAcessoI2C(); if (tipo == _INPUT) { I2CService::mcp.pinMode(num, INPUT); } else if (tipo == _OUTPUT) { I2CService::mcp.pinMode(num, OUTPUT); set(statusInicial); } I2CService::LiberarAcessoI2C(); } } } } void Desconectar() { if (Definido()) { if (barramento == CONTROLADOR) { if (tipo == _PWM) { ledcDetachPin(num); } pinMode(num, INPUT); } else if (barramento == EXPANSOR_GPIO) { if (I2CService::McpIniciado) { I2CService::SolicitarAcessoI2C(); I2CService::mcp.pinMode(num, INPUT); I2CService::LiberarAcessoI2C(); } } } } int get(int leituras = 1) { if (Definido()) { if (barramento == CONTROLADOR) { if (leitura == DIGITAL) { return digitalRead(num); } else if (leitura == ANALOGICO) { double l = 0; for (int i = 0; i < leituras; i++) { l += analogRead(num); delay(1); } return l / leituras; } } else if (barramento == EXPANSOR_GPIO) { if (I2CService::McpIniciado) { I2CService::SolicitarAcessoI2C(); int leitura = I2CService::mcp.digitalRead(num); I2CService::LiberarAcessoI2C(); return leitura; } } else if (barramento == EXPANSOR_ADS) { if (I2CService::AdsIniciado) { I2CService::SolicitarAcessoI2C(); uint16_t l = 0; for (int i = 0; i < leituras; i++) { int leituraADC = (int)(I2CService::ads.readADC_SingleEnded(num)); int leitura12bits = map(leituraADC, 0, 32767, 0, 4095); l += leitura12bits; delay(1); } I2CService::LiberarAcessoI2C(); return (int)(l / leituras); } } } return -1; } void set(bool status) { if (Definido()) { if (barramento == CONTROLADOR) { digitalWrite(num, status ? HIGH : LOW); } else if (barramento == EXPANSOR_GPIO) { if (I2CService::McpIniciado) { I2CService::SolicitarAcessoI2C(); I2CService::mcp.digitalWrite(num, status ? HIGH : LOW); I2CService::LiberarAcessoI2C(); } } } } }; #endif