Folgender CODE hat folgende Aufgabe:
#define NUMBER_OF_FIELDS 20
int values[NUMBER_OF_FIELDS];
byte fieldIndex;
int cam;
void setup()
{
Serial.begin(9600);
//Serial.println("Anfang");
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
}
void loop()
{
Serial.println("verbunden");
if ( Serial.available())
{
char ch = Serial.read();
Serial.print(ch, HEX);
Serial.print('\t');
Serial.println(fieldIndex);
if (ch >= '0' && ch <= '9') // ASCII-Zeichen zwischen 0 und 9?
{
if (fieldIndex < NUMBER_OF_FIELDS) {
values[fieldIndex] = (values[fieldIndex] * 10) + (ch - '0');
}
}
else if (ch == '|')
{
fieldIndex++;
}
else if (ch == '\n')
{
if (values[2] == 2) {
digitalWrite (2, HIGH); // Ventil_1 auf zum Durchspülen
} else if (values[2] == 1) {
digitalWrite (2, LOW);
} else if (values[2] == 0) {
// Routine für TaT
delay (values[0]); // Verzögerung vor Öffnung 1
digitalWrite (2, HIGH); // Ventil_1 auf
delay (values[1]); // offen
digitalWrite(2, LOW); // zu
if (values[5] == 1) // Ventil_1 Öffnung 2, wenn checkbox true
{
delay (values[3]); // warte
digitalWrite (2, HIGH); // auf
delay (values[4]); // offen
digitalWrite(2, LOW); // zu
}
// Kamera verzögert auslösen
delay (values[9]);
digitalWrite(3, HIGH);
delay (50);
digitalWrite(3, LOW);
}
for (int i = 0; i < min(NUMBER_OF_FIELDS, fieldIndex + 1); i++)
{
Serial.print(values[i], DEC);
Serial.print(" ");
values[i] = 0; // loeschen
}
fieldIndex = 0; // für Neustart
Serial.println();
}
}
}
Über VB erhält der Arduino eine pipesepariert Zeichenkette gefolgt von einem „New line“.
80|500|0|90|300|-1|100|49|0|213|300|-1|-1|363|0|0|0|0|0|0|0
Dann wird ein Ventil maximal dreimal hintereinander für eine bestimmte Zeit geöffnet. Das Ventil gibt Wassertropfen ab, die dann schließlich fotografiert werden.
Dieser Code funktioniert sehr gut.
Nun möchte ich zwei weitere Ventile ins Spiel bringen. Mit delay(…) geht das ja nicht mehr, weil die drei Ventile nicht hintereinander, sondern auch gleichzeitig öffnen sollen. Zum Testen habe ich natürlich keine Ventile sondern LEDs im Einsatz.
Seit Woche probiere ich ohne Erfolg.
Die von VB übermittelten Daten sehen wie folgt aus:
1|200|200|1|200|200|1|200|200|0|0|0|0|0|999|1|210|215|1|220|230|1|240|250|0|0|0|0|0|999|1|210|215|1|220|230|1|240|250|0|0|0|0|0|999|222|300|1|1
Jeweils 14 Werte (999 ist der "Trenner") sind für ein Ventil vorgesehen, der Rest für die Ansteuerung von Kamera und Blitz.
Die Werte 1-14, 15- … wollte ich in ein zweidimensionales Array (3 rows, 14 cols) speichern und dann zur Ansteuerung einer eigenen Funktion benutzen, den Rest der Daten (Kamera/Blitz) sollen in ein eigenes Array.
Egal wie ich es versuche, entweder reagiert der Arduino gar nicht oder er hängt sich auf oder die Ventile/LEDs sind offen/an und gehen nicht mehr zu/aus. Auch die Eingabe dieses Strings am seriellen Monitor bringt keinen Erfolg.
Wer kann mir bitte etwas auf die Sprünge helfen, einen Ansatz aufzeichnen? Muss ich wie im obigen Code die Werte nach dem abarbeiten wieder löschen (Zeile …). Oder ist dieser Code ansich schon „perfekt“ und muss „nur“ entsprechend angepasst und erweitert werden? Brauche ich serialflash()? Ich komme einfach nicht weiter?!
Vielen Dank im Voraus.