Kommutator umpolen

Hallo, ich habe folgendes Problem ich versuche über einen Arduino Uno mit einer H-Brücke umzupolen. Das Funktioniert soweit.

Bisher habe ich folgenden Code mit wenig Erfolg verwendet.

int SensorAnalog = A1;
int Relais1 = 6;
int Relais2 = 4;
bool trigger = false;

void setup() {
  pinMode(Relais1, OUTPUT);
  pinMode(Relais2, OUTPUT);
  pinMode(SensorAnalog, INPUT);
}

void loop() {
  int wert = analogRead(SensorAnalog);

  if (wert <= 300 && !trigger) { 
    digitalWrite(Relais1, HIGH); 
    digitalWrite(Relais2, HIGH); 
    trigger = true; 
  } else if (wert <= 300 && trigger) { 
  } else if (wert > 300 && trigger) { 
    digitalWrite(Relais1, LOW); 
    digitalWrite(Relais2, LOW); 
    trigger = false; 
  }
}

Ich hoffe mir kann irgendwer mit diesem etwas verwirrenden Problem helfen ;_;

Ich komme weder mit der Aufgabenstellung noch mit dem Code klar.

void loop()
{
  int wert = analogRead(SensorAnalog);
  if (wert <= 300 && !trigger)
  {
    digitalWrite(Relais1, HIGH);
    digitalWrite(Relais2, HIGH);
    trigger = true;
  }
  else if (wert <= 300 && trigger)
  {
  }
  else if (wert > 300 && trigger)
  {
    digitalWrite(Relais1, LOW);
    digitalWrite(Relais2, LOW);
    trigger = false;
  }
}

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 :confused:

Ich glaub ich habs.
Du bringst die Begrifflichkeiten wirr....

  • Der Sensor merkt die erste Annäherung.
  • Damit soll ein Merker gesetzt werden.
  • Danach verliert der Sensor die Annäherung
  • kommt die nächste Annäherung, soll der Merker gelöscht werden.

Richtig?
Zustatzfrage: Die Annäherung wäre dann Dein Sensorwert unter 300?

Ja entschuldige ich hatte einen langen tag damit ;_;

Genau

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

1 Like

Oh mein Gott es funktioniert vielen vielen Dank dir. Du hast mir den Abend gerettet <3

So weit ist es nu schon mit mir gekommen... Ich hätte irgendwas mit Rettungssanitäter lernen sollen. :crazy_face:

Dann setz das Häkchen für die Lösung. Ist gut für die Suche und in der Übersicht sieht man das es erledigt ist...

@my_xy_projekt es funktioniert hätte auch genügt :wink: Er glaubt es sonst noch. :wink:
Sorry, konnte ich mir nicht verkneifen.

Gruß Tommy

Ach solange ich noch Code schreibe, der von Dir auch nach der Lösung gelesen und nicht massiv beanstandet wird, bin ich schon zufrieden...
:innocent:
(ja ich hätte constexpr und uint16_t machen können... :wink:)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.