Ketten Öler für mein Motorrad

Hallo, ich habe vor einiger Zeit mit euer Hilfe mein so ziemlich erstes Arduino Projekt gestartet.
Welches Dank der großartigen Hilfe von euch auch zumindest theroretisch funktioniert.
Leider finde ich den Beitrag nicht mehr, deshalb fange ich mal von neuen an.

Das Prinzip ist sehr einfach nach Anzahl X reedkontaktimpulen für 300ms Spannung an die Pumpe und dann alles wieder von vorne.
Der Code klappt wirklich klasse, aber leider bremst mich der Befehl “delay”.
Denn das Programm stopp ja für 300ms, dadurch gehen einige Radimpulse verloren.

Ich habe es mit millis versucht. aber das klappt leider nicht da er ja nur die akt. zeit und vergangene zeit verwendet.
Ich brauche quasi einen Befehl der startet wenn die Pumpe bestromt wird und dann 300ms nach unten zahlt und die pumpe wieder abschaltet.
Also kurz gesagt soll eigentlich nur für 300ms Spannung an der pumpe anliegen ohne das, dass Programm stoppt

Ich hoffe ich habe mich halbwegs gut ausgedruckt.

Ich denke das ist für euch sicherlich kinderleicht, aber ich komme einfach auf keine funktionierende Idee

anbei noch der Code:

// Variablen
int schaltmodus = 1;              // Variable für die verschiedenen Schaltmodis (Start auf Modus 1 normal Modus)
int tasterStatus = LOW;           // Variable zu speichern des Tasterstatus
const int tasterPin = 11;         // Taster an Pin 2 angeschlossen
int taster = 7;                   // Oiltaster auf PIN 7
int tasterstatus = HIGH;
const int reedpin = 5;            // Reedkontakt Eingangspin
const int pumpe = 9;              // Zum Pumpenrelais derzeit noch eine LED auf PIN 9
bool reedkontaktzustand = HIGH;
bool lastreedkontaktzustand = LOW;
int programmLED1 = 2;
int programmLED2 = 3;             // Programm Status LEDs
int programmLED3 = 4;
int zaehler = 0;
int zaehlerregen = 0;
unsigned long previousMillis = 0;


void setup()
{
  pinMode(tasterPin, INPUT);      // Setzt den TasterPin als Eingang

  pinMode(taster, INPUT);         // Oeltaster
  // der pumpen/LED ausgang:
  pinMode(pumpe, OUTPUT);         // Pumpen Ausgang
  // der Reedkontakt eingang:
  pinMode(reedpin, INPUT);        // reedkontakt EINGANG

  pinMode(programmLED1, OUTPUT);
  pinMode(programmLED2, OUTPUT);   // Programm LEDs Ausgaenge
  pinMode(programmLED3, OUTPUT);
  reedkontaktzustand = digitalRead(reedpin);
  lastreedkontaktzustand = reedkontaktzustand;
  Serial.begin(9600);
}


