/**********************************************************************************
 * Allgemeine Deklaration
 **********************************************************************************/
#define NOTE1    40
#define NOTE2    30
#define NOTE3    20

// Lautsprecherausgang
const byte Ton = 10;



// Analog-Pins 0, 1, 2, 3, 
const int TP1A = 0;
const int TP1B = 1;
const int TP2A = 2;
const int TP2B = 3;
const int TP3A = 4;
const int TP3B = 5;

// Sensorwert
// unten für die Abfrage des Sensorwerts nötig
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
// Counter für die Lautstärkeregelung
int counter1 = 0;
int counter2 = 0;

//Caryflags für Sensorlogik
byte next  = 0;
byte wait  = 0;
byte play  = 0;
byte reset = 0;
byte hupe1 = 0;
byte hupe2 = 0;

// Kalibration
// die ersten 256 Messwerte werden summiert und mit Hilfe der letzten 50 Werte wird der Mittelwert bestimmt
int Kalibrationarray1[256];
int Kalibration1 = 0;
int Kalibrationarray2[256];
int Kalibration2 = 0;
int Kalibrationarray3[256];
int Kalibration3 = 0;




/**********************************************************************************
 * Hauptprogramm
 **********************************************************************************/
// Führt die Deklaration der Pins durch sowie die Kalibrierung der Sensorik
void setup(void){

  pinMode(Ton,OUTPUT);

  // Zuweisung der Pins für Sensorik 
  pinMode(TP1A,OUTPUT);
  pinMode(TP1B,OUTPUT);   
  pinMode(TP2A,OUTPUT);
  pinMode(TP2B,OUTPUT);
  pinMode(TP3A,OUTPUT);
  pinMode(TP3B,OUTPUT);

  // Alles entladen 
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);
  digitalWrite(TP3A, LOW);
  digitalWrite(TP3B, LOW);

  delayMicroseconds(5);


  Kalibrierung();

}   

void loop(){
  
  digitalWrite(Ton,HIGH);
  delayMicroseconds(30);
  digitalWrite(Ton,LOW);
  delayMicroseconds(30);

  // Laed und entlaed die Kondensatoren stetig
  // und erzeugt eine konstante Spannung
  // deren Aenderung kann anschliessend gemessen werden
  Kapazitaet();
  Kapazitaet();

  // erkennt Spannungsaenderungen
  // leitet entsprechende Aktionen ein
  Sensorlogik();

}


/**********************************************************************************
 * Kalibrierung
 **********************************************************************************/
void Kalibrierung(){
  // 256 Messwerte werden summiert und anschließend die letzten 50 zur Bildung eines Mittelwerts benutzt
  for (int i=0; i<255; i++){

    Kapazitaet();
    Kapazitaet();

    Kalibrationarray1[i] = analogRead(TP1A);
    Kalibrationarray2[i] = analogRead(TP2A);
    Kalibrationarray3[i] = analogRead(TP3A);
    delay(4);

  }

  for(int i=215; i<255; i++){
    Kalibration1 = Kalibration1 + Kalibrationarray1[i];
    Kalibration2 = Kalibration2 + Kalibrationarray2[i];
    Kalibration3 = Kalibration3 + Kalibrationarray3[i];
  }

  Kalibration1 = Kalibration1 / 40;
  Kalibration2 = Kalibration2 / 40;
  Kalibration3 = Kalibration3 / 40;

}

/**********************************************************************************
 * Kapazitive Schaltung
 **********************************************************************************/
void Kapazitaet(){

  // damit keine Ladung abfliessen kann werden beide Als Input geschaltet
  pinMode(TP1A,INPUT);
  pinMode(TP1B,INPUT);
  digitalWrite(TP1A, LOW);
  digitalWrite(TP1B, LOW); 
  pinMode(TP2A,INPUT);
  pinMode(TP2B,INPUT);
  digitalWrite(TP2A, LOW);
  digitalWrite(TP2B, LOW);
  pinMode(TP3A,INPUT);
  pinMode(TP3B,INPUT);
  digitalWrite(TP3A, LOW);
  digitalWrite(TP3B, LOW);


  delayMicroseconds(5);


  // C wird aufgeladen
  pinMode(TP1A,OUTPUT);
  digitalWrite(TP1A, HIGH);
  pinMode(TP2A,OUTPUT);
  digitalWrite(TP2A, HIGH);
  pinMode(TP3A,OUTPUT);
  digitalWrite(TP3A, HIGH);


  delayMicroseconds(5);


  pinMode(TP1A,INPUT);
  digitalWrite(TP1A, LOW);
  pinMode(TP2A,INPUT);
  digitalWrite(TP2A, LOW);
  pinMode(TP3A,INPUT);
  digitalWrite(TP3A, LOW);

  // Ladung aus C abfuehren auf GND 
  pinMode(TP1B,OUTPUT);
  digitalWrite(TP1B, LOW);
  pinMode(TP2B,OUTPUT);
  digitalWrite(TP2B, LOW);   
  pinMode(TP3B,OUTPUT);
  digitalWrite(TP3B, LOW); 
}

/**********************************************************************************
 * Sensor Logik
 **********************************************************************************/

void Sensorlogik (){
  // Ermitteln und zuweißen des Werts am Analogen-Eingang A1 und A2
  sensorValue1 = analogRead(TP1A); 
  sensorValue2 = analogRead(TP2A); 
  sensorValue3 = analogRead(TP3A); 

  if(sensorValue1 > Kalibration1 + 10  &&  sensorValue2 < Kalibration2 + 11  &&  sensorValue3 < Kalibration3 + 11){

    Tone(40);

  }

  if(sensorValue2 > Kalibration2 + 10  &&  sensorValue2 < Kalibration1 + 11  &&  sensorValue3 < Kalibration3 + 11){

    Tone(30);

  }

  if(sensorValue3 > Kalibration3 + 10  &&  sensorValue1 < Kalibration1 + 11  &&  sensorValue2 < Kalibration2 + 11){

    Tone(20);

  }

  if(sensorValue1 > Kalibration1 + 10  &&  sensorValue2 > Kalibration2 + 11){

    Tone(40);
    delay(100);
    Tone(30);
    delay(100);
    Tone(20);
    delay(100);

  }

}

void Tone (int Laenge){

  digitalWrite(Ton,HIGH);
  delayMicroseconds(Laenge);
  digitalWrite(Ton,LOW);
  delayMicroseconds(Laenge);
  
}