Was ist das erste elseif?
Und ich denke, das Du das anders aufbauen kannst.
Ich versteh nur nicht, was wann passieren soll?
Da ist keinerlei Kommentar drin, das ich auch nur erahnen kann, was die 300 und was trigger machen soll...
Das wäre mein erster Ansatz:
void loop()
{
int wert = analogRead(SensorAnalog);
if (wert <= 300)
{
if (!trigger)
{
digitalWrite(Relais1, HIGH);
digitalWrite(Relais2, HIGH);
trigger = true;
}
else
{
}
}
else if (trigger)
{
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
trigger = false;
}
}
Nur für die Übersicht.
Allerdings ist das nix, was ich nehmen würde um damit eine Schrittkette zu bauen, da der Analogwert Dir evtl. zwischendurch wegbricht und damit der zweite Schritt nie ausgeführt wird.
woran merkst Du wo sich der Anker befindet?
Mir fehlt irgendwie ein Bezugswert, mit dem ich arbeiten kann.
Der Motor in Grundstellung - alles aus.
Dann geht die Schaltung in die erste Phase.
Bis der Sensor auslöst?
Nach dem auslösen in die zweite Phase?
Wie merkst Du, das die beendet ist?
Ich habe einen MH-Sensor der den Abstand erkennt und sobald der abstand kleiner wird, also der Anker vor dem Sensor steht gibt der ein Signal und stellt es auf High. und das Signal muss irgendwie an bleiben bis die andere Rotorseite den Sensor passiert worauf es dann auf low gestellt werden muss und wieder von vorn
const byte sensorPin = A1;
const byte relaisOnePin = 6;
const byte relaisTwoPin = 4;
enum {wait2start, triggerOne, waitForAnker, triggerTwo};
byte state = wait2start;
void setup()
{
pinMode(relaisOnePin, OUTPUT);
pinMode(relaisTwoPin, OUTPUT);
pinMode(sensorPin, INPUT);
}
void loop()
{
int wert = analogRead(sensorPin);
switch (state)
{
case wait2start:
if (wert <= 300) // Der Näherungssensor hat ausgelöst
{ state = triggerOne; } // ersten Schritt machen
break;
case triggerOne:
digitalWrite(relaisOnePin, HIGH);
digitalWrite(relaisTwoPin, HIGH);
if (wert > 300) // Warten, das der Sensor frei ist
{ state = waitForAnker; } // nächsten Schritt machen
break;
case waitForAnker:
if (wert <= 300) // Der Näherungssensor hat zum zweiten Mal ausgelöst
{
state = triggerTwo; // nächsten Schritt machen
}
break;
case triggerTwo:
digitalWrite(relaisOnePin, LOW);
digitalWrite(relaisTwoPin, LOW);
if (wert > 300) // Und hier ist der Punkt, wo was neues passieren muss
{
state = wait2start;
}
break;
}
}
Rudimentär.
Kurz kommentiert - weil ich noch nicht sicher war, wann die Relais auslösen sollen
Ach solange ich noch Code schreibe, der von Dir auch nach der Lösung gelesen und nicht massiv beanstandet wird, bin ich schon zufrieden...
(ja ich hätte constexpr und uint16_t machen können... )