Hallo!
Kurze Vorstellung des Projekts:
- Sequenzielles Öffnen und Schliessen von 4 Relays an die Magnetventile angeschlossen werden
- Die Schaltzeiten werden in Sekundenkommagetrennt an an die serielle Schnittstelle geschickt (zb. "10,20,30,40\n" -> Ventil 1 für 10 Sekunden offen, dann Ventil 2 für 20 Sekunden usw.)
- "Not-Aus"- Funktion: wird zb. 'S' geschickt, soll der loop abbrechen und alle Relais sollen auf OFF geschaltet werden
Derzeit arbeitet das Ganze mit delays, was es mit nicht möglich macht, das "Not-Aus"- Signal während des loops zu empfangen und darauf zu reagieren.
Hab mir schon das BlinkWithoutDelay angesehen, weiss aber noch nicht, wie ich es auf mein Projekt adaptieren kann...bin erst vor Kurzem in die Arduino-Welt eingetaucht.
Als Anfänger würde ich mich über Unterstützung bei der Umsetzung und Feedback über etwaige Optimierungsmöglichkeiten freuen!
Hier der aktuelle Stand:
char buffer[300];
long data[4];
int bindex,dindex = 0;
char delimiter = ',';
char newline = '\n';
char stopSign = 'S';
int R1 = 10;
int R2 = 11;
int R3 = 12;
int R4 = 13;
int R_ON = LOW;
int R_OFF = HIGH;
void setup() {
//relais
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
digitalWrite(R1, R_OFF);
digitalWrite(R2, R_OFF);
digitalWrite(R3, R_OFF);
digitalWrite(R4, R_OFF);
Serial.begin(9600);
}
void loop() {
while(Serial.available() > 0) {
parseInput();
}
}
void parseInput() {
//aktuelles Zeichen einlesen
buffer[bindex] = Serial.read();
//Not-Aus ('S')
if (buffer[bindex] == stopSign){
stopIt();
}
//Trenner (,) oder Zeilenende (\n) gefunden
if(buffer[bindex] == delimiter || buffer[bindex] == newline) {
//Null-Terminierung
buffer[bindex] = 0;
//Umwandeln in eine Zahl
data[dindex] = atol(buffer);
//Datenindex rotieren
dindex = ++dindex % 4;
//wenn index wieder auf 0 gesetzt wird, dann wurden 4 werte eingelesen
if(dindex==0) {
doIt();
}
//Buffer Index zurücksetzen
bindex = 0;
}
else {
bindex++;
}
}
void doIt() {
Serial.println("=== Bewaesserung an ===");
printState(1, data[0]);
openValve(R1, data[0]);
printState(2, data[1]);
openValve(R2, data[1]);
printState(3, data[2]);
openValve(R3, data[2]);
printState(4, data[3]);
openValve(R4, data[3]);
Serial.println("=== Bewaesserung aus ===");
}
void printState(int relais, int sekunden) {
Serial.print("Ventil ");
Serial.print(relais);
Serial.print(" offen fuer ");
Serial.print(sekunden);
Serial.print(" Sekunden");
Serial.print("\n");
}
void openValve(int relais, long seconds) {
// //blocking!!!
// digitalWrite(relais, R_ON);
// delay(seconds*1000);
// digitalWrite(relais, R_OFF);
//Versuch non-blocking, blockt aber noch :-(
unsigned long startTime = millis();
unsigned long duration = seconds * 1000;
unsigned long endTime = startTime + duration;
digitalWrite(relais, R_ON);
while (millis() < endTime) {
//hmmm...
}
digitalWrite(relais, R_OFF);
}
void stopIt() {
Serial.println("=== Abbruch ===");
digitalWrite(R1, R_OFF);
digitalWrite(R2, R_OFF);
digitalWrite(R3, R_OFF);
digitalWrite(R4, R_OFF);
}