void loop()
{
  // Abfrage ob der Taster gedrückt ist
  tasterStatus = digitalRead(tasterPin);

  // Wenn Taster gedrückt ist...
  if (tasterStatus == HIGH)
  {
    // Schaltmodus +1 (immer einen hoeher schalten
    Serial.println(schaltmodus++);
    delay(300);       // 300ms warten

  }

  //+++++++++++++++ SCHALTPROGRAMME +++++++++++++++++

  // Modus 0 = Alles AUS
  if (schaltmodus == 0)
  {
    digitalWrite(programmLED1, 0);                // Programmstatus LED an
    digitalWrite(programmLED2, 0);
    digitalWrite(programmLED3, 0);
    digitalWrite(pumpe, LOW);
  }

  // Modus 1 = Normalmodus (schoenwetter)
  else if (schaltmodus == 1)
  {

    digitalWrite(programmLED1, 0);               // Programmstatus LED an
    digitalWrite(programmLED2, 0);
    digitalWrite(programmLED3, 255);

    lastreedkontaktzustand = reedkontaktzustand;
    reedkontaktzustand = digitalRead(reedpin);

    if (lastreedkontaktzustand == LOW && reedkontaktzustand == HIGH) //wenn lastreed low und reed high ...weiter
    {
      //Serial.println(lastreedkontaktzustand);     // serialausgabe lastreed
      //Serial.println(reedkontaktzustand);         // serial ausgabe reed
      Serial.println(zaehler++);                 // zaehler um 1 erhöhen mit serial ausgabe

    }

    if (zaehler == 15)  // bis 15 hochzählen
    {
      digitalWrite(pumpe, HIGH);   //pumpe an
      delay(300);                 //delay 300ms
      digitalWrite(pumpe, LOW);    //pumpe aus
      zaehler = 0;
    }
  }

  // Modus 2 = Regenmodus
  else if (schaltmodus == 2)
  {
    digitalWrite(programmLED1, 0);                // Programmstatus LED an
    digitalWrite(programmLED2, 255);
    digitalWrite(programmLED3, 0);

    // lese den status vom reedkontakt
    lastreedkontaktzustand = reedkontaktzustand;
    reedkontaktzustand = digitalRead(reedpin);

    if (lastreedkontaktzustand == LOW && reedkontaktzustand == HIGH) //wenn lastreed low und reed high ...weiter
    {
      //Serial.println(lastreedkontaktzustand);     // serialausgabe lastreed
      //Serial.println(reedkontaktzustand);         // serial ausgabe reed
      Serial.println(zaehlerregen++);                 // zaehler um 1 erhöhen mit serial ausgabe

    }

    if (zaehlerregen == 5)   // bis 30 hochzählen
    {
      digitalWrite(pumpe, HIGH);   //pumpe an
      delay(300);                 //delay 300ms
      digitalWrite(pumpe, LOW);    //pumpe aus
      zaehlerregen = 0;            // zaehlerregen reseten
    }
  }


  // Modus 3 = Pumpe per Taster schalten
  else if (schaltmodus == 3)
  {
    digitalWrite(programmLED1, 255);                // Programmstatus LED an
    digitalWrite(programmLED2, 0);
    digitalWrite(programmLED3, 0);
    digitalWrite(pumpe, LOW);
    tasterstatus = digitalRead(taster); // Oiltasterstutus auslesen
    if (tasterstatus == HIGH)

    {
      Serial.println(tasterstatus);
      digitalWrite(pumpe, HIGH);          // Pumpe einschalten
      delay (150);                        // 150ms warten
      digitalWrite(pumpe, LOW);           // Pumpe Ausschalten
    }
  }


  // Anzahl der Schaltmodis auf 3 begrenzen. (0 bis 4)
  else
  {
    schaltmodus = 0;
  }
}

Das geht doch mit millis ganz einfach.
Wenn Du die Pumpe anschaltest merkst Du dir die Millis in startmillis (ist sonst lastmilllis oder so ähnlich) und wenn 300 millis vorbei sind, schaltest Du die Pumpe wieder aus.

Gruß Tommy

Ich habe es zuletzt so versucht:

aber das ganze klappt iwie nicht bei mir es passiert zwar was, aber nicht das was ich möchte
ich blicke einfach dieses millis system nicht.
obwohl ich mir schon auf einigen seiten beispiele angesehen habe
hier kurz nur ein ausschnitt:

if digitalWrite(pumpe, HIGH);   //pumpe an
{   
     if (millis() - previousMillis > Wartezeit) {
          Alterwert +=1;
          previousMillis = millis();
          digitalWrite(pumpe, LOW);    //pumpe aus
          zaehler = 0;
}}

So wird das auch nichts. Schau Dir mal die Nachtwächtererklärung an, um millis zu verstehen.
Wenn Pumpe an, dann setzt Du previousMillis = millis();

Und außerhalb dieser Abfrage im Loop checkst Du ob Du abschalten musst.
if (millis() - previousMillis > Wartezeit)

Ich poste bewußt keinen kompletten Code, damit Du lernst, millis zu verstehen, nicht nur zu kopieren.

Gruß Tommy

PhyniX:
Leider finde ich den Beitrag nicht mehr, deshalb fange ich mal von neuen an.

Meinst Du den: Selbstbau Simple Ketten Oiler für Motorrad

Du (und ich auch) kannst in Deinem Profil alle Deine Beiträge ansehen.

PhyniX:
aber das ganze klappt iwie nicht bei mir ...

