// sketch_prog3a_2k



/*   Für Schwingkreis, einmalig angeregt über Taster, 2-kanalig

Liest Daten mit Werten im Bereich von 0 bis 1023 vom ANALOG INPUT Kanal A0 (oder optional zusätzlich A2) ein, mit oder ohne Pegelanhebung für Wechselspannung, und speichert sie schnell im SRAM des Prozessors ab.

Dazu wird durch eine spezielle Triggerung in Kanal A0 dafür gesorgt, dass der Vorgang mit dem Anstieg der
Messspannung aus dem Nullwert (null) nach einem Tastendruck beim PC beginnt.

Die Daten werden als Paket von 300 Werten auf 5000 mV (bzw. an die an PIN18 des ARDUINO
liegende Vergleichsspannung) skaliert und dann seriell an den Serial Monitor ausgegeben.

Basis der Programmierung war ein Beispielprogramm:      http://www.arduino.cc/en/Tutorial/AnalogInOutSerial

*/

// Festlegung von Typ und Wert von Konstanten und Variablen

const int analogInPin = A0;  // Festlegung des Analogeingangs, über den die Messungen vorgenommen werden
const int analogInPin2 = A2; // zusätzlich bei optionaler 2-kanaliger Wechselstrommessung

int trigval = 4 ;   // Triggerschwelle
int null = 490 ;   // Nullspannung bei Pegelanhebung durch Pegelwandler; sonst null = 0
// int mess[300] ;   // Array für 300 INTEGER-Werten (jeweils 2 Bytes) bei einkanaliger Messung

// Bei zweikanaliger Messung:

int mess[150] ;     // Array für 150 INTEGER-Werten (2 Bytes); pro Datensatz doppelter Speicherplatz benötigt
int mess2[150] ;   // Array für weitere 150 INTEGER-Werten (2 Bytes)
int mesw = 0 ;      // laufender Messwert x in Triggerschleifen; 0 <= x < 1024

int outputValue ;
int outputValue2 ; // optional bei 2-kanaliger Messung

int nullValue ; // int nullValue2 ;  optional

char eingabe ;  // ASCII-Wert der Tastatureingabe vom PC


long zeit ;     // Gesamtdauer der Registrierung in mikrosec
long time ;   // laufende Zeit
long av ;      // durchschnittlicher Messwert, für Nulllinie

int loop1 = 150 ; // Zahl der Datensätze, bei 2-kanaliger Messung;  sonst: int loop1 = 300 ;

long idx1 = 0 ;  // Maximalwert des Laufindexes idx


bool count = true ;
bool bereit = false;  // 0

void setup()

{ Serial.begin(57600);

  // Initialisierung der seriellen Kommunikation mit 57600 bps

  // initialize control over the keyboard:
  //  Keyboard.begin(); Offenbar nicht nötig
}

 
void loop() {

// Hauptschleife

// Triggerschleife 1: stellt fest, ob Eingabetaste am PC gedrückt. Könnte auch wegfallen.

bereit = true ; // 1

while ( bereit == true or eingabe == !'0' )    // Drehe Schleife bis bereit = false  (bzw. 0): keine Taste gedrückt
{ eingabe = Serial.read();          
   bereit = Serial.available();  Serial.println(bereit); }
 
 bereit = false;
 
while ( bereit == false )  // Drehe Schleife bis bereit = true (bzw. 1): Taste gedrückt
 { bereit = Serial.available();   } // jetzt Taste gedrückt


null = 510 ;  // Vorbereitung Nulllinie 

// Justierung der Nulllinie (im Leerlauf):

  av = 0 ;
  for (int idx = 0; idx < loop1; idx++)
  { av = av + analogRead(analogInPin);  
  }
null = av/(loop1) ;

 nullValue = map(null, 0, 1023, 0, 5000);  // Umwandlung in mV (Skalierung);

Serial.print("Nullinie in mV: "); Serial.print(nullValue); Serial.print(","); Serial.print(null); Serial.println(" (aus 1023)"); Serial.println("") ;


// Triggerschleife 2  für Start der Messwertspeicherung:

zeit = micros();
mesw = analogRead(analogInPin);

while (mesw < null+trigval) // Drehe Schleife ohne Registrierung bis Messwert >= null; Abweichung von null
{ mesw = analogRead(analogInPin); }

// jetzt messbereit

zeit = micros() ;

// Mess-Schleife

  for (int idx = 1; idx < loop1; idx++)
  {mess[idx] = analogRead(analogInPin);    // Messung über Analogeingang, der durch die Konstante analogInPin (A0)  bestimmt ist
   mess2[idx] = analogRead(analogInPin2);  // bei 2-kanaliger Messung; optional
 
   } // Datensätze gemessen

zeit = micros() - zeit;   // Gesamt-Zeitdauer für Messung und Speicherung von loop1 Messdaten

mess[0] = null ;  // erster relevanter Messwert vor Mess-Schleife 1 für Einschalten ergänzt
mess2[0] = null ;  // bei 2-kanaliger Messung

 
// Ausgabeschleife

  for (int idx = 0; idx < loop1; idx++)
  {
  int adr=&mess[idx];   // Adresse des Messwerts der Nummer idx; optional
  idx1 = idx ;
  time = (zeit/loop1)*idx1;   //  laufende Zeit

  outputValue = map(mess[idx], 0, 1023, 0, 5000);  // Umwandlung in mV (Skalierung)

  outputValue2 = map(mess2[idx], 0, 1023, 0, 5000); // bei 2-kanaliger Messung; optional


   Serial.print(idx); Serial.print(",");  Serial.print(time); Serial.print(","); Serial.print(outputValue); Serial.print(",");
   Serial.print(nullValue);  Serial.print(",");  Serial.println(outputValue2);  Serial.println("");  // bei 2-kanaliger Messung

   // Serial.print(nullValue);  // dient zum Zeichnen der Nulllinie

   // Serial.print(adr); Serial.print(","); könnte am Zeilenbeginn ergänzt werden zur Kontrolle der SRAM-Adressen, die <= 1999 sein     // müssen; optional
   }

Serial.println("") ; Serial.print("Zeitintervall in microsec = "); Serial.print(zeit/loop1); Serial.println("");

delay(1000); bereit = true ;

Serial.println("") ; Serial.println("Neue Runde, wenn PC-Taste gedrückt !") ; Serial.println("") ;

  // nächste Runde
}