Timer für bestimmte Bedingungen setzen [Wegfahrsperre]

Moin zusammen,

ich bin sehr neu in der Arduino-Welt, und bin deshalb jetzt schon an meiner derzeitige Grenze gestoßen.

Ziel ist es, das die LED nur unter bestimmten Voraussetzungen leuchtet. Es handelt sich halt nur im Testaufbau um eine LED ansonsten soll dieses Projekt als eine Wegfahrsperre dienen, bzw. Motivationskiller für Diebe.

Variante 1:
Wenn S1 und S2 = HIGH soll ein Timer (timer1) für 2s laufen wobei die LED ebenfalls für 2s leuchtet.

Variante 2:
Wenn der timer1 und S3 = HIGH sind soll die LED HIGH sein bis S1 LOW ist.

Problem:
Ich habe inzwischen schon herausgefunden das der Einsatz der delay Funktion ich alles andere blockiere und somit keine weiteren Befehle während des delays ausüben kann.
Aber wie genau ich dort jetzt eine andere Funktion einsetze um zum Ziel zu kommen ist mir unklar (millis() vermutlich, aber daran bin ich gescheitert)

Aktuelle Situation:
Beim betätigen von S2 geht die LED für 2s an. Beim betätigen von S3 geht die LED permanent an, egal ob die 2s abgelaufen sind oder nicht.

Würde mich freuen wenn mir da jemand auf die Sprünge hilft.

Der Unvollständige Code:

/* 
 *  Ziel ist es, das die LED nur unter bestimmten Vorraussetzungen leuchtet.
 *  Variante 1: Wenn S1 und S2 = HIGH soll ein Timer (timer1) für 2s laufen wobei die LED ebenfalls für 2s leuchtet.
 *  Variante 2: Wenn der timer1 und S3 = HIGH sind soll die LED HIGH sein bis S1 LOW ist.
*/


//Variablen
const int S1=2;   
const int S2=3;   
const int S3=4;   
const int led=5;   //LED

int timer1=0;
int ledStatus=0;     //LED Status

void setup() 

{
  pinMode(S1,INPUT);
  pinMode(S2,INPUT);
  pinMode(S3,INPUT);
  pinMode(led,OUTPUT);
}

void loop() 
{
 ledStatus=led;
 
  //Variante 1 
  if(digitalRead(S1)==HIGH && digitalRead(S2)==HIGH)
  {
    digitalWrite (ledStatus, HIGH);
    digitalWrite (timer1, HIGH);
    delay(2000);
    digitalWrite (ledStatus,LOW);
    digitalWrite (timer1,LOW);  
  }
  
  //Variante 2
  if (digitalRead(timer1)==HIGH && digitalRead(S3)==HIGH)
  {   
    digitalWrite (ledStatus, HIGH);
  }
}

MfG

Hi

Wie viele verschiedene Status hast Du?
LED aus, Taster 1 unbetätigt, Taster 2 unbetätigt, Taster 3 unbetätigt
könnte man zu 0-0-0-0 machen
Also 4 Bit - macht 16 verschiedene Kombinationen.
Weiter kommt noch eine Zeit hinzu, wobei man Das in dem entsprechendem Status abfrühstücken könnte.
Was soll bei jeder der Kombinationen passieren, in welchen Status wechselst Du wann?
Wer ist 'timer' und warum hat Der so einen seltsamen Namen?
S1-S3 könnten Taster sein.
Zum Beispiel wechselst Du von
0-1-1-0 -> 1-1-1-0 (wenn LED aus und Taster 1 und Taster 2 betätigt, Taster 3 unbetätigt, schalte LED an)

MfG

ich lese deine Angabe so:

Wenn S1== HIGH && S2== HIGH startet timer und LED soll leuchten
Läuft der Timer && S3== HIGH dann LED aus (der Timer wird beendet)

Solange du nicht weist, was dein Ding macht, rate ich dir, bau Serial.print ein, damit du siehst was dein Sketch macht.

In etwa so, kompiliert aber hardwaremäßig nicht nachgebaut:

//Variablen
const byte S1 = 2;
const byte S2 = 3;
const byte S3 = 4;
const byte led = 5; //LED

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Schalten"));
  pinMode(S1, INPUT);
  pinMode(S2, INPUT);
  pinMode(S3, INPUT);
  pinMode(led, OUTPUT);
}

void loop()
{
  static bool timerLauft = false;
  static uint32_t previousMillis = 0;

  if (digitalRead(S1) == HIGH && digitalRead(S2) == HIGH)   // Timer einschalten, retiggerbar
  {
    Serial.println(F("Timer einschalten"));
    timerLauft = true;
    previousMillis = millis();
    digitalWrite (led, HIGH);    //LED behandeln
  }

  if (timerLauft && digitalRead(S3)) // auf S3 checken
  {
    Serial.println(F("S3 wurde während Timer gedrückt"));
    timerLauft = false;
    digitalWrite (led, LOW);
  }

  if (timerLauft && millis() - previousMillis > 2000)  // auf Zeitablauf checken
  {
    Serial.println(F("Zeit abgelaufen"));
    timerLauft = false;
    digitalWrite (led, LOW);
  }
}