Wie Tommy schrieb, ist millis() Dein Freund. Am besten formulierst Du das, was Du möchtest, in Form eines „endlichen Automaten“. Evtl. ist ja nützlich, was mir dazu eingefallen ist.

Gruß

Gregor

Ich frage mal den TO aus technischem Interesse: Ist das Ölen während der Fahrt überhaupt notwendig?
Meine Erfahrungen beziehen sich allerdings auf eine MZ TS 250 von vor einigen Jahrzehnten. Da war das nicht notwendig.

Gruß Tommy

@ Tommy56
Es gibt herkömmliches Kettenspray das wird einfach auf die kette gespüht und immer mal wieder gereinigt und neu aufgesprüht.

Dann würden diese Chainoiler (Kettenöler) erfunden die nach gewisser zeit einen tropfen spezial öl mit hilfe einer pumpe auf die kette tropfen. das hat den großen Vorteil das die Kette immer richtig geschmiert ist und dadurch teilweise mehr als doppelt so lange halten.

Erst einmal danke euch beiden:)
Das mit dem Automaten ist echt klasse, aber bis ich das hinbekommen würde ist der sommer zuende lach

@agmue
Genau der war es. Aber danke für den hinweis, werde mal gucken wo genau das ist.

Das mit dem millis möchte nicht so richtig in meinen Kopf.
Die Anleitung mit dem Nachtwächter ist echt klasse, nur möchte mir umsetzung auf mein Projekt noch nicht so richtig in mein Kopf.

Werde wohl erstmal schluss für heute machen mein Kopf raucht schon vor lauter lesen und ausprobieren.:wink:

Danke für Deine technischen Infos.

Gruß Tommy

PhyniX:
Werde wohl erstmal schluss für heute machen mein Kopf raucht schon vor lauter lesen und ausprobieren.:wink:

Super Idee :slight_smile:

Meiner Meinung nach gibt es keine besseren Quellen für gute Ideen als Schlaf und Blödelei.

Gruß

Gregor

Du hattest geshrieben:
Und außerhalb dieser Abfrage im Loop checkst Du ob Du abschalten musst.
if (millis() - previousMillis > Wartezeit)

wo soll diese denn hin ? bzw. ich habe ja lauter Abfragen.

habe quasi jetzt erst mal so angefangen:
denke das das erstmal so richtig ist oder ?

digitalWrite(pumpe, HIGH); //pumpe an
previousMillis = millis(); //delay 300ms
digitalWrite(pumpe, LOW); //pumpe aus
zaehler = 0;

Wenn Du ausgeschlafen hast, kannst Du im Forum nach "agmue anleitung" suchen, dann findest Du mein Geschreibsel zum Thema. Möglicherweise ist ja was dabei, bei dem es bei Dir "Klick" macht.

Also zum Beispiel so:

// globale Variable Wenn pumpe läuft
boolean isPumpeAn = false;

// im Loop
if (deine Bedingung)   //pumpe an
{  
          digitalWrite(pumpe, HIGH);
          previousMillis = millis();
          isPumpeAn = true; 
          // hier Deine Pumpensteuerung
}
if (isPumpeAn && millis() - previousMillis >= dauer) {
   // pumpe aus
   isPumpeAn = false; 
   digitalWrite(pumpe, LOW);   
}

Gruß Tommy

@Tommy56
Dein Beispiel klang irgendwie logisch und habs sofort heute morgen integriert nach ein paar Anpassungen läuft es jetzt genau so wie es soll vielen Dank.

Jetzt gehts weiter in der Nacht sind mir noch paar Einfälle gekommen die ich auch gleich mit einbaue :slight_smile:

@TE
Hättest du mal im Forum nach Kettenöler gesucht, dann hättest du dort mein Projekt gefunden. Da kannst du dir vieles als Beispiel anschauen.

Meine aktuelle Version der Pumpe: noxmatic/Pump.h at master · TelosNox/noxmatic · GitHub

Kleiner Tip: Nicht im IF berechnen ob die vergangene Zeit > als die Wartezeit ist. Sondern da, wo du dir die letzten millis merkst nicht die millis merken sondern millis + Wartezeit. Dann musst du nur noch auf ">" vergleichen, das ist dann performanter.