Ciao tutti,
Ich habe was gebastelt. Da ich versucht habe, mich Schritt für Schritt zu nähern, kann das vllt auch anderen Einsteigern helfen.
Erst mal der Code:
// Erfassen von analog-Signal, hier Wegemessung, in den Rechner
//Linearprüfung Wegemessung/ Ausgabe auf Servo
// Hier mit Erweiterung zum Spielen
//
#include <Servo.h> // Servo Libary laden
Servo myservo; // Erzeuge Servo Objekt
int analogPin0 = 0; // 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin1 = 0; // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin2 = 0; // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int analogPin3 = 0; // not active 1st pin to read, 10/ 8,2k, 0-10V => 0- fast 5V
int val0 = 0; // Ergebnisvariable 0
int val1 = 0; // not active Ergebnisvariable 1
int val2 = 0; // not active Ergebnisvariable 2
int val3 = 0; // not active Ergebnisvariable 3
int pin2 = 2; // Digital Pin2, Umschaltung Logger start/ Stop
int pin3 = 3; // Digital Pin2, 10facher Taktwert
int valPin2 = 0; // Status Pin2
int valPin3 = 0; // Status Pin3
int valServo = 0; // Servovariable
long time; // Millis
long nextMillis; // nächster Erfassungspunkt
long takt = 1000; // Erfassungsrate Hier eintragen nach wieviel
// ms die neue Messung beginnt. Minimum 50ms
long ratio = 10; // Verhältnis lange/ kurze Zeit, Umschaltung Pin3
void setup()
{
Serial.begin(9600); // setup serial
Serial.print("Millis, ");
Serial.print("4xWert, ");
Serial.print("Status Pin 2 u 3");
Serial.println(); // Leerzeile
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(pin2 , INPUT); // Pin2 auf Eingang
digitalWrite(pin2 , HIGH);// Pin2 Pullup Aktiv
pinMode(pin3 , INPUT); // Pin3 auf Eingang
digitalWrite(pin3 , HIGH);// Pin3 Pullup Aktiv
}
void loop()
{
valPin2 = digitalRead(pin2);
if (valPin2 == LOW)
{
return; // wenn der Taster betätigt wird, dann soll der Logger stoppen,
//andernfalls Daten erfassen (später mal auf Karte)inverse Logik
}
valPin3 = digitalRead(pin3);
if (valPin3 == LOW)
{
takt = (takt * ratio); // Taktzeit mal 10, wenn Kontakt geschlossen, inverse Logik
}
else
{
takt = (takt * 1); // Tacktzeit direkt, wenn Kontakt geöffnet
}
unsigned long currentMillis = millis();
if(currentMillis > nextMillis) {
nextMillis = (currentMillis + takt - 1);
val0 = analogRead(analogPin0); // lesen 1.Wert // hier erstmal nur ein Kanal aktiv
// val1 = analogRead(analogPin1); // lesen 2. Wert // deaktiviert
val2 = analogRead(analogPin2); // lesen 3. Wert // aktiv, Random Wert vom Antenneneffekt
// val3 = analogRead(analogPin3); // lesen 4. Wert // deaktiviert
Serial.print(currentMillis); // Zeit
Serial.print(" ms,"); // CSV
Serial.print(val0); // 1. Wert
Serial.print(","); // CSV
Serial.print(val1); // 2. Wert
Serial.print(","); // CSV
Serial.print(val2); // 3. Wert
Serial.print(","); // CSV
Serial.print(val3); // 4. Wert
Serial.print(",Servo: "); // CSV
Serial.print(valServo); // 4. Wert
Serial.print(",Status: "); // CSV
Serial.print(valPin2); // Status Pin2
Serial.print(","); // CSV
Serial.print(valPin3); // Status Pin3
Serial.println(); // neue Zeile
valServo = map(val0, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(valServo); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}
}
Das Ein/ Ausschalten mit 'Return' funzt zwar noch nicht, da komme ich aber auch noch hinter...
Hintergrund war/ ist eine Sensor- Messeung, welche innerhalb ~1 minute zwischen einem Minimum und einem Maximum in einem Gesamtmessbereich von 0- 10 V einen Wert in eine Steuerung liefert. Dort habe ich mich parallel, also gemeinsame Masse, Spannungsteiler (2x 4,7k)/ 10k draufgelget und für die ersten Versuche im 200ms Takt mitgeloggert. Der Fehler konnte so zumindest sichtbar gemacht werden.
ok, etwas umständlich dem Arduino über den Serial Monitor auf die Bits zu gucken, diese dann mit 'Strg+A/ Strg+C' in eine Text/ CSV Datei zu kopieren, hat aber gereicht, bis ich mein zweites Loggerschield habe.
Tests haben ergeben, dass ich bei 9600 bps bis ca. 50ms komme, also für normale elektrische Sachen schon mal nicht verkehrt
die eine ms in der Taktberechnung ist übrigens erforderlich, da sonst, also kleiner oder größer, die ms wehlaufen. mit der zusätzlichen 1 ms komme ich auf 201, 401, 601 usw...
Gibt da noch einen etwas eleganteren Trick?
und wie bekomme ich den Code bei einem anliegenden Signal gestartet/ gestoppt?
Als Äpfelchen habe ich noch den Servo mit eingebaut. Da es um die Linearität des Messsystems geht, kann am Servo schön gesehen werden, wenn/ ob der Wert wackelt. Ok, mit den 15ms delay des Servos ist eine Verzögerung drin, die deutlich gemerkt wird, aber mit einem kleineren Servo will ich demnächst kürzere Delays versuchen.
Ein weiterer Schritt ist auch das zusammenfassen in einen String (also String= String1+ String2...., die einzelnen Strings sollen dann abwechselnd die Zwischenzeichen und die Werte erhalten, und dann 'in einem Flush' auf Karte/ Serial geschrieben werden..) aber das dauert noch was..
Danke, Greetz,
ich hoffe es regt auch ein wenig an...
Greetz, Tom