Anmerkung: Die Beschreibungen hier beziehen sich alle auf eine Wegfahrsperre eines Aufsitzrasenmähers im australischen Outback innerhalb eines umzäunten Geländes :wink:

Oha

Australien ist gefährlich, bei dem ganzen Viehzeugs dort wäre ein Papa-Mobil - also Glaskasten/eingehauster Sitz - bestimmt von Vorteil.

Ergibt aber Sinn, auch so einem Teil die Wegfahrt nur zu erlauben, wenn der passende RFID-Chip erkannt wurde.

Also damit hätte ich jetzt keine Probleme - die Umschreibung der Funktionalität und das Wort 'Timer', Welches recht oft vorkommt und wohl nicht einen Timer in Dem Sinne meint, macht's aber nicht leichter.

@TO
Benutze normale Umschreibungen, nicht, was Du denkst, was hier wohl aus dem µC dort mitspielen will.

MfG

Problem:
Ich habe inzwischen schon herausgefunden das der Einsatz der delay Funktion ich alles andere blockiere und somit keine weiteren Befehle während des delays ausüben kann.
Aber wie genau ich dort jetzt eine andere Funktion einsetze um zum Ziel zu kommen ist mir unklar (millis() vermutlich, aber daran bin ich gescheitert)

lies mal BlinkwithoutDelay - Die Nachtwächtererklärung - Deutsch - Arduino Forum

Grüße Uwe

Moin,

also ich hab da noch bissl dran getüftelt.
Bin inzwischen auch schon näher am Ziel aber in Sicht ist es für mich noch nicht...

Vorab versuch ich die Fragen zu beantworten:

postmaster-ino:
Wie viele verschiedene Status hast Du?

In Meinen Augen habe ich nur zwei (siehe Anhang Status)

noiasca:
ich lese deine Angabe so:

Wenn S1== HIGH && S2== HIGH startet timer und LED soll leuchten
Läuft der Timer && S3== HIGH dann LED aus (der Timer wird beendet)

Solange du nicht weist, was dein Ding macht, rate ich dir, bau Serial.print ein, damit du siehst was dein Sketch macht.

Also bezüglich der Ziele hoffe ich das der Anhang "Status" da auch Unklarheiten beseitigt.

Allerdings habe ich noch Schwierigkeiten mit der Serial.println Funktion, denn wenn ich ihn nutze wird mir lediglich der Wert von der Variable angezeigt den ich Abfrage allerdings nicht der Status (damit meine ich LOW oder HIGH).

Gibt es eine Möglichkeit womit ich mir den HIGH/ LOW Status ablesen kann über die Serial.println Funktion?

uwefed:
lies mal BlinkwithoutDelay - Die Nachtwächtererklärung - Deutsch - Arduino Forum

Danke!

Also zur Zeit funktioniert alles bis auf die //Variante 2, denn wenn S1 & VarianteOneStatus & S3 HIGH sind, sollte eigentlich M1 so lange auf HIGH bleiben, bis S1 LOW ist.

Während S1 und M1 HIGH sind, und ich S3 HIGH setze, geht M1 dennoch nach 5s auf LOW.
(Vermutlich weil zuvor M1 und VarianteOneStatus auf LOW gesetzt werden, nur leider weiß ich noch nicht wie ich das Umgehen kann)

Außerdem wird M1 immer auf HIGH gesetzt sobald S1 und S3 HIGH sind, was sich mir auch nicht erschließt...

Aktuelles Programm:

const int S1 = 2; //Zündungsplus
const int S2 = 3; //Taster für die erste Bedingung
const int S3 = 4; //Taster für die zweite Bedingung
const int M1 = 5; //Freigabe für den Motorstart

int VarianteOneStatus;
int M1Status = M1; //Status über den Motorstart
unsigned long currentmillis;

void setup()
{
Serial.begin(9600);

pinMode(S1, INPUT);
pinMode(S2, INPUT);
pinMode(S3, INPUT);

pinMode(M1, OUTPUT);
}

