// 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.
*/
// 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
// 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
}