// 3Phase Generator benutzt TimerOne Library
// Periodendauer T wird in 6 teile zerteilt T/6
// 120 Grad Phasenverschiebung ist 2/6 T 
// 
//
#include <TimerOne.h>
bool stateL1 = LOW;
bool stateL2 = LOW;
bool stateL3 = HIGH;
const int pinL1 = 5;
const int pinL2 = 6;
const int pinL3 = 7;
int LED13 = 13;
int counter = 1;
unsigned int poti;                  
unsigned int poti_oldvalue;
unsigned long f;
char buf[100];     // für die Ausgabe mit sprintf
void setup() {
  //Serial.begin(115200);
  Serial.begin(9600);
  Serial.println("\n\n\n3 Phase Generator A.Burger 2024 v1.00\n");
  pinMode(LED13, OUTPUT);
  pinMode(pinL1, OUTPUT);
  pinMode(pinL2, OUTPUT);
  pinMode(pinL3, OUTPUT);
  digitalWrite(pinL1,stateL1); 
  digitalWrite(pinL2,stateL2); 
  digitalWrite(pinL3,stateL3); 
  poti = getPoti();
  poti_oldvalue = poti;
  f=getFrequency(poti);
  printValue(poti,f);
  Timer1.initialize(f);                  // Timer starten
  Timer1.attachInterrupt(timer_isr_L1);
}
void timer_isr_L1(void) {
  switch (counter){
    case 1: stateL1 = !stateL1; digitalWrite(pinL1,stateL1); break;
    case 3: stateL2 = !stateL2; digitalWrite(pinL2,stateL2); break;
    case 2: stateL3 = !stateL3; digitalWrite(pinL3,stateL3); break;
    case 4: stateL1 = !stateL1; digitalWrite(pinL1,stateL1); break;
    case 6: stateL2 = !stateL2; digitalWrite(pinL2,stateL2); break;
    case 5: stateL3 = !stateL3; digitalWrite(pinL3,stateL3); break;
  }
  if(++counter>6) counter = 1;
}
void loop() {
  if(poti != poti_oldvalue) {   // Potiwert hat sich geändert
    poti_oldvalue = poti;
    f = getFrequency(poti);
    printValue(poti,f);
    Timer1.setPeriod(f); 
    digitalWrite(LED13,LOW);
    delay(1000);
    digitalWrite(LED13,HIGH);
  }
  poti = getPoti();
}
unsigned long getFrequency(unsigned int poti) {
  float frequency;
  frequency = (float) poti/10.0;    // 1/10 von poti davon
  frequency = 1/frequency;          // Periodendauer berechnen
  frequency = frequency*1000000;    // In Mikro Sekunden umrechnen
  frequency = frequency/6;          // Ich sechs Abschnitte teilen
  return (unsigned long)frequency;
}
unsigned int getPoti() {
  unsigned int p;
  p = analogRead(A0);
  p = map(p, 0, 1023, 1, 1024);   
  return p;
}
void printValue(unsigned int poti, unsigned long frequency){
   float p;
   char buff[10];
   p=(float)poti/10.0;
   dtostrf(p, 4, 1, buff);
   //Serial.println(p);
   sprintf(buf, "%lu: New poti value: %s Hz, Frequency value:%lu us  (%lu)", micros(), buff, frequency, frequency*6  );    
   Serial.println(buf);
}