void loop()
{
//Variante 1: Wenn S1 und S2 auf HIGH gesetzt sind, soll M1 für 5s auf True gesetzt werden.
if (digitalRead(S1) == HIGH && digitalRead(S2) == HIGH)
{

if (millis() - currentmillis > 0) //Wenn der milliscounter größer als 0 ist, wird M1 und VarianteOneStatus auf HIGH gesetzt.
{
currentmillis = millis();
digitalWrite (M1Status, HIGH);
digitalWrite (VarianteOneStatus, HIGH);
//Serial.println(M1Status);
}
}
if (millis() - currentmillis > 5000) //Wenn M1 5s auf HIGH ist, wird M1 und VarianteOneStatus auf LOW gesetzt.
{
digitalWrite(M1Status, LOW);
digitalWrite(VarianteOneStatus, LOW);
}

// Variante 2: Wenn VarianteOneStatus und S3 auf HIGH gesetzt sind, soll M1 auf HIGH gesetzt werden bis S1 auf LOW gesetzt ist
if (digitalRead (S1) == HIGH && digitalRead(VarianteOneStatus) == HIGH && digitalRead(S3) == HIGH)
{
digitalWrite(M1, HIGH);
Serial.println("Test");
}
}

Ich hoffe ich habe mich dieses mal klarer ausgedrückt, danke schon mal im Voraus.

MfG

Status.PNG

ernst gemeinte Frage:

Glaubst du dass deine Mutter deine Angabe versteht?
Wenn du dir nicht absolut sicher bist, versuche deine Angabe noch deutlicher zu formulieren.
Die Frage hat einen ernstgemeinten Hintergrund: Quietscheentchen-Debugging – Wikipedia

Solange du es nicht einfach beschreiben kannst, kannst du es auch nicht programmieren.

Hi

Da S1 und VarianteOneStatus in beiden Zeilen identisch sind, werden Die nicht gebraucht.
Da Du Diese trotzdem mitschleppst, hast Du dazu irgend welche Gedanken, Die Du uns verheimlichst.

Bei drei Inputs gibt's 8 mögliche Eingangs-Varianten - somit wäre ich bei 8 möglichen Status.
Was wann passiert (also welche Kombination wir eben noch hatten zu Jetzt) steht noch ziemlich in den Sternen.

Versuche bitte erneut, uns die Funktionalität näher zu bringen - alleine die Zeit benötigt die Verarbeitung einer Flanke.

Halbwegs sicher ist bis jetzt nur: OUTPUT=(S1 && S3)
Dort fehlt aber die Zeit-Zeile komplett.

MfG

Moin,

okay.. und ich dachte ich bin ganz gut im eindeutigen beschreiben.

Ich versuche es anders zu beschreiben:

Ich möchte über den Arduino eine Wegfahrsperre/ Diebstahlsicherung im Auto realisieren.

Es gibt einen Zündungsplus beim Schlüsselschalter (S1) der so lange HIGH ist wie der Schlüsselschalter auf Stufe 1 und 2 gestellt ist.

Dann soll es einen versteckten Taster geben (S2), aber dennoch relativ Leicht zu finden sein. Beim betätigen des Tasters soll der Motor (M1) eine gewisse Zeit anspringen (in dem Fall 5s für Testzwecke, später vermutlich bisschen mehr). Das soll dazu dienen dem Dieb evtl. die Hoffnung zu nehmen wenn das Auto immer nur kurz anspringt.

Beim Betätigen des letzten Tasters (S3) während M1 für 5s und S1 auf HIGH gesetzt ist, soll der Motor (M1) die permanente Freigabe bekommen

Beim Entfernen des Autoschlüssels wird S1 auf LOW gesetzt und die Bedingung fängt von vorne an.

@postmaster-ino
Bei der Beschreibung oben, habe ich immer nur den Status erklärt bei dem etwas passieren soll. Muss ich in der Programmierung auch alle Bedingungen mit programmieren wo "nichts" passieren soll??

MfG

Muss ich in der Programmierung auch alle Bedingungen mit programmieren wo "nichts" passieren soll??

Du möchtest eine Ablaufsteuerung bauen.
Einen deterministischen endlichen Automaten.

Dazu malst du dir ein Diagramm mit allen möglichen Zuständen.
Dann malst du alle möglichen Zustandsübergänge mit ihren Bedingungen da rein.

Das ist die Vorlage für deinen Automaten.
In Software gießen, und fertig ist das Dingen.

Und nein, dein Programm verstehe ich nicht.

  if (digitalRead (S1) == HIGH && digitalRead(VarianteOneStatus) == HIGH && digitalRead(S3) == HIGH)

Da hörts bei mir schon auf.

Aus mehren Gründen!
Alle "== HIGH" können weg.

Wie kommst du auf digitalRead(VarianteOneStatus) ?
Ich sehe da keinen Pin, welchen man auslesen könnte.

So wie ich das lese, wird bei einer Fehlfunktion/Ausfall deiner Bastelei der Motor abgestellt, mit allen Begleiterscheinungen wie Ausfall der Servolenkung, Bremskraftverstärker, etc.

Ist dir klar, was du da für ein Risiko eingehst?

Ausfall dieser Art vom Elektronik im Kfz ist nicht selten.