// Define DAC pins
#define Stensao 25
#define Scorrente 26
#define potenciometro 4
#define frequencia 60.0

unsigned long timestamp_acionamento_start = 0;
unsigned long timestamp_acionamento_delta = 0;
unsigned long periodo = 1000000/frequencia;
unsigned long TEMPO_DEBOUNCE = 5; //ms 

/* Função ISR (chamada quando há geração da interrupção) */
void IRAM_ATTR funcao_ISR_Tensao()
{
  //if ( (micros() - timestamp_ultimo_acionamento) >= TEMPO_DEBOUNCE ) {
  timestamp_acionamento_start = micros();
  //Serial.println(timestamp_acionamento_start);
  //}
  //timestamp_ultimo_acionamento = millis();
}

void IRAM_ATTR funcao_ISR_Corrente()
{
  //if ( (micros() - timestamp_ultimo_acionamento) >= TEMPO_DEBOUNCE ) {
    timestamp_acionamento_delta = micros() - timestamp_acionamento_start;
    //Serial.print(timestamp_acionamento_start);
    //Serial.print(" / ");
    //Serial.print(micros());
    //Serial.print(" / ");
    Serial.print(180/(timestamp_acionamento_delta/periodo));
    Serial.println(" [us]");
  //}
  //timestamp_ultimo_acionamento = micros();
}

int potenciometroValue;
int tensao,corrente, phi;

void setup() {
  Serial.begin(115200);
  pinMode(Stensao, OUTPUT);
  pinMode(Scorrente, OUTPUT);
  // Configura o GPIO do botão como entrada
  // configura interrupção externa no modo RISING para ele.
  attachInterrupt( Scorrente, funcao_ISR_Corrente, RISING);
  attachInterrupt( Stensao, funcao_ISR_Tensao, RISING);
}

void loop() {
  potenciometroValue = analogRead( potenciometro );
  //Serial.print("Valor: ");
  //Serial.println(potenciometroValue);
  //phi = int(potenciometroValue*180/(4095));
  //Serial.println(phi);
  // Calcula o seno e escreve em DAC_CH1
  phi = 30;
  for (int deg = 0; deg < 360; deg ++) {
    tensao = int( 128 + 127 * sin( deg * PI / 180 ) );
    corrente = int(128 + 127 * sin( (deg - phi) * PI / 180 ));
    if (( tensao < 128)&&( corrente < 128)) {
      digitalWrite(Stensao, LOW);
      digitalWrite(Scorrente, LOW);
    }else if ( ( tensao < 128)&& ( corrente >= 128) ){
      digitalWrite(Stensao, LOW);
      digitalWrite(Scorrente, HIGH);
    }else if ( ( tensao >= 128)&& ( corrente < 128) ){
      digitalWrite(Stensao, HIGH);
      digitalWrite(Scorrente, LOW);
    }else{
      digitalWrite(Stensao, HIGH);
      digitalWrite(Scorrente, HIGH);
    }
    delayMicroseconds(int(1000000/(360*frequencia)));
  }
}