Go Down

Topic: Impulse erfassen und zum Schalten verwenden??? (Read 707 times) previous topic - next topic

mx738

Hallo zusammen,

ich steh eben total auf dem Schlauch...
Wie bekomme ich es es hin das Arduino Impulse eines Durchflussmessers prüft und sobald keine Impulse mehr kommen einen Ausgang schaltet.
Das die Impulse je nach Durchflussmenge unterschiedlich sind komme ich grad nicht weiter wie ich das am besten hin bekommen.
Wenn 30 Sekunden lange keine Impulse mehr ankommen, einen Ausgang zu schalten.
Kann mir jemand den Wald zeigen den ich vor lauter Bäumen nicht mehr sehe?

Serenifly

Einen Zähler oder Timer programmieren der dir jede Sekunde von 30 runter zählt. Wenn ein Impuls kommt wieder auf 30 setzen. Und dann auf 0 abfragen. Oder anders herum.

uwefed

interrupt der vom Durchflußmesser ausgelöst wird und der den millis() in einer unsigned long Variablen abspeichert und dann im loop die Zeit zwischen abgespeicherten Wert und aktuellen millis() Wert kontrollieren. Falls größer als 30000 dan Ausgang schalten. Das funktioniert für Zeiten ohne Impulse von ca 49,5 Tagen.

grüße Uwe

mx738

Mit den Timern hab ich nocht nicht viel gemacht.
Ein Beispiel habt Ihr nicht zufällig?

Serenifly

#4
Jul 06, 2013, 10:01 pm Last Edit: Jul 06, 2013, 10:54 pm by Serenifly Reason: 1
Nimm den Vorschlag von uwefed. Das ist einfacher, da du dir einen Schritt sparst. Ist eigentlich offensichtlich, aber daran dass man konsequent millis() verwenden sollte muss ich mich noch gewöhnen. Dabei habe ich in meinem aktuellen Projekt eine Routine, die das LCD ausschaltet wenn 60 Sekunden lang nichts gedrückt wurde. Das ist das gleiche  :smiley-roll:

Code: [Select]

volatile unsigned long lastPulse = millis();

void setup()
{
     attachInterrupt(0, interrupt, RISING);   //0 = DigitalPin 2, 1 = DigitalPin 3
}

void loop()
{
    if(millis() - lastPulse > 30000)
    {
        //mach was
    }
}

void interrupt()
{
    lastPulse = millis();
}


Wobei millis() in Interrupt-Routinen nicht richtig updatet, da die Systemuhr selbst mit einem Interrupt läuft. Bei solch langsamen Ereignissen wie hier sollte das keine Rolle spielen, aber es ist nichts wenn man Präzision will.


uwefed

#5
Jul 06, 2013, 10:48 pm Last Edit: Jul 06, 2013, 10:50 pm by uwefed Reason: 1
Ich würde noch etwas hinzufügen.

Code: [Select]
void loop()
{
     if(millis() - lastPulse > 30000)
     {
         //setze LED
         //mach was
     }
    else
    {
        // lösche LED
    }
}

Grüße Uwe

mx738

Ich habe das jetzt so übernommen und die LED eingetragen um zu sehen was passiert.
Leider geht die LED nicht an???

volatile unsigned long lastPulse = millis();
const int ledPin =  13;      // the number of the LED pin
int ledState = LOW;   

Code: [Select]
void setup()
{
  attachInterrupt(0, interrupt, RISING);   //0 = DigitalPin 2, 1 = DigitalPin 3
  pinMode(ledPin, OUTPUT);
}

void loop()
{
     if(millis() - lastPulse > 1000)
     {
         ledState = LOW;       
       }
     else
     {
       ledState = HIGH;
     }
}

void interrupt()
{
     lastPulse = millis();
}

MGOS

Natürlich musst du die LED noch mit digitalWrite() anmachen.
Dein loop sollte dann z. B. so aussehen:

Code: [Select]
void loop()
{
     if(millis() - lastPulse > 1000)
     {
         ledState = LOW;       
       }
     else
     {
       ledState = HIGH;
     }
     digitalWrite(ledPin,ledState);
}


mx738

Jetzt hab ich doch noch eine Frage.
Läuft der Code auch in einem ATTiny 85?
Bei der Datei die den ATTiny Support in der Arduino IDE herstellt, kann ich zwar was zum millis() finden aber nix zum Interrupt Support. Lauten Datenblatt hat der ATTiny 85 aber Interrupt Eingänge.
Geht der Code somit trotzdem in ATTIny 85?

Go Up