// Código que será usado na implementação do prototipo do coletor de enrgia usando piezo
// Definição dos pinos de entradas do ESP32
const int VpkPosPin = ; // Pino para VPK+, tensão de pico positivo, é representado pelo nível lógico alto proveniente do detector de pico
const int VpkNegPin = ; // Pino para VPK-, tensão de pico negativo, é representado pelo nível lógico baixo proveniente do detector de pico
const int TinvestPin = ; // Pino do botão Tinvest, periodo de investimento, será definido como um tempo fixo descrito aqui no código
const int IlzeroPin = ; // Pino do botão Ilzero, passagem por zero da corrente no indutor, é proveniente do módulo IL_zero
const int TharvestPin = ; // Pino do botão Tharvest, periodo da coleta, determinado pelo detector de passagem por zero da tensão VPZ
const int ResetPin = ; // Pino do botão Reset
// Definição dos pinos de saídas do ESP32
const int MpbatPin = ; // Saída para a chave Mpbat
const int MnpzPin = ; // Saída para a chave Mnpz
const int McrsPin = ; // Saída para a chave Mcrs
const int EnbInvestPin = ; // Saída para o sinal EnbInvest
// Definição dos estados da máquina de estados
enum State {
WaitVpkPosState, //Estado de espera pelo pico positivo de Vpz
InvestState, //Estado de investimento de energia da bateria
SuppressState1, //Estado para suprimir altas tensões
CpzChargeState, //Estado para a energia do indutor ir ao capacitor
WaitVpkNegState, //Estado de espera pelo pico negativo de Vpz
LhChargeState, //Estado para a energia do capacitor ir ao indutor
SuppressState2, //Estado para eliminar altas tensões
HarvestState //Estado de armazenamento da energia na bateria
};
State currentState = WaitVpkPosState; //Definição da variavel estado
void setup() {
Serial.begin(2400); // Refere-se a interface de comunicacao do esp e o computador com taxa de transmissao de 2400 bauds, numero de mudancas de sinal ou eventos que ocorrem por segundo
Serial.println("Monitor Serial Iniciado!"); // mensagem inicial que ira surgir no monitor serial
// Configuração dos pinos de entrada
pinMode(VpkPosPin, INPUT);
pinMode(VpkNegPin, INPUT);
pinMode(TinvestPin, INPUT);
pinMode(IlzeroPin, INPUT);
pinMode(TharvestPin, INPUT);
pinMode(ResetPin, INPUT);
// Configuração dos pinos de saída
pinMode(MpbatPin, OUTPUT);
pinMode(MnpzPin, OUTPUT);
pinMode(McrsPin, OUTPUT);
pinMode(EnbInvestPin, OUTPUT);
// Inicializa as saídas como o primeiro estado da máquina de estados, WaitVpkPosState
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, HIGH);
digitalWrite(EnbInvestPin, LOW);
}
// Variavel para o tempo que entrou no estado InvestState
unsigned long tempoInicioInvest = 0;
void loop() {
// Leitura das entradas do sistema coletor
bool VpkPos = digitalRead(VpkPosPin);
bool VpkNeg = digitalRead(VpkNegPin);
bool Tinvest = digitalRead(TinvestPin);
bool Ilzero = digitalRead(IlzeroPin);
bool Tharvest = digitalRead(TharvestPin);
bool Reset = digitalRead(ResetPin);
// Debug: Exibe os valores das entradas no monitor serial
Serial.print("Entradas: ");
Serial.print("VpkPos: "); Serial.print(VpkPos);
Serial.print(", VpkNeg: "); Serial.print(VpkNeg);
Serial.print(", Tinvest: "); Serial.print(Tinvest);
Serial.print(", Ilzero: "); Serial.print(Ilzero);
Serial.print(", Tharvest: "); Serial.print(Tharvest);
Serial.print(", Reset: "); Serial.println(Reset);
//Lógica do Reset
if (Reset) {
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, HIGH);
digitalWrite(EnbInvestPin, LOW);
currentState = WaitVpkPosState; // Reseta para o estado inicial
Serial.println("Reset ativado: Reset = 0, todas as saídas conforme primeiro estado, estado reiniciado");
return; // Sai do loop e aguarda a próxima iteração
}
// Implementação da máquina de estados
switch (currentState) {
//Estado 1: Estado de espera pelo pico positivo de Vpz
case WaitVpkPosState:
Serial.println("Estado atual: WaitVpkPosState");
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, HIGH);
digitalWrite(EnbInvestPin, LOW);
if (VpkPos) currentState = InvestState;
break;
//Estado 2: Estado de investimento de energia da bateria
case InvestState:
Serial.println("Estado atual: InvestState");
digitalWrite(MpbatPin, HIGH);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, LOW);
digitalWrite(EnbInvestPin, HIGH);
if (tempoInicioInvest == 0) tempoInicioInvest = millis(); // Registra o tempo de entrada no estado
if (millis() - tempoInicioInvest >= 3000) { // Espera 3 segundos
Serial.println("Tempo do Estado 2 encerrado, indo para SuppressState1.");
currentState = SuppressState1;
tempoInicioInvest = 0; // Resetar para a próxima vez
}
break;
//Estado 3: Estado para suprimir altas tensões
case SuppressState1:
Serial.println("Estado atual: SuppressState1");
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, HIGH);
digitalWrite(EnbInvestPin, LOW);
if (!Tinvest && !VpkPos) currentState = CpzChargeState;
break;
//Estado 4: Estado para a energia do indutor ir ao capacitor
case CpzChargeState:
Serial.println("Estado atual: CpzChargeState");
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, HIGH);
digitalWrite(McrsPin, LOW);
digitalWrite(EnbInvestPin, LOW);
if (Ilzero) currentState = WaitVpkNegState;
break;
//Estado 5: Estado de espera pelo pico negativo de Vpz
case WaitVpkNegState:
Serial.println("Estado atual: WaitVpkNegState");
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, HIGH);
digitalWrite(EnbInvestPin, LOW);
if (VpkNeg) currentState = LhChargeState;
break;
//Estado 6: Estado para a energia do capacitor ir ao indutor
case LhChargeState:
Serial.println("Estado atual: LhChargeState");
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, HIGH);
digitalWrite(McrsPin, LOW);
digitalWrite(EnbInvestPin, LOW);
if (Tharvest) currentState = SuppressState2;
break;
//Estado 7: Estado para eliminar altas tensões
case SuppressState2:
Serial.println("Estado atual: SuppressState2");
digitalWrite(MpbatPin, LOW);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, HIGH);
digitalWrite(EnbInvestPin, LOW);
if (!Tharvest) currentState = HarvestState;
break;
//Estado 8: Estado de armazenamento da energia na bateria
case HarvestState:
Serial.println("Estado atual: HarvestState");
digitalWrite(MpbatPin, HIGH);
digitalWrite(MnpzPin, LOW);
digitalWrite(McrsPin, LOW);
digitalWrite(EnbInvestPin, LOW);
if (Ilzero) currentState = WaitVpkPosState;
break;
}
}