bei Eingang LOW zeit verzögert Ausgang auf HIGH...Anfänger

Hallo liebe Leute, ich habe da mal eine Frage. Ich bastel gerade an einer Zündung für einen 2 Takt Motor. Soweit habe ich es auch hinbekommen das ich bei Eingang LOW an einem Ausgang HIGH bekomme und der Motor läuft. Wie kann ich da jetzt eine Verzögerung einbauen? Also bei Eingang LOW das Zündsignal auf spät verstellen also etwas verzögert... Bitte gebt mir ein Codebeispiel. Ich fange gerade an und bastel mir aus verschiedenen Sachen etwas zusammen. Ich weiß das es entweder etwas mit millis oder micros zu tun hat aber ich weiß nicht wie ich das in den Code bastel. Ich danke euch für eure Hilfe

Lieben Gruß Heiko

Da Du 2 Zylinder steuern willst, mußt Du mit millis() oder mikros() abrbeiten, wie Du schon richtig erkannt hast.
Hast Du Vorstellungen, um wieviel Du verzögern willst (von 0 bis ???).
Schjau Dir BlinkWithoutDelay an, um erst mal ein Gefühl für die Zeitsteuerung zu bekommen. Als Erläuterung ist manchmal die Nachtwächtererklärung sinnvoll.

Woher kommt Dein Eingangssignal?

Gruß Tommy

Hallo, nein es ist ein 1 Zylinder 2 Takt Motor. Also eigentlich ein Go Kart. Nun möchte ich das Zündsignal so weit nach hinten verschieben das der Motor nicht über eine bestimmte Leistung kommt, damit mein Kind nicht die volle power hat wenn er drin sitzt. Es gibt zwar auch andere Lösungen, allerdings läuft da der Motor unrund und der Auspuff verölt.
Wie viel Zeitverzögerung ich brauche muss ich erst noch ausrechnen. Mir geht es in erster Linie darum wie ich diese Verzögerung in meinen Sketch einbaue. Da ich echt blutiger Anfänger bin kann ich mit dem Beispiel welches genannt wurde nicht viel Anfangen. Dieses habe ich mir schon angeschaut und werde nicht ganz Schlau daraus. Hier mal mein Code, vielleicht kann mir jemand verraten wie ich da diese Verzögerung einbaue...

const int Eingang = 2;                        // Pin 2 ist Eingang für Sensor

long previousMicros = 0;
long interval = 60000;


void setup() {
  pinMode(2, INPUT);                    // Eingangspin auf Eingang stellen
  digitalWrite(2, HIGH);   // und Pullup-Widerstand einschalten
  pinMode(3, OUTPUT);
  Serial.begin(9600); // start serial
  digitalWrite(3,LOW);
  delay (2000);

  attachInterrupt(0, readmicros, FALLING );    // Interrupt 0 auf Routine readmillis setzen
  // reagiert auf steigende Flanken an Pin 2
}

// ein paar variablen definieren
volatile unsigned long dauer = 0;             // microsekunden seit dem letzten Interrupt
volatile unsigned long last = 0;              // Zählerwert beim letzten Interrup
long drehzahl;                                // selbstredend
char buf[17];                                 // Pufferstring für sprintf


void loop() {  

 {
     
  
  // Hauptprogramm
  drehzahl = 60000000 / dauer;                // Drehzahl ausrechnen und
  sprintf(buf, "RPM %4lu   ", drehzahl);      // als 4stellig formatierte Zahl in den Puffer schreiben
 
 Serial.println(buf);                           // Puffer ausgeben
 
 if (digitalRead(2) == LOW )digitalWrite(3,HIGH);
 
 if (digitalRead(2) == HIGH )digitalWrite(3,LOW);

      
}

}


void readmicros() {                           // Interrupt-Routine
  detachInterrupt(0);                         // Interrupt ausschalten damit er uns nicht beißt
  unsigned long m = micros();                 // Microsekundenzähler auslesen
  unsigned long v = m - last;                 // Differenz zum letzten Durchlauf berechnen
  if (v > 5000) {                             // ignorieren wenn <= 5ms (Kontaktpreller)
    dauer = v;                                // Wert in dauer übernehmen
    last = m;                                 // und wieder den letzten Wert merken
  }
  attachInterrupt(0, readmicros, FALLING );    // Interrupt wieder einschalten.
}

Diesen Code habe ich aus dem Internet um die Drehzahl zu ermitteln. Wie gesagt ich bin blutiger Anfänger... Danke euch schon mal...

Heiko

Wenn es nur ein Zylinder ist und der Arduino nichts anderes machen soll, kannst Du auch mit Deley(miillisekunden) oder delayMicroseconds(mikrosekunden) arbeiten, was erst mal einfacher ist.
Aber die Bedingungen: Nur 1 Zylinder und nichts Anderes tun beachten.

Dann gibst Du Deine errechete Verzögerung als Variable an eine der beiden Funktionen.
Zum Ermitteln der Werte dürfte das sowieso der einfachste Weg sein.

Gruß Tommy

Ja der Arduino macht nix anderes als das. Tommy kannst du mir evtl. noch kurz ein Beispiel geben mit der If Bedingung? Das wäre super lieb. Dann werde ich das mal testen und berichten. Den Code siehst du ja mit dem if high etc. Daaaaaaaaaanke

Ich bin mir nicht sicher, ob der Arduino in dieser Umgebung überhaupt zuverlässig arbeitet. Das solltest du vorher hardwaremässig austesten, bevor du dich an die Zündzeitpunktverstellung machst.

Also funktionieren tut es schon mal so mit diesem Code. Also Arduino noch am Schlappi angeschlossen und den Eingangspin mit Schaltung an dem Pickup ( Hallsensor) und den Ausgangspin an die CDI Zündung. So läuft das erstmal. Also denke ich das das mit entsprechender Step Down Elektronik auch am Boardnetz laufen sollte. Das kommt dann aber später. erstmal muß ich diese Verzögerung einbauen. Der Zündzeitpunkt wandert ja auch in Abhängigkeit zur Drehzahl. erstmal möchte ich wissen wie man das in dem Code einbaut den Rest werde ich durch Try and error herausfinden. Aber schon mal danke für die Antworten....

Ich bezweifle daß ein Arduino in dieser Umgebung sicher funktioniert.
Grüße Uwe

Ich weiß natürlich nicht ob das dann so problemlos funzt. Zur not nehme ich dann einen Akku. Hauptsache das läuft.

Was Deinem Sketch noch fehlt, ist die Berechnung der Verzögerung abhängig von der Drehzahl.
Das kann ich Dir aber nicht schreiben, da ich von diesen Zusammenhängen keine Ahnung habe.

Gruß Tommy

da ich von diesen Zusammenhängen keine Ahnung habe.

Als KFZi habe ich da etwas Ahnung.

Und auch schon einige Richtigtakter auf dem Prüfstand gehabt.

Wenn man die Wahl hat, dann:

Zum leichten starten, sollte der ZündZeitPunkt(ZZP) auf OT, oder auf etwas später stehen.

Im Leerlauf, sind ca 3° bis 7° Frühzündung angemessen.

Dann sollte der ZZP mit steigender Drehzahl Richtung früher gehen.
Mit dem erreichen des Resonanzbereiches, sollte der ZZP sich wieder Richtung Spät absenken.
Bei Drehzahlen über der Resonanz, wieder früher werden.

Die Verstellkurve sollte also einen deutlichen Sattel im Bereich der Resonanz aufweisen.

Das Ganze ist natürlich extrem von den verwendeten Komponenten abhängig.