Ich habe ein Problem mit den millis().
Wenn ich die Taste 0 auf meinem Keypad drücke, läuft das Programm ganz normal durch die if Bedingung.
Sobald er in die letzte Anweisung geht(also nach einander die Relais anschalten soll) geht nur das letzte Relais an, obwohl erst Relais 1, Relais2, und dann Relais4 angehen sollen.
Bei den anderen Tasten, wo vorher nichts passiert, funktioniert alles(Relais schalten so wie sie sollen).
Deshalb glaube ich, dass ich die currentMillis = millis() falsche setze.
Allerdings hab ich bisher noch keine Lösung gefunden. Vielleicht hat jemand ja eine Idee.
#include <Keypad.h>
#include <AccelStepper.h>
#include <PololuMaestro.h>
// Größe des Keypads definieren
const byte COLS = 4; // 4 Spalten
const byte ROWS = 4; // 4 Zeilen
// Die Ziffern und Zeichen des Keypads
char hexaKeys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte colPins[COLS] = { 11, 12, 4, 5 }; // Pins für die 4 Spalten
byte rowPins[ROWS] = { 7, 6, 8, 9 }; // Pins für die 4 Zeilen
char Taste; // Variable für die jeweils gedrückte Taste
Keypad Tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
const int relayPins[] = { A0, A1, A2, A3, A4, A5, A6 };
const int numRelays = sizeof(relayPins) / sizeof(relayPins[0]);
unsigned long previousMillis = 0;
int currentPatternIndex = 0;
bool patternActive = false;
int patternLength = 0;
const int *currentPattern = nullptr;
const unsigned long *relayIntervals = nullptr;
// Beispielmuster
const int pattern0[] = { 0, 1, 3 };
const unsigned long relayIntervals0[] = { 4000, 4000, 4000 };
const int pattern1[] = { 2, 3 };
const unsigned long relayIntervals1[] = { 2000, 3000 };
const int pattern2[] = { 0, 1, 3 };
const unsigned long relayIntervals2[] = { 4000, 4000, 4000 };
#ifdef SERIAL_PORT_HARDWARE_OPEN
#define maestroSerial SERIAL_PORT_HARDWARE_OPEN
#else
#include <SoftwareSerial.h>
SoftwareSerial maestroSerial(18, 19);
#endif
MicroMaestro maestro(maestroSerial);
const int open = 8000;
const int close = 6000;
AccelStepper stepper(1, 2, 3);
int endstop_1 = A14;
int endstop_2 = A15;
void setup() {
Serial.begin(9600);
maestroSerial.begin(9600);
//Endstop
pinMode(endstop_1, INPUT);
pinMode(endstop_2, INPUT);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(1000);
stepper.setSpeed(100);
for (int i = 0; i < numRelays; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], HIGH); // Relais anfangs ausschalten (HIGH bedeutet ausgeschaltet für ein Relaismodul)
}
}
void startPattern(const int pattern[], const unsigned long intervals[], int length) {
currentPattern = pattern;
relayIntervals = intervals;
patternLength = length;
currentPatternIndex = 0;
patternActive = true;
previousMillis = millis();
digitalWrite(relayPins[currentPattern[currentPatternIndex]], LOW);
Serial.print("Relais ");
Serial.print(currentPattern[currentPatternIndex] + 1);
Serial.println(" eingeschaltet");
}
void loop() {
Taste = Tastenfeld.getKey();
unsigned long currentMillis = millis();
if (Taste) { // Wenn eine Taste gedrückt wurde
Serial.print("Die Taste ");
Serial.print(Taste);
Serial.println(" wurde gedrückt");
if (Taste == '0' && digitalRead(endstop_1) == LOW) {
maestro.setSpeed(50, 50);
maestro.setAcceleration(10, 10);
//StartSchrittMotor;
stepper.setMaxSpeed(800);
stepper.runToNewPosition(-3730);
maestro.setTarget(0, open);
delay(3000);
maestro.setTarget(0, close);
stepper.setMaxSpeed(400);
stepper.runToNewPosition(-3250);
maestro.setTarget(0, open);
delay(3000);
maestro.setTarget(0, close);
stepper.setMaxSpeed(400);
stepper.runToNewPosition(-2680);
maestro.setTarget(0, open);
delay(3000);
maestro.setTarget(0, close);
stepper.setMaxSpeed(400);
stepper.runToNewPosition(-1800);
//Mischgetränke
//StoppSchrittMotor;
//Für die Relais
startPattern(pattern0, relayIntervals0, sizeof(pattern0) / sizeof(pattern0[0]));
} else if (Taste == '1') {
startPattern(pattern1, relayIntervals1, sizeof(pattern1) / sizeof(pattern1[0]));
} else if (Taste == '2') {
startPattern(pattern2, relayIntervals2, sizeof(pattern2) / sizeof(pattern2[0]));
}
}
if (patternActive) {
if (currentMillis - previousMillis >= relayIntervals[currentPatternIndex]) {
digitalWrite(relayPins[currentPattern[currentPatternIndex]], HIGH); // Aktuelles Relais ausschalten
Serial.print("Relais ");
Serial.print(currentPattern[currentPatternIndex] + 1);
Serial.println(" ausgeschaltet");
currentPatternIndex++;
if (currentPatternIndex < patternLength) {
digitalWrite(relayPins[currentPattern[currentPatternIndex]], LOW); // Nächstes Relais einschalten
Serial.print("Relais ");
Serial.print(currentPattern[currentPatternIndex] + 1);
Serial.println(" eingeschaltet");
previousMillis = currentMillis;
} else {
patternActive = false; // Muster ist beendet
Serial.println("Muster abgeschlossen");
}
}
}
}